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 (langage de requête de Neo4j) et Gremlin (la requête/traversée graphique à usage général) la langue).
Voici ce que je veux savoir - y a-t-il une requête ou une opération qui peut être effectuée en utilisant Gremlin et 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 choisissent Cypher. Mais - si Cypher est limité par rapport à Gremlin - j'aimerais vraiment le savoir à l'avance.
Pour les requêtes générales, Cypher suffit et est probablement plus rapide. L'avantage de Gremlin sur 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) tandis que dans Cypher, le moteur essaie de trouver lui-même la meilleure solution de déplacement.
Personnellement, j'utilise Cypher en raison de sa simplicité et, à ce jour, je n'ai eu aucune situation où j'ai dû utiliser Gremlin (sauf travailler avec les fonctions d'importation/exportation de Gremlin graphML). Je m'attends cependant à ce que même si j'avais besoin d'utiliser Gremlin, je le ferais pour une requête spécifique que je trouverais sur le net et ne reviendrais plus jamais.
Vous pouvez toujours apprendre Cypher très rapidement (en jours), puis continuer avec le Gremlin général (à plus long terme).
Nous devons parcourir des milliers de nœuds dans nos requêtes. Cypher était lent. L'équipe de Neo4j nous a dit que l'implémentation de notre algorithme directement par rapport à Java API serait 100-200 fois plus rapide. requête 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écuteront 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 aller sauvage dans le graphique dans une mauvaise direction d'abord. Je n'ai pas fait grand chose avec Gremlin, mais je pourrais imaginer que vous obtenez beaucoup plus de contrôle d'exécution avec Gremlin.
Les efforts de l'équipe Neo4j sur Cypher ont été vraiment impressionnants, et cela a fait du chemin. L'équipe Neo pousse généralement les gens vers elle, et à mesure que Cypher mûrit, Gremlin recevra probablement moins d'attention. Cypher est un bon choix à long terme.
Cela dit, Gremlin est un Groovy DSL. L'utiliser via son Neo4j REST permet un accès complet et sans entraves au Neo4j Java Java. Il (et d'autres plugins de script de la même catégorie) ne peuvent pas être égal 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 monprojets , j'utilise généralement Gremlin, puis j'appelle Cypher (à partir de Gremlin ou non) lorsque j'ai besoin de résultats tabulaires ou d'une correspondance de modèle expressive - les deux sont une douleur dans le Gremlin DSL.
J'ai d'abord commencé à utiliser Gremlin. Cependant, à l'époque, l'interface REST était un peu instable, alors je suis 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 où Cypher ne peut pas tout à fait optimiser la façon dont vous pouvez avec Gremlin.
Gremlin est construit sur Groovy, vous pouvez donc réellement 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 hit 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 les données, je choisis Cypher car il est plus lisible et plus facile à gérer. Gremlin est le repli lorsqu'une limitation est atteinte.
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.
Cypher est un langage de requête déclaratif pour interroger les bases de données graphiques. Le terme déclaratif est important car c'est une façon de programmation différente de celle des paradigmes de programmation comme 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 précisons pas comment nous voulons que les données soient récupérées. Dans Cypher, un utilisateur définit un sous-graphique d'intérêt dans la clause MATCH. Ensuite, le moteur sous-jacent exécute un algorithme de correspondance de motifs pour rechercher les occurrences similaires du sous-graphique dans la base de données des graphiques. 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 manière de naviguer dans le graphe. La différence entre ces langues dans ce cas est que dans Cypher, nous pouvons utiliser un opérateur é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 ces chemins explicites dans une base de données de graphiques. Cependant, faire des itérations sur des structures explicites n'est pas possible dans Cypher.
Cypher ne fonctionne que pour les requêtes simples. Lorsque vous commencez à incorporer une logique métier complexe dans vos parcours graphiques, cela devient excessivement lent ou cesse complètement de fonctionner.
Neo4J sait clairement que Cypher ne le coupe pas, car ils fournissent également les procédures APOC qui incluent un expandeur 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 à laquelle vous pouvez penser dans Gremlin.
Je souhaite vraiment que Neo4J soit livré avec un serveur Gremlin basculable (à la lecture, ce fut le cas auparavant). Vous pouvez faire fonctionner Gremlin contre une instance Neo4J en direct, mais cela implique de sauter à travers de nombreux cerceaux. J'espère que puisque les concurrents de Neo4J autorisent Gremlin en option, Neo4J suivra.
Réponse longue et courte: utilisez cypher pour la requête et gremlin pour la traversée. Vous verrez le temps de réponse vous-même.