Einhaltung der Gremlin-Standards in Amazon 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.

Einhaltung der Gremlin-Standards in Amazon Neptune

Die folgenden Abschnitte bieten einen Überblick über die Neptune-Implementierung von Gremlin und wie sie sich von der Apache-Implementierung unterscheidet. TinkerPop

Neptune implementiert einige Gremlin-Schritte nativ in seiner Engine und verwendet die Apache TinkerPop Gremlin-Implementierung, um andere zu verarbeiten (siehe). Native Unterstützung für Gremlin-Schritte in Amazon Neptune

Anmerkung

Einige Beispiele für diese Implementierungsunterschiede zwischen der Gremlin-Konsole und Amazon Neptune finden Sie im Abschnitt Verwenden von Gremlin für den Zugriff auf Diagramme in Amazon Neptune im Schnellstart.

Geltende Standards für Gremlin

Variablen und Parameter in Skripts

Wenn es sich um bereits gebundene Variablen handelt, ist das Traversierungs-Objekt g in Neptune bereits gebunden und das graph-Objekt wird nicht unterstützt.

Obwohl Neptune weder Gremlin-Variablen noch Parametrisierung in Skripts unterstützt, finden Sie im Internet häufig Beispielskripts für Gremlin Server, die Variablendeklarationen enthalten, zum Beispiel:

String query = "x = 1; g.V(x)"; List<Result> results = client.submit(query).all().get();

Es gibt auch viele Beispiele, die beim Absenden von Abfragen Parametrisierung (oder Bindungen) verwenden, zum Beispiel:

Map<String,Object> params = new HashMap<>(); params.put("x",1); String query = "g.V(x)"; List<Result> results = client.submit(query).all().get();

Die Parameterbeispiele sind in der Regel mit Warnungen vor einer Beeinträchtigung der Leistung verbunden, wenn keine Parametrisierung erfolgt, wenn dies möglich ist. Es gibt eine Vielzahl solcher Beispiele TinkerPop , denen Sie vielleicht begegnen werden, und sie klingen alle ziemlich überzeugend, was die Notwendigkeit der Parametrisierung angeht.

Sowohl die Funktion zur Deklaration von Variablen als auch die Parametrisierungsfunktion (zusammen mit den Warnungen) gelten jedoch nur für den Gremlin-Server, TinkerPop wenn dieser den verwendet. GremlinGroovyScriptEngine Sie gelten nicht, wenn Gremlin Server die Gremlin-Grammatik verwendet, um Abfragen zu analysieren. gremlin-language ANTLR Die ANTLR Grammatik unterstützt weder Variablendeklarationen noch Parametrisierung, sodass Sie sich bei der Verwendung keine Sorgen machen müssenANTLR, dass die Parametrisierung fehlschlägt. Da es sich bei der ANTLR Grammatik um einen neueren Bestandteil handelt TinkerPop, spiegeln ältere Inhalte, denen Sie möglicherweise im Internet begegnen, diesen Unterschied in der Regel nicht wider.

Neptune verwendet die ANTLR Grammatik in seiner Abfrageverarbeitungs-Engine und nicht dieGremlinGroovyScriptEngine, sodass Variablen, Parametrisierung oder die Eigenschaft nicht unterstützt werden. bindings Daher sind die Probleme im Zusammenhang mit einer fehlenden Parametrisierung nicht auf Neptune anwendbar. Mit Neptune können Abfragen einfach so gesendet werden, wie sie sind, ohne sie zu parametrisieren. Daher kann das vorherige Beispiel wie folgt vereinfacht werden, ohne dass die Leistung beeinträchtigt wird:

String query = "g.V(1)"; List<Result> results = client.submit(query).all().get();

TinkerPop Aufzählungen

Neptune unterstützt keine vollständig qualifizierten Klassennamen für Aufzählungswerte. In Ihrer Groovy-Anforderung müssen Sie beispielsweise single anstelle von org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single verwenden.

Der Aufzählungstyp wird durch den Parametertyp bestimmt.

Die folgende Tabelle zeigt die zulässigen Aufzählungswerte und den zugehörigen TinkerPop vollqualifizierten Namen.

Java-Code

Neptune unterstützt keine Aufrufe von Methoden, die durch beliebige Java- oder Java-Bibliotheksaufrufe definiert wurden, mit Ausnahme von unterstütztem Gremlin. APIs Beispiel: java.lang.*, Date() und g.V().tryNext().orElseGet() sind nicht zulässig.

Eigenschaften von Elementen

Neptune unterstützt das in TinkerPop 3.7.0 eingeführte materializeProperties Flag zur Rückgabe von Eigenschaften von Elementen nicht. Infolgedessen gibt Neptune immer noch nur Scheitelpunkte oder Kanten als Referenzen mit nur ihrem UND zurück. id label

Skriptausführung

Alle Abfragen müssen mit g, dem Traversal-Objekt, beginnen.

Bei der Übermittlung von Zeichenfolgenabfragen können mehrere Traversierungen ausgegeben werden, durch Semikolon (;) oder ein Zeichen für eine neue Zeile (\n) getrennt. Alle Anweisungen außer der letzten Anweisung müssen mit einem .iterate()-Schritt beendet werden, um ausgeführt zu werden. Es werden nur die Daten der letzten Traversierung zurückgegeben. Beachten Sie, dass dies nicht für eingereichte Abfragen gilt GLV ByteCode .

Sitzungen

Sitzungen in Neptune sind auf 10 Minuten Dauer beschränkt. Weitere Informationen finden Sie unter Skriptbasierte Gremlin-Sitzungen und in der TinkerPopSitzungsreferenz.

Transaktionen

Neptune öffnet zu Beginn jeder Gremlin-Traversierung eine neue Transaktion und schließt sie nach dem erfolgreichen Abschluss der Traversierung. Wenn ein Fehler auftritt, wird ein Rollback für die Transaktion durchgeführt.

In einer einzelnen Transaktion sind mehrere Anweisungen, die durch Semikolon (;) oder Zeilenumbruchzeichen (\n) getrennt sind, enthalten. Jede Anweisung, die nicht die letzte Anweisung ist, muss mit einem auszuführenden next()-Schritt enden. Es werden nur die Daten der letzten Traversierung zurückgegeben.

Eine manuelle Transaktionslogik mit tx.commit() und tx.rollback() wird nicht unterstützt.

Wichtig

Dies gilt nur für Methoden, bei denen Sie die Gremlin-Abfrage als Textzeichenfolge senden (siehe Gremline-Transaktionen).

Scheitelpunkt und Kante IDs

Neptune Gremlin Vertex und Edge IDs müssen vom Typ sein. String Diese ID-Zeichenfolgen unterstützen Unicode-Zeichen und dürfen eine Größe von 55 MB nicht überschreiten.

Vom Benutzer bereitgestellte Dateien IDs werden unterstützt, sind aber bei normalem Gebrauch optional. Wenn Sie beim Hinzufügen eines Scheitelpunkts oder einer Kante keine ID angeben, generiert Neptune eine UUID und konvertiert sie in eine Zeichenfolge in einer Form wie dieser:. "48af8178-50ce-971a-fc41-8c9a954cea62" Diese entsprechen UUIDs nicht dem RFC Standard. Wenn Sie also einen Standard benötigen, sollten UUIDs Sie sie extern generieren und sie angeben, wenn Sie Scheitelpunkte oder Kanten hinzufügen.

Anmerkung

Der Load Neptune-Befehl erfordert, dass Sie das Feld ~id im Neptune-Format angebenIDs. CSV

Vom Benutzer bereitgestellt IDs

Vom Benutzer bereitgestellte IDs Dateien sind in Neptune Gremlin mit den folgenden Bestimmungen erlaubt.

  • IDsDie mitgelieferten Produkte sind optional.

  • Es werden nur Eckpunkte und Kanten unterstützt.

  • Es wird nur der String-Typ unterstützt.

Zum Erstellen eines neuen Vertex mit benutzerdefinierter ID verwenden Sie den property-Schritt mit dem id-Schlüsselwort g.addV().property(id, 'customid').

Anmerkung

Schließen Sie das id-Schlüsselwort nicht in Anführungszeichen ein. Dies bezieht sich auf T.id.

Jeder Scheitelpunkt IDs muss einzigartig sein, und alle Kanten IDs müssen einzigartig sein. Neptune lässt jedoch zu, dass ein Eckpunkt und eine Kante dieselbe ID haben.

Wenn Sie versuchen, einen neuen Vertex mit g.addV() zu erstellen und es ist bereits ein Vertex mit dieser ID vorhanden, schlägt die Operation fehl. Dabei gilt die folgende Ausnahme: Wenn Sie eine neue Bezeichnung für den Vertex angeben, ist die Operation erfolgreich, fügt die neue Bezeichnung und alle zusätzlichen angegebenen Eigenschaften aber zum vorhandenen Vertex hinzu. Es wird nichts überschrieben. Es wird kein neuer Vertex erstellt. Die Vertex-ID ändert sich nicht und bleibt eindeutig.

Die folgende Gremlin-Konsolenbefehl können beispielsweise erfolgreich ausgeführt werden:

gremlin> g.addV('label1').property(id, 'customid') gremlin> g.addV('label2').property(id, 'customid') gremlin> g.V('customid').label() ==>label1::label2

Eigenschaft „Scheitelpunkt“ IDs

Die Eckpunkteigenschaften IDs werden automatisch generiert und können bei der Abfrage als positive oder negative Zahlen angezeigt werden.

Kardinalität von Eckpunkteigenschaften

Neptune unterstützt Set-Kardinalität und Single-Kardinalität. Wenn die Kardinalität nicht angegeben ist, wird die Set-Kardinalität ausgewählt. Das bedeutet, dass, wenn ein Eigenschaftswert festgelegt wird, ein neuer Wert zur Eigenschaft hinzugefügt wird, sofern dieser nicht bereits im Wertesatz enthalten ist. Dies ist der Gremlin-Aufzählungswert von Set.

List wird nicht unterstützt. Weitere Informationen zur Kardinalität von Eigenschaften finden Sie im Thema Scheitelpunkt im Gremlin. JavaDoc

Aktualisieren einer Eckpunkteigenschaft

Zum Aktualisieren eines Eigenschaftswerts ohne Hinzufügung eines zusätzlichen Werts zum Wertesatz geben Sie die single-Kardinalität im property-Schritt an.

g.V('exampleid01').property(single, 'age', 25)

Dadurch werden alle vorhandenen Werte für die Eigenschaft entfernt.

Labels

Neptune unterstützt mehrere Bezeichnungen für einen Eckpunkt. Sie können mehrere Bezeichnungen angeben, indem Sie diese durch :: trennen. Beispielsweise fügt g.addV("Label1::Label2::Label3") einen Knoten mit drei verschiedenen Bezeichnungen hinzu. Der hasLabel-Schritt entspricht dem Knoten mit allen drei Bezeichnungen: hasLabel("Label1"), hasLabel("Label2") und hasLabel("Label3").

Wichtig

Das ::-Trennzeichen ist dieser Verwendung vorbehalten. Sie können im hasLabel-Schritt nicht mehrere Bezeichnungen angeben. Beispiel: Für hasLabel("Label1::Label2") gibt es keine Übereinstimmung.

Escape-Zeichen

Neptune löst alle Escape-Zeichen wie im Abschnitt Escaping Special Characters der Apache-Groovy-Dokumentation beschrieben auf.

Groovy-Einschränkungen

Neptune unterstützt keine Groovy-Befehle, die nicht mit g beginnen. Dies umfasst mathematische Zeichen (z. B.: 1+1), Systemaufrufe (z. B: System.nanoTime()) und Variablendefinitionen (z. B: 1+1).

Wichtig

Neptune unterstützt keine vollständig qualifizierten Klassennamen. In Ihrer Groovy-Anforderung müssen Sie beispielsweise single anstelle von org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single verwenden.

Serialisierung

Neptune unterstützt die folgenden Serialisierungen basierend auf dem angeforderten Typ. MIME

MIMETyp Serialisierung Konfiguration

application/vnd.gremlin-v1.0+json

GraphSONMessageSerializerV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v1.0+json;types=false

GraphSONUntypedMessageSerializerV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerV2 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v2.0+json;types=false

GraphSONUntypedMessageSerializerV2 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/vnd.gremlin-v3.0+json;types=false

GraphSONUntypedMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/json

GraphSONUntypedMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1

application/vnd.graphbinary-v1.0-stringd

GraphBinaryMessageSerializerV1 serializeResultToString: true

application/vnd.gremlin-v1.0+json

GraphSONMessageSerializerGremlinV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerV2(funktioniert nur mit WebSockets) ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3

application/json

GraphSONMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1

Neptune unterstützt zwar diese verschiedenen Serialisierertypen, die Anleitung für ihre Verwendung ist jedoch recht einfach. Wenn Sie eine Verbindung zu Neptune herstellenHTTP, sollten Sie der Verwendung von Priorität einräumen, application/vnd.gremlin-v3.0+json;types=false da die eingebetteten Typen in der alternativen Version von Graph SON 3 die Arbeit damit erschweren. Wenn Sie TinkerPop Apache-Treiber verwenden, müssen Sie wahrscheinlich keine Auswahl treffen, da Sie die Standardeinstellung von verwenden würden. application/vnd.graphbinary-v1.0 Das application/vnd.graphbinary-v1.0-stringd ist im Allgemeinen nur nützlich, wenn es in Verbindung mit der Gremlin-Konsole verwendet wird, da es alle Ergebnisse zur einfachen Anzeige in eine Zeichenkettendarstellung konvertiert. Die übrigen Formate bleiben aus älteren Gründen weiterhin vorhanden.

Anmerkung

Die hier gezeigte Serializer-Tabelle bezieht sich auf die Benennung ab Version 3.7.0. TinkerPop Wenn Sie mehr über diese Änderung erfahren möchten, lesen Sie bitte die TinkerPop Upgrade-Dokumentation. Die Unterstützung der Gryo-Serialisierung war in 3.4.3 veraltet und wurde in 3.6.0 offiziell entfernt. Wenn Sie Gryo explizit verwenden oder eine Treiberversion verwenden, die Gryo standardmäßig verwendet, sollten Sie zu Ihrem Treiber wechseln oder ihn aktualisieren. GraphBinary

Lambda-Schritte

Lambda-Schritte werden von Neptune nicht unterstützt.

Nicht unterstützte Gremlin-Methoden

Die folgenden Gremlin-Methoden werden von Neptune nicht unterstützt:

  • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.program(org.apache.tinkerpop.gremlin.process.computer.VertexProgram)

  • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.sideEffect(java.util.function.Consumer)

  • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.from(org.apache.tinkerpop.gremlin.structure.Vertex)

  • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.to(org.apache.tinkerpop.gremlin.structure.Vertex)

Die folgende Traversierung ist beispielsweise nicht zulässig: g.V().addE('something').from(__.V().next()).to(__.V().next()).

Wichtig

Dies gilt nur für Methoden, bei denen die Gremlin-Abfrage als Textzeichenfolge gesendet wird.

Nicht unterstützte Gremlin-Schritte

Die folgenden Gremlin-Schritte werden von Neptune nicht unterstützt:

  • Der Gremlin-Schritt io( ) wird von Neptune nur teilweise unterstützt. Er kann in einem Lesekontext verwendet werden, wie in g.io((url)).read(), jedoch nicht zum Schreiben.

Features von Gremlin-Diagrammen in Neptune

Die Neptune-Implementierung von Gremlin legt das graph-Objekt nicht offen. Die folgenden Tabellen listen Gremlin-Features auf und geben an, ob Neptune sie unterstützt oder nicht.

Neptune-Unterstützung für graph-Features

Die Neptune-Diagramm-Features (wenn vorhanden) sind mit den Features identisch, die vom Befehl graph.features() zurückgegeben würden.

Diagramm-Feature Aktiviert?
Transactions true
ThreadedTransactions false
Computer false
Persistence true
ConcurrentAccess true

Neptune-Unterstützung für Variablen-Features

Variablen-Feature Aktiviert?
Variables false
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues false
ByteValues false
DoubleValues false
FloatValues false
IntegerValues false
LongValues false
MapValues false
MixedListValues false
StringValues false
ByteArrayValues false
FloatArrayValues false
LongArrayValues false

Neptune-Unterstützung für Eckpunkt-Features

Eckpunkt-Feature Aktiviert?
MetaProperties false
DuplicateMultiProperties false
AddVertices true
RemoveVertices true
MultiProperties true
UserSuppliedIds true
AddProperty true
RemoveProperty true
NumericIds false
StringIds true
UuidIds false
CustomIds false
AnyIds false

Neptune-Unterstützung für Eckpunkt-Eigenschafts-Features

Eckpunkt-Eigenschafts-Feature Aktiviert?
UserSuppliedIds false
AddProperty true
RemoveProperty true
NumericIds true
StringIds true
UuidIds false
CustomIds false
AnyIds false
Properties true
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues true
ByteValues true
DoubleValues true
FloatValues true
IntegerValues true
LongValues true
MapValues false
MixedListValues false
StringValues true
ByteArrayValues false
FloatArrayValues false
LongArrayValues false

Neptune-Unterstützung für Kanten-Features

Kanten-Feature Aktiviert?
AddEdges true
RemoveEdges true
UserSuppliedIds true
AddProperty true
RemoveProperty true
NumericIds false
StringIds true
UuidIds false
CustomIds false
AnyIds false

Neptune-Unterstützung für Kanten-Eigenschafts-Features

Kanten-Eigenschafts-Feature Aktiviert?
Properties true
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues true
ByteValues true
DoubleValues true
FloatValues true
IntegerValues true
LongValues true
MapValues false
MixedListValues false
StringValues true
ByteArrayValues false
FloatArrayValues false
LongArrayValues false