web-dev-qa-db-fra.com

Prise en charge de la fonction d'agrégation dans GraphQL

Je suis très intéressé par GraphQL pour une solution analytique (pensez à une webapp affichant des graphiques). Mais je ne trouve aucun exemple de GraphQL utilisant la fonction d'agrégation. C'est un aspect principal de la plupart des requêtes effectuées par mon frontend.

Pour ma solution, nous avons 3 appels backend typiques.

  1. Chercher
  2. Agrégat
  3. Des séries chronologiques

Disons que ce type est spécifié dans GraphQL

type Person {
  name: String
  age: Int
  create_time: Date
}
  1. Chercher

Cela semble être bien géré par GraphQL. Pas de question ici.

ex. Rechercher l'âge de la personne nommée Bob {Personne (nom: "Bob") {age}}

  1. Agrégat

C'est le cas typique où je veux afficher les informations dans un graphique à secteurs. Disons que je veux compter le nombre de personnes par âge.

Voici la requête PostgreSQL:

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

Quel serait l'équivalent dans GraphQL?

  1. Séries temporelles C'est le cas typique où je veux afficher les informations dans un graphique à barres avec l'axe X comme heure.

ex. Disons que je veux compter le nombre d'utilisateurs créés par heure.

Voici la requête 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;

Quelle serait la requête équivalente GraphQL?

22
Damien

GraphQL, à la fin de la journée, répond avec vos types définis. Vous avez juste besoin de mettre ces données dans un type. Que ce soit un type spécifique pour ces différentes requêtes, ou des champs pour ces données sur les types existants, c'est à vous de décider, mais c'est tout. GraphQL nécessite plus d'efforts à l'avance en termes de définition de vos types et de ce que toutes les requêtes retourneront, ce qui le rend plus rigide, mais l'idée est que de l'autre côté de cela se trouvent des fonctionnalités intéressantes, comme l'introspection et la vérification de type. S'il ne semble pas logique de mettre ce type de structures de données "ad hoc" dans un type GraphQL, il n'est pas illégal d'avoir des points de terminaison non GraphQL si vous avez besoin d'autres sources de données.

13
Ryan

@Damien, ces problèmes ne sont pas les problèmes de GraphQL.

Chaque fois que vous voulez faire quelque chose dans GraphQL, vous devez définir un Type de données de retour , Spécification de la fonction que vous implémentez , et parfois un Type de données d'entrée à alimenter dans votre fonction. Enfin, vous écrivez du code pour faire le travail.

En fait, il semble que vous (ré) écrivez votre code en langage GraphQL.

Prenez l'exemple où vous souhaitez afficher les informations dans un graphique à secteurs:

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

Définissez vos données de retour voici une liste d'âge et de nombre:

 type TickGroupByAge {
      age: Int
      count: Int
    }

Définissez votre fonction ou requête en langage GraphQL:

getTicketGroupByAge : [TickGroupByAge]`

Enfin, écrivez une fonction pour implémenter la requête ci-dessus:

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

@Ryan Je suis totalement d'accord avec vous que GraphQL vous oblige à écrire beaucoup de définitions de types pour résoudre une tâche simple. Pour cette raison, j'ai fini par construire mon propre NextQL - moteur GraphQL qui est similaire à GraphQL mais plus simple.

Mon projet prend en charge des définitions de types imbriquées complexes, qui vous libèrent de la définition de nombreuses définitions inutiles.

9
Giap Nguyen

Découvrez https://github.com/niclasko/Cypher.js (note: je suis l'auteur)

En rapport avec la question. Il peut être utilisé pour interroger et agréger des données à partir de points de terminaison JSON:

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

Il y a même une fonction de graphique à barres:

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

Voici un exemple d'interrogation d'un document JSON complexe et d'exécution d'une analyse agrégée sur celui-ci:

exemple de requête JSON Cypher.js