Поддержка агрегатной функции в GraphQL

Меня очень интересует GraphQL для аналитического решения (подумайте о графике отображения webapp). Но я не могу найти примеры GraphQL, используя функцию aggregate. Это основной аспект большинства запросов, выполненных моим интерфейсом.

Для моего решения у нас есть 3 типичных внутренних вызова.

  • Поиск
  • Совокупный
  • Временной ряд

Скажем, у нас этот тип указан в GraphQL

type Person {
  name: String
  age: Int
  create_time: Date
}
  • Поиск

Это, по-видимому, хорошо обрабатывается GraphQL. Здесь нет вопросов.

ех. Поиск возраста человека по имени Боб { Лицо (имя: "Боб" ) {   возраст } }

  1. Совокупный

Это типичный случай, когда я хочу отображать информацию в круговой диаграмме. Поэтому позвольте сказать, что я хочу подсчитать количество человек по возрасту.

Здесь будет запрос PostgreSQL:

SELECT age, count(*) from Ticket group by age;

Каким будет эквивалент в GraphQL?

  1. Временной ряд Это типичный случай, когда я хочу отображать информацию в BarChart с осью X как время.

ех. Скажем, я хочу подсчитать количество созданных пользователей в час.

Здесь будет запрос PostgreSQL:

SELECT date_trunc('hour', create_time) as create_time_bin, count(*) from Person group by create_time_bin order by create_time_bin ASC;

Каким будет эквивалентный запрос GraphQL?

Ответ 1

GraphQL, в конце дня, отвечает вашими определенными типами. Вам просто нужно поместить эти данные в тип. Является ли это конкретным типом для этих разных запросов или полями для этих данных на существующих типах, это зависит от вас, но все это сводится к минимуму. GraphQL требует больше усилий с точки зрения определения ваших типов и возврата всех запросов, что делает его более жестким, но идея в том, что с другой стороны это некоторые интересные функции, такие как интроспекция и проверка типов. Если не представляется логичным смысл помещать такие типы данных "ad hoc" в тип GraphQL, то не обязательно иметь конечные точки не-GraphQL, если вам нужны другие источники данных.

Ответ 2

@Damien, эти проблемы не являются проблемами GraphQL.

Всякий раз, когда вы хотите что-то сделать в GraphQL, вы должны определить тип возвращаемых данных, спецификацию реализуемой вами функции и иногда тип входных данных для подачи в вашу функцию. Наконец вы пишете код, чтобы сделать работу.

На самом деле, похоже, что вы (пере) пишете свой код на языке GraphQL.

Возьмите пример, где вы хотите отобразить информацию в круговой диаграмме:

SELECT age, count(*) from Ticket group by age;

Определите ваши данные возврата здесь список возраста и количество:

 type TickGroupByAge {
      age: Int
      count: Int
    }

Определите свою функцию или запрос на языке GraphQL:

getTicketGroupByAge : [TickGroupByAge]'

Наконец, напишите функцию для реализации вышеуказанного запроса:

async function(){
    const res = await client.query("SELECT age, count(*) from Ticket group by age");
    return res.rows;
}

@Ryan Я полностью согласен с вами, что GraphQL заставляет вас писать множество определений типов для решения простой задачи. По этой причине я закончил создавать свой собственный движок, похожий на GraphQL, на NextQL, который похож на GraphQL, но проще.

Мой проект поддерживает сложные определения вложенных типов, которые освобождают вас от определения множества бесполезных.

Ответ 3

Проверьте https://github.com/niclasko/Cypher.js (примечание: я автор)

С актуальностью к вопросу. Его можно использовать для запроса и агрегирования данных с конечных точек JSON:

load json from "http://url/person" as l return l.age, count(1)

Theres даже функция гистограммы:

load json from "http://url/person" as l return barchart(toint(l.age)) as age_distribution

Вот пример запроса сложного документа JSON и выполнения над ним совокупного анализа:

Пример запроса JSON Cypher.js