View a markdown version of this page

Verarbeitung von Gremlin-Abfragen in Neptune - Amazon Neptune

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verarbeitung von Gremlin-Abfragen in Neptune

In Amazon Neptune können komplexere Traversierungen durch Muster dargestellt werden, die basierend auf der Definition benannter Variablen eine Beziehung erstellen, die mit Mustern geteilt werden kann, um Joins zu erstellen. Dies wird im folgenden Beispiel veranschaulicht.

Frage: Was ist die Zwei-Hop-Nachbarschaft des Eckpunkts v1?

Gremlin code: g.V(‘v1’).out('knows').out('knows').path() Pattern: (?1=<v1>, <knows>, ?2, ?) X Pattern(?2, <knows>, ?3, ?) The pattern produces a three-column relation (?1, ?2, ?3) like this: ?1 ?2 ?3 ================ v1 v2 v3 v1 v2 v4 v1 v5 v6

Wenn Sie die ?2-Variable über die beiden Muster hinweg weitergeben (an der O-Position im ersten Muster und der S-Position des zweiten Musters), erstellen Sie einen Join zwischen den First-Hop-Nachbarn und den Second-Hop-Nachbarn. Jede Neptune-Lösung hat Bindungen für die drei benannten Variablen, die verwendet werden können, um einen TinkerPop Traverser (einschließlich Pfadinformationen) neu zu erstellen.

Der erste Schritt bei der Gremlin-Abfrageverarbeitung besteht darin, die Abfrage in ein TinkerPop http://tinkerpop.apache.org/docs/current/reference/#traversal Traversal-Objekt zu analysieren, das aus einer Reihe von Schritten besteht. TinkerPop http://tinkerpop.apache.org/docs/current/reference/#graph-traversal-steps Diese Schritte, die Teil des TinkerPop Open-Source-Apache-Projekts sind, sind sowohl die logischen als auch die physikalischen Operatoren, aus denen ein Gremlin-Traversal in der Referenzimplementierung besteht. Sie werden beide verwendet, um das Modell der Abfrage darzustellen. Sie sind ausführbare Operatoren, die Lösungen gemäß der Semantik des Operators, den sie darstellen, erstellen können. Zum Beispiel .V() wird sowohl dargestellt als auch ausgeführt durch. TinkerPop GraphStep

Da diese TinkerPop Standardschritte ausführbar sind, kann ein solcher TinkerPop Traversal jede Gremlin-Abfrage ausführen und die richtige Antwort liefern. Wenn TinkerPop Schritte jedoch anhand eines großen Graphen ausgeführt werden, können sie manchmal sehr ineffizient und langsam sein. Anstatt sie zu verwenden, versucht Neptune, die Traversierung in ein deklaratives Format zu konvertieren, das aus Gruppen von Mustern besteht, wie zuvor beschrieben.

Neptune unterstützt zurzeit nicht alle Gremlin-Operatoren (Schritte) in der nativen Abfrage-Engine. Daher wird versucht, so viele Schritte wie möglich in eine einzelne NeptuneGraphQueryStep zu reduzieren, die den deklarativen logischen Abfrageplan für alle konvertierten Schritte enthält. Idealerweise werden alle Schritte konvertiert. Wenn jedoch ein Schritt gefunden wird, der nicht konvertiert werden kann, bricht Neptune aus der systemeigenen Ausführung aus und verschiebt die gesamte Abfrageausführung von diesem Punkt an auf die Schritte. TinkerPop Es versucht kein In- oder Outweaving bezüglich der nativen Ausführung.

Nachdem die Schritte in einen logischen Abfrageplan umgesetzt wurden, führt Neptune eine Reihe von Abfrageoptimierern aus, die den Abfrageplan basierend auf statischen Analysen und geschätzter Kardinalität neu schreiben. Diese Optimierer erledigen Aufgaben wie die Neuanordnung von Operatoren basierend auf der Bereichsanzahl, das Reduzieren unnötiger oder redundanter Operatoren, das Neuanordnen von Filtern, das Verschieben von Operatoren in verschiedene Gruppen und so weiter.

Nach der Erstellung eines optimierten Abfrageplan erstellt Neptune eine Pipeline mit physischen Operatoren zur Ausführung der Abfrage. Dies umfasst das Lesen von Daten aus den Anweisungsindizes, das Durchführen von Joins verschiedener Typen, das Filtern, Sortieren usw. Die Pipeline erzeugt einen Lösungsstream, der dann wieder in einen Stream von TinkerPop Traverser-Objekten umgewandelt wird.

Serialisierung von Abfrageergebnissen

Amazon Neptune ist derzeit auf die Serialisierer für TinkerPop Antwortnachrichten angewiesen, um Abfrageergebnisse (TinkerPop Traverser) in serialisierte Daten umzuwandeln, die über die Leitung an den Client zurückgesendet werden. Diese Serialisierungsformate sind in der Regel recht ausführlich.

Um beispielsweise das Ergebnis einer Eckpunktabfrage wie g.V().limit(1) zu serialisieren, muss die Neptune-Abfrage-Engine eine einzelne Suche ausführen, um das Abfrageergebnis zu erzeugen. Der GraphSON-Serializer würde jedoch eine große Anzahl zusätzlicher Suchanfragen durchführen, um den Eckpunkt in das Serialisierungsformat zu verpacken. Er müsste eine Suche durchführen, um die Bezeichnung zu erhalten, eine, um die Eigenschaftsschlüssel abzurufen, und eine Suche pro Eigenschaftsschlüssel für den Eckpunkt, um alle Werte für jeden Schlüssel abzurufen.

Einige der Serialisierungsformate sind effizienter, aber alle erfordern zusätzliche Suchvorgänge. Darüber hinaus versuchen die TinkerPop Serialisierer nicht, doppelte Suchanfragen zu vermeiden, was oft dazu führt, dass viele Suchanfragen unnötig wiederholt werden.

Dies macht es sehr wichtig, Ihre Abfragen so zu schreiben, dass sie nur nach den benötigten Informationen fragen. Beispielsweise würde g.V().limit(1).id() nur die Eckpunkt-ID zurückgeben und alle zusätzlichen Serialisierer-Suchen entfernen. Mit Gremlin-Profil-API in Neptune können Sie sehen, wie viele Suchaufrufe während der Abfrageausführung und während der Serialisierung durchgeführt werden.