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.
neo4j
graph-databases
cypher
gremlin
Rubinsh
la source
la source
Réponses:
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).
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source