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 geben 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 Grafikdaten in Amazon Neptune im Schnellstart.
Themen
Geltende Standards für Gremlin
Die Gremlin-Sprache wird durch die TinkerPop Apache-Dokumentation
und die TinkerPop Apache-Implementierung von Gremlin und nicht durch eine formale Spezifikation definiert. Für numerische Formate folgt Gremlin dem IEEE 754-Standard (IEEE 754-2019 — IEEE-Standard für Arithmetik). Floating-Point
Weitere Informationen finden Sie auch auf der Wikipedia-Seite IEEE 754). https://en.wikipedia.org/wiki/IEEE_754
Variablen und Parameter in Skripts
Bei vorgebundenen Variablen befindet sich das Traversal-Objekt Pre-bound in Neptune, und das Objekt g wird nicht unterstützt. graph
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
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 sehr viele solcher Beispiele, auf TinkerPop die Sie vielleicht stoßen, und alle klingen ziemlich überzeugend, was die Notwendigkeit einer Parametrisierung anbelangt.
Sowohl die Funktion zur Variablendeklaration als auch die Parametrisierungsfunktion (zusammen mit den Warnungen) gelten jedoch nur für den Gremlin Server, wenn TinkerPop er den verwendet. GremlinGroovyScriptEngine Sie gelten nicht, wenn Gremlin Server die gremlin-language-ANTLR-Grammatik von Gremlin verwendet, um Abfragen zu analysieren. Die ANTLR-Grammatik unterstützt weder Variablendeklarationen noch Parametrisierung. Wenn Sie ANTLR verwenden, müssen Sie sich daher keine Sorgen über eine fehlende Parametrisierung machen. Da es sich bei der ANTLR-Grammatik um einen neueren Bestandteil handelt TinkerPop, wird dieser Unterschied in älteren Inhalten, auf die Sie im Internet stoßen, im Allgemeinen nicht berücksichtigt.
Neptune verwendet in der Abfrageverarbeitungs-Engine die ANTLR-Grammatik und nicht GremlinGroovyScriptEngine. Daher werden Variablen, Parametrisierung oder die Eigenschaft bindings nicht unterstützt. 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();
Skriptausführung
Die Gremlin-Engine von Neptune analysiert Abfragen mithilfe der ANTLR-Grammatik. TinkerPop gremlin-language Sie läuft nicht GremlinGroovyScriptEngine (wie es bei einigen TinkerPop-based Gremlin Server-Bereitstellungen der Fall ist), daher dürfen an Neptune übermittelte Skripte nur die Gremlin-Sprache enthalten — keinen beliebigen Groovy- oder Java-Code.
Skripte können auf verschiedene Arten an Neptune gesendet werden, z. B. über den Gremlin-REST-Endpunkt, die Gremlin-Konsole oder über Sprachtreiber (zum Beispiel den Skript-Client des Java-Treibers). TinkerPop https://tinkerpop.apache.org/docs/current/reference/#gremlin-java-scripts
Es ist wichtig, die Gremlin-Sprache selbst nicht mit den syntaktischen Zucker- oder Allzweckfunktionen der Programmiersprache zu verwechseln, die Sie vielleicht an anderer Stelle beim Umschließen von Gremlin-Beispielen gesehen haben. Wenn solcher Code in TinkerPop Tutorials oder Online-Beispielen auftaucht, hängt das von einer Groovy- oder Java-Runtime ab, die Neptune nicht bereitstellt.
Wichtig
Alles in diesem Abschnitt bezieht sich auf Gremlin-Eingaben mit Textzeichenfolgen. GLV-Bytecode-Übermittlungen (Gremlin Language Variant), die in einer Hostsprache wie Java, Python oder .NET erstellt wurden, unterliegen diesen Einschränkungen nicht, da der Host-Language Traversal Builder Bytecode erzeugt, den die Engine von Neptune direkt verbraucht.
Was ein Skript enthalten kann
-
Alle Abfragen müssen mit
g, dem Traversal-Objekt, beginnen. -
In einer einzigen Einreichung können mehrere Durchläufe vorgenommen werden, getrennt durch ein Semikolon (
;) oder ein Zeilenumbruchzeichen ().\nJede Anweisung außer der letzten muss mit einem auszuführenden.iterate()Schritt enden; nur die Daten des letzten Durchlaufs werden zurückgegeben.
Referenzierung TinkerPop von Enumerationswerten
Wenn ein TinkerPop Aufzählungswert als Schrittargument erwartet wird (z. B. eine Kardinalität an property() oder eine Reihenfolge anby()), verwenden Sie die von der ANTLR-Grammatik erkannten Kurzformwerte. Neptune löst in dieser Position keine vollqualifizierten Java-Klassennamen auf — wird beispielsweise nicht akzeptiert; verwenden Sie stattdessen. org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single single
In der folgenden Tabelle sind die zulässigen Kurzformwerte und die zugrundeliegende TinkerPop Klasse aufgeführt, zu der jeder einzelne gehört.
| Zulässige Werte | Klasse |
|---|---|
id, key, label, value |
|
T.id, T.key, T.label, T.value |
|
set, single |
org.apache.tinkerpop.gremlin.structure. VertexProperty.Cardinality |
asc, desc, shuffle |
|
Order.asc, Order.desc, Order.shuffle |
|
global, local |
|
Scope.global, Scope.local |
|
all, first, last, mixed |
|
normSack |
org.apache.tinkerpop.gremlin.process.traversal. SackFunctions.Barrier |
addAll, and, assign, div,
max, min, minus, mult,
or, sum, sumLong |
|
keys, values |
|
BOTH, IN, OUT |
|
any, none |
org.apache.tinkerpop.gremlin.process.traversal.step. TraversalOptionParent.Pick |
Was ein Script nicht enthalten darf
Folgendes wird in Gremlin-Abfragen an Neptune mit Textzeichenfolgen nicht unterstützt, da sie auf Groovy- oder Java-Laufzeitunterstützung angewiesen sind, die Neptune nicht bietet:
-
Groovige Anweisungen, die nicht mit beginnen.
gDies umfasst:Arithmetische Ausdrücke wie
1 + 1Systemrufe wie
System.nanoTime()Variablendeklarationen wie
x = 1; g.V(x)
-
Andere Java-Methoden- oder -Bibliotheksaufrufe als unterstützte Gremlin-APIs. Beispiel:
java.lang.*,Date()undg.V().tryNext().orElseGet(...)sind nicht zulässig. -
Gremlin-Methoden, die einen Java-Typ als Argument verwenden. Diese sind nur von einem JVM-language Host aus erreichbar, nicht von einer Textzeichenfolge aus. Beispiele:
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)
Beispielsweise kann der folgende Traversal nicht als Textzeichenfolge übermittelt werden:.
g.V().addE('something').from(__.V().next()).to(__.V().next())
Eigenschaften von Elementen
Neptune unterstützt das in TinkerPop 3.7.0 eingeführte materializeProperties Flag nicht, um Eigenschaften von Elementen zurückzugeben. Daher gibt Neptune weiterhin nur Scheitelpunkte oder Kanten als Referenzen zurück, die nur ihr Und enthalten. id label
Sitzungen
Sitzungen in Neptune sind auf 10 Minuten Dauer beschränkt. Weitere Informationen finden Sie unter Skriptbasierte Gremlin-Sitzungen und in der TinkerPop Sitzungsreferenz.
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).
Eckpunkt- und Kanten-IDs
Neptune-Gremlin-Eckpunkt– und -Kanten-IDs müssen den Typ String haben. Diese ID-Zeichenfolgen unterstützen Unicode-Zeichen und dürfen eine Größe von 55 MB nicht überschreiten.
User-supplied IDs werden unterstützt, sind aber bei normalem Gebrauch optional. Wenn Sie beim Hinzufügen eines Eckpunkts oder einer Kante keine ID angeben, generiert Neptune eine UUID und konvertiert sie in eine Zeichenfolge mit dem folgenden Format: "48af8178-50ce-971a-fc41-8c9a954cea62" Diese UUIDs entsprechen nicht dem RFC-Standard. Wenn Sie Standard-UUIDs benötigen, sollten Sie diese extern generieren und angeben, wenn Sie Eckpunkte oder Kanten hinzufügen.
Anmerkung
Der Neptune-Befehl Load erfordert, dass Sie im Feld ~id IDs im Neptune-CSV-Format angeben.
User-supplied IDs
User-supplied Ausweise sind in Neptune Gremlin mit den folgenden Bestimmungen erlaubt.
Bereitgestellte IDs 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.
Alle Eckpunkt-IDs und alle Kanten-IDs müssen eindeutig 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
Eckpunkt-Eigenschaft-IDs
Eigenschaften-IDs von Knoten werden automatisch generiert und können bei Abfrage als positive oder negative Zahlen erscheinen.
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 Eigenschaftskardinalität finden Sie im Thema Vertex im Gremlin. https://tinkerpop.apache.org/javadocs/3.7.2/core/org/apache/tinkerpop/gremlin/structure/Vertex.html#property-org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality-java.lang.String-V-java.lang.Object...-
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
Serialisierung
Neptune unterstützt die folgenden Serialisierungen basierend auf dem angeforderten MIME-Typ.
Mit Neptune können Sie viele der angebotenen Serializer verwenden, mit Unterstützung für die verschiedenen Versionen und TinkerPop Konfigurationen von GraphsOn und. GraphBinary In der folgenden Tabelle finden Sie die derzeit unterstützten Serializer. Obwohl es viele Optionen gibt, ist die Anleitung zur Verwendung einfach:
-
Wenn Sie TinkerPop Apache-Treiber verwenden, bevorzugen Sie die Standardeinstellung für den Treiber, ohne einen explizit anzugeben. Sofern Sie keinen ganz bestimmten Grund dafür haben, müssen Sie den Serializer wahrscheinlich nicht bei Ihrer Treiberinitialisierung angeben. Im Allgemeinen ist die von den Treibern verwendete Standardeinstellung.
application/vnd.graphbinary-v1.0 -
Wenn Sie über HTTP eine Verbindung zu Neptune herstellen, sollten Sie die Verwendung von priorisieren,
application/vnd.gremlin-v3.0+json;types=falseda die eingebetteten Typen in der alternativen Version von GraphsOn 3 die Arbeit erschweren. -
Der
application/vnd.graphbinary-v1.0-stringdist im Allgemeinen nur nützlich, wenn er in Verbindung mit der Gremlin Console verwendet wird, da er alle Ergebnisse zur einfachen Anzeige in eine Zeichenfolgendarstellung umwandelt. -
Die übrigen Formate sind aus veralteten Gründen weiterhin vorhanden und sollten in der Regel nicht ohne triftigen Grund mit Treibern verwendet werden.
| MIME-Typ | Serialisierung | Konfiguration |
|
GraphSONUntypedMessageSerializerV1 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphSONMessageSerializerV2 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONUntypedMessageSerializerV2 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphSONUntypedMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphSONUntypedMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphBinaryMessageSerializerV1 |
|
|
GraphBinaryMessageSerializerV1 |
serializeResultToString: true |
|
GraphSONMessageSerializerGremlinV1 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphSONMessageSerializerV2(funktioniert nur mit WebSockets) |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONMessageSerializerV3 |
|
|
GraphSONMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphBinaryMessageSerializerV1 |
|
Anmerkung
Die hier gezeigte Serializer-Tabelle bezieht sich auf die Benennung ab 3.7.0. TinkerPop Wenn Sie mehr über diese Änderung erfahren möchten, lesen Sie bitte die TinkerPop Upgrade-Dokumentation.
Lambda-Schritte
Lambda-Schritte werden von Neptune nicht unterstützt.
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. Sie können es in einem Lesekontext verwenden, wie in g.io("https://example.com/data/my-graph.graphml").read(), aber Sie können es nicht zum Schreiben verwenden. Um eine Datei zu lesen, die Sie als Amazon S3-Objekt speichern, generieren Sie zunächst eine vorsignierte URL. Übergeben Sie dann diese HTTPS-URL ang.io(). Weitere Informationen zu vorsignierten URLs finden Sie unter Herunterladen und Hochladen von Objekten mit vorsignierten URLs im Amazon S3-Benutzerhandbuch.
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 Grafikfunktionen
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 |