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 genannten Variablen, die verwendet werden können, um einen TinkerPopTraverser
Der erste Schritt bei der Verarbeitung von Gremlin-Abfragen besteht darin, die Abfrage in ein TinkerPop Traversal-Objekt.V()
wird durch den sowohl repräsentiert als auch ausgeführt. TinkerPop GraphStep
Da diese off-the-shelf TinkerPop Schritte 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 angetroffen wird, der nicht konvertiert werden kann, bricht Neptune die native Ausführung ab und verschiebt die gesamte Abfrageausführung von diesem Zeitpunkt 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 konvertiert wird.
Serialisierung von Abfrageergebnissen
Amazon Neptune verwendet derzeit die Serialisierer für TinkerPop Antwortnachrichten, um Abfrageergebnisse (TinkerPop Traverser) in serialisierte Daten umzuwandeln, die über das Kabel zurück an den Client gesendet 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 häufig 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 profile API im Neptune können Sie sehen, wie viele Suchaufrufe während der Abfrageausführung und während der Serialisierung durchgeführt werden.