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.
neo4j
graph-databases
cypher
gremlin
Rubinsh
quelle
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Lange Antwort kurz: Verwenden Sie Cypher für die Abfrage und Gremlin für die Durchquerung. Sie werden den Zeitpunkt der Reaktion selbst sehen.
quelle
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.
quelle