Benoit Simard (@logisima)
Dépendant aux graphes
Libérateur de données
Développeur Web
Consultant chez Neo4j
A la base de théorie des graphes par Léonard Euler au 18e
La modélisation en graphe est ultra intuitive
On utilise du graphe tous les jours
File System
GPS - chemin le plus court
Moteur de recherche - Page Rank
La recommandation : filtrage collaboratif
Les indexes en base de données - Binary Search Trees
Big Data : DisinfoLab sur Benalla avec la détection de communautés
GraphQL est une spécification de langage
Un langage de requête pour vos APIS
Développer par Facebook (iOS team)
Langage déclaratif, où vous définissez les champs que vous souhaitez
Auto-documenté (basé sur un schéma typé)
Alternative à REST
“A query language for your API, and a server-side runtime for executing queries by using a type system you define for your data”
“GraphQL isn’t tied to any specific database or storage engine”
“A GraphQL service is created by defining types and fields on those types, then providing resolver functions for each field on each type”
Type : La définition de votre modèle
Query : La liste des fonctions disponibles pour la lecture
Mutations : La liste des fonctions disponibles pour l’écriture
C’est une fonction où vous codez comment récupérer la donnée
obj : Le résultat de l’objet parent. Dans le cas de la recommandation, ce sera l’objet film.
params : La liste des arguments passée aux fonctions.
context : Objet partagé par tous les resolvers d’une même requête
resolverInfo : Réservé pour les usages avancés
Typage des éléments
C’est un langage de requête : vous définissez le retour que vous souhaitez !
Une seule requête au lieu de X : le modèle est un graphe et vos requêtes aussi
Tout est fait en POST dans un body sur un unique endpoint
Tout est défini dans un schéma faisant l’interface entre le client/serveur
Le système de typage est fort
MAIS :
pas de XML
facile à implémenter
focaliser sur les données (non service)
agnostique sur la technologie
de Sacha Greif.
Namely, you need one schema for your database, and another one for your GraphQL endpoint.
Your database and GraphQL API will have different schemas, which translate into different document shapes.
Un schema pour la base
Un schéma pour GraphQL
Une fonction de transformation
Il faut une base qui gère le modèle de GraphQL
Les bases relationnelles et graphes
Noeuds
Les entités du model
Peuvent avoir des labels
Peuvent avoir des propriétés
Relations
Lient deux noeuds entre eux, avec une direction
et un type
Peuvent avoir des propriétés
Première règle de GraphQL : tout commence et finit par le schéma !
Permet de gérer toutes les données de la base, grâce a la définition d’un schéma GraphQL (auto-généré ou fourni).
Neo4j génère automatiquement les queries
Movie(movieId, title, released, …, first, offset, _id, orderBy, filter): [Movie]
Tous les champs du type sont définis dans la query, pour un controle d’égalité
filter
vous permet de réaliser des filtres plus complexes
orderBy
pour trier vos résultats
first
& offset
pour la pagination
Neo4j génère automatiquement les mutations
vous pouvez aussi surcharger leurs comportements
This is by no means an issue exclusive to GraphQL apps, but it’s true that they generally require you to write a lot of similar boilerplate code.
On one hand you want to take full advantage of GraphQL’s graph traversal features (“show me the authors of the comments of the author of the post of…” etc.). But on the other hand, you don’t want your app to become slow and unresponsive.
Désolé j’ai pas assez de place pour les jointures :)
Au sens propre et figuré
C’est un peu barbar mais il y a plus simple, attendez un peu :)
Imagine a list of posts, each of which has a user attached to it. You now want to display 10 of these posts, along with the name of their author.
Une requête pour avoir la liste des posts
Une requête par post
pour récupérer les auteurs
Cette unique requête GraphQL fait 11 appels à la base !!!
Batche les requêtes et met en place un système de cache sur les objets basés sur leurs ID
.
Et laisser la base se débrouiller toute seule, c’est son job non ?
Une requête en Cypher
SQL du Graph
Langage déclaratif
Développer par Neo4j en 2013
open-source depuis 2016 (opencypher)
Implémenter dans Neo4j, SAP Hana, Redis, AgensGraph, …
Est en cours standardisation (https://gql.today/)
Same, same … but different
“A set of tools designed to leverage GraphQL and work together to create a great workflow”
Intégration avec les framework frontend
Politique de cache
Génération de code
Création du schema avec ses resolvers
Mocking
Monitoring