Neo4j - Abfragesprache Cypher vs Gremlin


101

Ich beginne mit Neo4j unter Verwendung der REST-API zu entwickeln. Ich habe gesehen, dass es zwei Optionen für die Ausführung komplexer Abfragen gibt - Cypher (Neo4js Abfragesprache) und Gremlin (die Allzweck-Diagrammabfrage / Traversal-Sprache).

Folgendes möchte ich wissen: Gibt es eine Abfrage oder Operation, die mit Gremlin und nicht mit Cypher ausgeführt werden kann? oder umgekehrt?

Cypher scheint mir viel klarer zu sein als Gremlin, und im Allgemeinen scheinen die Jungs in Neo4j mit Cypher zu gehen. Aber - wenn Cypher im Vergleich zum Gremlin begrenzt ist - würde ich das wirklich gerne im Voraus wissen.


Cypher ist eine nicht turing vollständige deklarative Sprache. Gremlin ist ein ausgefallener Wrapper über die Neo4j Java API und unerlässlich. Natürlich gibt es im Gremlin Dinge, die man in der Chiffre nicht tun kann.
Prakhar Agrawal

1
Apache Spark 3 wird Cypher enthalten, das viel über ihre Meinung dazu aussagt.
Walker Rowe

Antworten:


76

Für allgemeine Abfragen reicht Cypher aus und ist wahrscheinlich schneller. Der Vorteil von Gremlin gegenüber Cypher besteht darin, dass Sie in ein hohes Level-Traversieren geraten. Im Gremlin können Sie das genaue Durchlaufmuster (oder Ihre eigenen Algorithmen) besser definieren, während in Cypher die Engine versucht, die beste Durchquerungslösung selbst zu finden.

Ich persönlich benutze Cypher wegen seiner Einfachheit und bis jetzt hatte ich keine Situationen, in denen ich Gremlin verwenden musste (außer mit Gremlin graphML Import / Export-Funktionen zu arbeiten). Ich gehe jedoch davon aus, dass ich selbst dann, wenn ich Gremlin verwenden müsste, dies für eine bestimmte Abfrage tun würde, die ich im Internet finden würde und auf die ich nie wieder zurückkommen würde.

Sie können Cypher immer sehr schnell (in Tagen) lernen und dann mit dem (längerfristigen) allgemeinen Gremlin fortfahren.


2
Unter neo4j.org/learn/cypher gibt es ein neues Online-Tutorial, mit dem Sie ebenfalls loslegen können .
Peter Neubauer

2
Ich hatte das Verständnis, dass Cypher eher wie SQL ist, indem Sie ihm sagen, was Sie wollen, und es funktioniert, wie es geht. Mit Gremlin geben Sie genaue Durchquerungsbefehle aus, denen es folgen muss.
Stewart

2
Für mich war Gremlin in den meisten Anfragen deutlich schneller als Cypher.
Joan

9
Ab TinkerPop 3.x hat der Gremlin sowohl zwingende als auch deklarative Eigenschaften. Sie können Ihre Durchquerungen schreiben, um ein genaues Durchlaufmuster zu definieren, wie in dieser Antwort angegeben, oder Sie können den Übereinstimmungsschritt verwenden, um einfach das gesuchte Muster zu definieren, und Gremlin wird das lösen.
Stephen Mallette

40

Wir müssen Tausende von Knoten in unseren Abfragen durchlaufen. Cypher war langsam. Das Neo4j-Team teilte uns mit, dass die Implementierung unseres Algorithmus direkt gegen die Java-API 100 bis 200 Mal schneller sein würde. Wir haben das getan und haben leicht den Faktor 60 herausgeholt. Aufgrund mangelnden Vertrauens haben wir derzeit keine einzige Cypher-Abfrage in unserem System. Easy Cypher-Abfragen sind in Java einfach zu schreiben, komplexe Abfragen werden nicht ausgeführt. Das Problem besteht darin, dass in Cypher nicht angegeben werden kann, in welcher Reihenfolge die Durchläufe ausgeführt werden sollen, wenn Ihre Abfrage mehrere Bedingungen enthält. Daher wird Ihre Chiffrierabfrage möglicherweise zuerst in die falsche Richtung in das Diagramm verschoben. Ich habe nicht viel mit Gremlin gemacht, aber ich könnte mir vorstellen, dass Sie mit Gremlin viel mehr Ausführungskontrolle bekommen.


Wenn Sie "direkt gegen die Java-API" sagen, meinen Sie damit, dass Neo4j in Java eingebettet ist?
Pavel

2
Verwenden von Servererweiterungen in neo4j, die als eigenständiger Server installiert sind.
Heinrich

11
Update von 2018 - Angesichts einer Vielzahl nativer Indextypen in modernen Versionen von neo4j ist diese Antwort im Wesentlichen veraltet. neo4j hat Leistungszahlen veröffentlicht
FrobberOfBits

3
"Implementierung unseres Algorithmus direkt gegen die Java-API" ist eigentlich etwas irreführend. Offensichtlich ist der schnellste Weg von Punkt A nach Punkt B der kürzeste Weg. Dazu müssen zusätzliche, spezifische Informationen bekannt sein. Ein niedriger Pegel übertrifft immer einen Maschinenplaner, da Sie wissen, dass Sie Annahmen treffen können, die die Maschine nicht kann. Cypher kann jedoch einen naiv implementierten Low-Level-Algorithmus leicht übertreffen, erfordert viel weniger Wissen und ist viel schneller zu implementieren. Zumal Cypher mit jeder Neo4j-Version besser wird. (
klügere

28

Die Bemühungen des Neo4j-Teams bei Cypher waren wirklich beeindruckend und es hat einen langen Weg zurückgelegt. Das Neo-Team drängt normalerweise die Leute dazu, und wenn Cypher reift, wird der Gremlin wahrscheinlich weniger Aufmerksamkeit erhalten. Chiffre ist eine gute langfristige Wahl.

Das heißt - Gremlin ist ein Groovy DSL. Die Verwendung über den Neo4j-REST-Endpunkt ermöglicht den vollständigen und uneingeschränkten Zugriff auf die zugrunde liegende Neo4j-Java-API. Es (und andere Skript-Plugins in derselben Kategorie) kann hinsichtlich der Leistung auf niedrigem Niveau nicht verglichen werden. Außerdem können Sie Cypher über das Gremlin-Plugin ausführen .

In beiden Fällen gibt es einen vernünftigen Upgrade-Pfad, in dem Sie beide lernen. Ich würde mit dem gehen, der dich schneller zum Laufen bringt. In meinen Projekten verwende ich normalerweise Gremlin und rufe dann Cypher auf (aus dem Gremlin heraus oder nicht), wenn ich tabellarische Ergebnisse oder einen aussagekräftigen Mustervergleich benötige - beides ist ein Problem im Gremlin-DSL.


19

Ich fing an, Gremlin zu benutzen. Zu dieser Zeit war die REST-Schnittstelle jedoch etwas instabil, sodass ich zu Cypher wechselte. Es hat viel bessere Unterstützung für Neo4j. Es gibt jedoch einige Arten von Abfragen, die mit Cypher einfach nicht möglich sind oder bei denen Cypher die Möglichkeiten mit Gremlin nicht ganz optimieren kann.

Gremlin wurde über Groovy erstellt, sodass Sie Neo4j generisch dazu bringen können, Java-Code auszuführen und verschiedene Aufgaben vom Server aus auszuführen, ohne den HTTP-Treffer von der REST-Schnittstelle übernehmen zu müssen. Mit Gremlin können Sie unter anderem Daten ändern.

Wenn ich jedoch nur Daten abfragen möchte, entscheide ich mich für Cypher, da es besser lesbar und einfacher zu warten ist. Gremlin ist der Fallback, wenn eine Begrenzung erreicht ist.


1
Cypher unterstützt das Aktualisieren von Abfragen ab Neo4j 1.7, siehe docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer

2
Beachten Sie, dass die REST-Schnittstelle in TinkerPop 3 nicht mehr angezeigt wird. Von den Benutzern wird erwartet, dass sie Gremlin-Zeichenfolgen an Gremlin Server senden (im Grunde Rexster, umbenannt und verbessert).
jbmusso

10

Gremlin-Abfragen können programmgesteuert generiert werden. (Siehe http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects, um zu wissen, was ich meine.) Dies scheint mit Cypher etwas schwieriger zu sein.


@MattLuongo: 1, ich wusste nichts über neo4django, 2, es ist nicht in allen Fällen anwendbar (z. B. Sprache ist nicht Python) 3, es ist nicht dasselbe, wenn Sie die Abfrage programmgesteuert selbst schreiben oder eine Bibliothek zum Erstellen der verwenden Abfrage programmgesteuert für Sie. In dieser Hinsicht kann neo4django als alternative Lösung zu Cypher und Gremlin angesehen werden.
Tohotom

3
Oh, natürlich erwarte ich nicht, dass neo4django sofort anwendbar ist. Es war ein Beispiel, genau wie SQL Alchemy in Ihrer Antwort war. Aber es ist nicht wahr , dass Cypher Erzeugung ist mehr schwierig. Cypher und Gremlin verfolgen unterschiedliche Ansätze als Abfragesprachen, aber ich sehe nicht, wie schwierig es ist, Cypher programmgesteuert zu generieren ...
Matt Luongo

7

Cypher funktioniert nur für einfache Abfragen. Wenn Sie anfangen, komplexe Geschäftslogik in Ihre Diagrammdurchläufe zu integrieren, wird diese unerschwinglich langsam oder funktioniert überhaupt nicht mehr.

Neo4J weiß eindeutig, dass Cypher es nicht schneidet, da sie auch die APOC-Prozeduren bereitstellen, die einen alternativen Pfaderweiterer enthalten ( apoc.path.expand,apoc.path.subgraphAll usw.).

Gremlin ist schwerer zu lernen, aber leistungsfähiger als Cypher und APOC. Sie können jede Logik implementieren, die Sie sich im Gremlin vorstellen können.

Ich wünschte wirklich, Neo4J würde mit einem umschaltbaren Gremlin-Server geliefert (nach dem Lesen war dies früher der Fall). Sie können Gremlin gegen eine Live-Neo4J-Instanz zum Laufen bringen, aber es geht darum, durch viele Reifen zu springen. Ich hoffe, dass Neo4J nachziehen wird, da die Konkurrenten von Neo4J Gremlin als Option zulassen.


1
neo4j ist die beliebteste Graph-DB der Welt. Ich denke, es gibt einen Grund, warum sie Gremlin noch nicht übernommen haben.
Luk Aron

1
Da Sie nicht teilen, was diese Gründe sein könnten, sehe ich keinen Wert in Ihrem Kommentar
user1302130

3

Cypher ist eine deklarative Abfragesprache zum Abfragen von Diagrammdatenbanken. Der Begriff deklarativ ist wichtig, weil er eine andere Art der Programmierung darstellt als Programmierparadigmen wie der Imperativ. In einer deklarativen Abfragesprache wie Cypher und SQL teilen wir der zugrunde liegenden Engine mit, welche Daten abgerufen werden sollen, und wir geben nicht an, wie die Daten abgerufen werden sollen. In Cypher definiert ein Benutzer einen interessierenden Untergraphen in der MATCH-Klausel. Anschließend führt die zugrunde liegende Engine einen Mustervergleichsalgorithmus aus, um nach ähnlichen Vorkommen von Subgraphen in der Graphendatenbank zu suchen. Der Gremlin ist sowohl ein deklaratives als auch ein imperatives Merkmal. Es ist eine Diagrammdurchlaufsprache, in der ein Benutzer explizite Anweisungen geben muss, wie das Diagramm navigiert werden soll. Der Unterschied zwischen diesen Sprachen besteht in diesem Fall darin, dass wir in Cypher einen Kleene-Sternoperator verwenden können, um Pfade zwischen zwei beliebigen Knoten in einer Graphendatenbank zu finden. Im Gremlin müssen wir jedoch alle diese Pfade explizit definieren. Wir können jedoch einen Wiederholungsoperator im Gremlin verwenden, um mehrere Vorkommen solcher expliziten Pfade in einer Diagrammdatenbank zu finden. Das Durchführen von Iterationen über explizite Strukturen ist in Cypher jedoch nicht möglich.


2

Lange Antwort kurz: Verwenden Sie Cypher für die Abfrage und Gremlin für die Durchquerung. Sie werden den Zeitpunkt der Reaktion selbst sehen.


wie geht das ?
Optimus

2

Wenn Sie Gremlin verwenden, können Sie diese in verschiedene Diagrammdatenbanken migrieren. Da die meisten Diagrammdatenbanken die Gremlin-Durchquerung unterstützen, empfiehlt es sich, den Gremlin auszuwählen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.