Neo4j - Langage de requête Cypher vs Gremlin

102

Je commence à développer avec Neo4j en utilisant l'API REST. J'ai vu qu'il y avait deux options pour effectuer des requêtes complexes - Cypher (le langage de requête de Neo4j) et Gremlin (le langage de requête / traversée de graphes à usage général).

Voici ce que je veux savoir - y a-t-il une requête ou une opération qui peut être effectuée à l'aide de Gremlin et qui ne peut pas être effectuée avec Cypher? ou vice versa?

Cypher me semble beaucoup plus clair que Gremlin, et en général, il semble que les gars de Neo4j vont avec Cypher. Mais - si Cypher est limité par rapport à Gremlin - j'aimerais vraiment le savoir à l'avance.

Rubinsh
la source
1
Cypher est un langage déclaratif complet non turing. Gremlin est un wrapper sophistiqué sur l'API Java Neo4j et est impératif. Clairement, il y a des choses possibles à faire en gremlin que vous ne pouvez pas en chiffrer.
Prakhar Agrawal
1
Apache Spark 3 inclura Cypher, ce qui en dit long sur leur opinion à ce sujet.
Walker Rowe

Réponses:

77

Pour les requêtes générales, Cypher est suffisant et est probablement plus rapide. L'avantage de Gremlin par rapport à Cypher est lorsque vous entrez dans la traversée de haut niveau. Dans Gremlin, vous pouvez mieux définir le modèle de parcours exact (ou vos propres algorithmes) alors que dans Cypher, le moteur essaie de trouver la meilleure solution de traversée lui-même.

J'utilise personnellement Cypher en raison de sa simplicité et, à ce jour, je n'ai pas eu de situations où j'ai dû utiliser Gremlin (sauf travailler avec les fonctions d'import / export de Gremlin graphML). Je m'attends cependant à ce que même si je devais utiliser Gremlin, je le ferais pour une requête spécifique que je trouverais sur le net et que je ne reviendrais jamais.

Vous pouvez toujours apprendre Cypher très rapidement (en jours), puis continuer avec le général Gremlin (à plus long terme).

ulkas
la source
2
Il y a un nouveau tutoriel en ligne commençant sur neo4j.org/learn/cypher pour que vous puissiez vous y mettre également.
Peter Neubauer
3
J'avais compris que Cypher ressemblait plus à SQL, en ce sens que vous lui dites ce que vous voulez et qu'il explique comment le faire. Avec Gremlin, vous émettez des commandes de traversée exacts, auxquelles il doit obéir.
Stewart
2
Pour moi, Gremlin s'est avéré être beaucoup plus rapide que Cypher dans la plupart des requêtes.
Joan
9
Depuis TinkerPop 3.x , Gremlin a à la fois des caractéristiques impératives et déclaratives. Vous pouvez écrire vos traversées pour définir un modèle de parcours exact comme indiqué dans cette réponse ou vous pouvez utiliser l' étape de correspondance pour définir simplement le modèle que vous recherchez et Gremlin résoudra cela.
stephen mallette
42

Nous devons traverser des milliers de nœuds dans nos requêtes. Cypher était lent. L'équipe Neo4j nous a dit que la mise en œuvre de notre algorithme directement sur l'API Java serait 100 à 200 fois plus rapide. Nous l'avons fait et nous en avons facilement obtenu 60. Pour l'instant, nous n'avons pas de requête Cypher unique dans notre système en raison d'un manque de confiance. Les requêtes Easy Cypher sont faciles à écrire en Java, les requêtes complexes ne s'exécutent pas. Le problème est que lorsque vous avez plusieurs conditions dans votre requête, il n'y a aucun moyen dans Cypher de dire dans quel ordre effectuer les traversées. Ainsi, votre requête de chiffrement peut d'abord devenir sauvage dans le graphique dans une mauvaise direction. Je n'ai pas fait grand-chose avec Gremlin, mais je pourrais imaginer que vous ayez beaucoup plus de contrôle d'exécution avec Gremlin.

Heinrich
la source
Quand vous dites «directement contre l'API Java», voulez-vous dire Neo4j intégré à Java?
Pavel
2
Utilisation d'extensions de serveur dans neo4j installées en tant que serveur autonome.
Heinrich
12
Mise à jour de 2018 - étant donné une large gamme de types d'index natifs dans les versions modernes de neo4j, cette réponse est sensiblement dépassée; neo4j a publié des chiffres de performance
FrobberOfBits
3
"implémenter notre algorithme directement sur l'API Java" est en fait un peu trompeur. De toute évidence, le moyen le plus rapide pour se rendre du point A au point B est de prendre le chemin le plus court. Cela nécessite de connaître des informations supplémentaires et spécifiques. Aller à un niveau bas surpassera toujours un planificateur de machine, car vous savez que vous pouvez faire des hypothèses que la machine ne peut pas. Cependant, Cypher peut facilement surpasser un algorithme de bas niveau implémenté naïvement, nécessite beaucoup moins de connaissances à utiliser et est beaucoup plus rapide à mettre en œuvre. D'autant plus que Cypher s'améliore à chaque sortie de Neo4j. (planificateurs plus intelligents)
Tezra
29

Les efforts de l'équipe Neo4j sur Cypher ont été vraiment impressionnants et ils ont parcouru un long chemin. L'équipe Neo pousse généralement les gens vers elle, et à mesure que Cypher mûrit, Gremlin attirera probablement moins d'attention. Cypher est un bon choix à long terme.

Cela dit, Gremlin est un DSL Groovy. Son utilisation via son point de terminaison Neo4j REST permet un accès complet et sans entrave à l'API Java Neo4j sous-jacente. Il (et d'autres plugins de script de la même catégorie) ne peuvent pas être comparés en termes de puissance de bas niveau. De plus, vous pouvez exécuter Cypher à partir du plugin Gremlin .

Quoi qu'il en soit, il existe un chemin de mise à niveau sain où vous apprenez les deux. J'irais avec celui qui vous permet d'être opérationnel plus rapidement. Dans mes projets , j'utilise généralement Gremlin, puis j'appelle Cypher (depuis Gremlin ou non) lorsque j'ai besoin de résultats tabulaires ou de correspondance de motifs expressifs - les deux sont une douleur dans le DSL Gremlin.

Matt Luongo
la source
20

J'ai commencé par utiliser Gremlin. Cependant, à l'époque, l'interface REST était un peu instable, je suis donc passé à Cypher. Il a un bien meilleur support pour Neo4j. Cependant, il existe certains types de requêtes qui ne sont tout simplement pas possibles avec Cypher, ou pour lesquelles Cypher ne peut pas tout à fait optimiser comme vous le pouvez avec Gremlin.

Gremlin est construit sur Groovy, vous pouvez donc l'utiliser comme un moyen générique pour que Neo4j exécute du code 'Java' et exécute diverses tâches à partir du serveur, sans avoir à prendre le coup HTTP de l'interface REST. Entre autres, Gremlin vous permettra de modifier les données.

Cependant, lorsque tout ce que je veux, c'est interroger des données, j'utilise Cypher car il est plus lisible et plus facile à maintenir. Gremlin est la solution de secours lorsqu'une limitation est atteinte.

Louis-Philippe Huberdeau
la source
1
Cypher prend en charge la mise à jour des requêtes à partir de Neo4j 1.7, voir docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer
3
Notez que l'interface REST disparaîtra dans TinkerPop 3. Les utilisateurs devront envoyer des chaînes de Gremlin à Gremlin Server (qui est fondamentalement Rexster, renommé et amélioré).
jbmusso
10

Les requêtes Gremlin peuvent être générées par programme. (Voir http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects pour savoir ce que je veux dire.) Cela semble être un peu plus délicat avec Cypher.

Tohotom
la source
@MattLuongo: 1, je ne connaissais pas neo4django, 2, il n'est pas applicable dans tous les cas (par exemple le langage n'est pas Python) 3, ce n'est pas la même chose si vous écrivez vous-même la requête par programme ou si vous utilisez une bibliothèque pour créer le requête par programme pour vous. À cet égard, neo4django peut être considéré comme une solution alternative à Cypher et Gremlin.
Tohotom
3
Oh, bien sûr, je ne m'attends pas à ce que neo4django soit immédiatement applicable; c'était un exemple, tout comme SQL Alchemy était dans votre réponse. Mais ce n'est pas vrai que générer Cypher est plus difficile. Cypher et Gremlin adoptent des approches différentes en tant que langages de requête, mais je ne vois pas comment Cypher est plus difficile à générer par programme ...
Matt Luongo
8

Cypher ne fonctionne que pour les requêtes simples. Lorsque vous commencez à incorporer une logique métier complexe dans vos parcours de graphes, elle devient excessivement lente ou cesse de fonctionner complètement.

Neo4j sait clairement que Cypher ne coupe pas, car ils fournissent également les procédures de APOC qui comprennent un dispositif d' expansion de chemin alternatif ( apoc.path.expand, apoc.path.subgraphAll, etc.).

Gremlin est plus difficile à apprendre mais il est plus puissant que Cypher et APOC. Vous pouvez implémenter n'importe quelle logique imaginable dans Gremlin.

Je souhaite vraiment que Neo4J soit livré avec un serveur Gremlin basculable (après avoir lu, c'était le cas auparavant). Vous pouvez faire fonctionner Gremlin contre une instance Neo4J en direct, mais cela implique de sauter à travers de nombreux obstacles. J'espère que puisque les concurrents de Neo4J autorisent Gremlin en option, Neo4J suivra.

user1302130
la source
1
neo4j étant la DB de graphes la plus populaire au monde, je pense qu'il y a peut-être une raison pour laquelle ils n'ont pas encore adopté gremlin.
Luk Aron
1
puisque vous ne partagez pas ce que ces raisons pourraient être, je ne vois aucune valeur dans votre commentaire
user1302130
4

Cypher est un langage de requête déclaratif permettant d'interroger des bases de données graphiques. Le terme déclaratif est important car il s'agit d'une manière de programmer différente de celle des paradigmes de programmation comme l'impératif.

Dans un langage de requête déclaratif comme Cypher et SQL, nous indiquons au moteur sous-jacent quelles données nous voulons récupérer et nous ne spécifions pas comment nous voulons que les données soient extraites.

Dans Cypher, un utilisateur définit un sous-graphe d'intérêt dans la clause MATCH. Ensuite, le moteur sous-jacent exécute un algorithme de correspondance de modèles pour rechercher les occurrences similaires du sous-graphe dans la base de données de graphes.

Gremlin est à la fois des fonctionnalités déclaratives et impératives. Il s'agit d'un langage de traversée de graphe dans lequel un utilisateur doit donner des instructions explicites sur la façon dont le graphe doit être parcouru.

La différence entre ces langages dans ce cas est que dans Cypher, nous pouvons utiliser un opérateur en étoile Kleene pour trouver des chemins entre deux nœuds donnés dans une base de données de graphes. Dans Gremlin cependant, nous devrons définir explicitement tous ces chemins. Mais nous pouvons utiliser un opérateur de répétition dans Gremlin pour trouver plusieurs occurrences de tels chemins explicites dans une base de données de graphes. Cependant, faire des itérations sur des structures explicites n'est pas possible dans Cypher.

Chandan Sharma
la source
3

Si vous utilisez gremlin, cela vous permet de migrer vers différentes bases de données de graphes, puisque la plupart des bases de données de graphes prennent en charge le parcours de gremlin, c'est une bonne idée de choisir le gremlin.

Singaravelan
la source
2

Réponse longue courte: utilisez cypher pour la requête et gremlin pour la traversée. Vous verrez vous-même le temps de réponse.

Sagar Sarin
la source
comment faire ça ?
Optimus