openCypher Einhaltung der Spezifikationen 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.

openCypher Einhaltung der Spezifikationen in Amazon Neptune

Die Amazon Neptune Neptune-Version von unterstützt openCypher generell die Klauseln, Operatoren, Ausdrücke, Funktionen und Syntax, die in der aktuellen openCypher Spezifikation, der Cypher Query Language Reference Version 9, definiert sind. Einschränkungen und Unterschiede bei der Neptun-Unterstützung für openCypher werden im Folgenden aufgeführt.

Anmerkung

Die aktuelle Neo4j-Implementierung von Cypher enthält Funktionen, die in der oben genannten Spezifikation nicht enthalten sind. openCypher Wenn Sie aktuellen Cypher-Code zu Neptune migrieren, finden Sie unter Neptune-Kompatibilität mit Neo4j und Umschreiben von Cypher-Abfragen zur Ausführung in openCypher auf Neptune weitere Informationen.

Support für openCypher Klauseln in Neptune

Neptune unterstützt die folgenden Klauseln, wenn nicht anders angegeben:

  • MATCH— Unterstützt, außer dass shortestPath() and allShortestPaths() werden derzeit nicht unterstützt.

  • OPTIONAL MATCH

  • MANDATORY MATCH   — wird derzeit in Neptune nicht unterstützt. Neptune unterstützt jedoch benutzerdefinierte ID-WerteMATCH in -Abfragen.

  • RETURN   –   Unterstützt, jedoch nicht in Verbindung mit nichtstatischen Werten für SKIP oder LIMIT. Beispielsweise funktioniert Folgendes zurzeit nicht:

    MATCH (n) RETURN n LIMIT toInteger(rand()) // Does NOT work!
  • WITH   –   Unterstützt, jedoch nicht in Verbindung mit nichtstatischen Werten für SKIP oder LIMIT. Beispielsweise funktioniert Folgendes zurzeit nicht:

    MATCH (n) WITH n SKIP toInteger(rand()) WITH count() AS count RETURN count > 0 AS nonEmpty // Does NOT work!
  • UNWIND

  • WHERE

  • ORDER BY

  • SKIP

  • LIMIT

  • CREATE   –   Sie können mit Neptune benutzerdefinierte ID-Werte in CREATE-Abfragen erstellen.

  • DELETE

  • SET

  • REMOVE

  • MERGE   –   Neptune unterstützt benutzerdefinierte ID-Werte in MERGE-Abfragen.

  • CALL[YIELD...]   — wird derzeit in Neptune nicht unterstützt.

  • UNION, UNION ALL   –   Schreibgeschützte Abfragen werden unterstützt, Mutationsabfragen werden zurzeit jedoch nicht unterstützt.

  • USINGUSING wird ab Engine-Version 1.3.2.0 unterstützt. Weitere Informationen finden Sie unter Abfragehinweise.

Support für openCypher Betreiber in Neptune

Neptune unterstützt die folgenden Operatoren, wenn nicht anders angegeben:

Allgemeine Operatoren
  • DISTINCT

  • . Operator für den Zugriff auf Eigenschaften einer verschachtelten Literalmap.

Mathematische Operatoren
  • + Additionsoperator.

  • - Subtraktionsoperator.

  • * Multiplikationsoperator.

  • / Teilungsoperator.

  • % Modulo-Teilungsoperator.

  • Der Potenzierungsoperator ^ is NOT supported.

Vergleichsoperatoren
  • = Additionsoperator.

  • <> Ungleichheitsoperator.

  • Der < Kleiner-Als-Operator wird unterstützt, es sei denn, eines der Argumente ist Path, List oder Map.

  • Der > Größer-Als-Operator wird unterstützt, es sei denn, eines der Argumente ist Path, List oder Map.

  • Der Operator <= less-than-or-equal -to wird unterstützt, es sei denn, eines der Argumente ist ein Path, List oder Map.

  • Der Operator >= greater-than-or-equal -to wird unterstützt, außer wenn eines der Argumente ein Path, List oder Map ist.

  • IS NULL

  • IS NOT NULL

  • STARTS WITH wird unterstützt, wenn es sich bei den gesuchten Daten um eine Zeichenfolge handelt.

  • ENDS WITH wird unterstützt, wenn es sich bei den gesuchten Daten um eine Zeichenfolge handelt.

  • CONTAINS wird unterstützt, wenn es sich bei den gesuchten Daten um eine Zeichenfolge handelt.

Boolesche Operatoren
  • AND

  • OR

  • XOR

  • NOT

Zeichenfolgenoperatoren
  • + Verkettungsoperator.

Listenoperatoren.
  • + Verkettungsoperator.

  • IN (überprüft auf Vorhandensein eines Elements in der Liste)

Support für openCypher Ausdrücke in Neptune

Neptune unterstützt die folgenden Ausdrücke, wenn nicht anders angegeben:

  • CASE

  • Der []-Ausdruck wird zurzeit in Neptune nicht für den Zugriff auf dynamisch berechnete Eigenschaftsschlüssel innerhalb eines Knotens, einer Beziehung oder einer Map unterstützt. Beispielsweise funktioniert Folgendes nicht:

    MATCH (n) WITH [5, n, {key: 'value'}] AS list RETURN list[1].name

Support für openCypher Funktionen in Neptune

Neptune unterstützt die folgenden Funktionen, wenn nicht anders angegeben:

Prädikatsfunktionen
  • exists()

Skalarfunktionen
  • coalesce()

  • endNode()

  • epochmillis()

  • head()

  • id()

  • last()

  • length()

  • randomUUID()

  • properties()

  • removeKeyFromMap

  • size()   –   Diese Methodenüberladung funktioniert zurzeit nur für Musterausdrücke, Listen und Zeichenfolgen.

  • startNode()

  • timestamp()

  • toBoolean()

  • toFloat()

  • toInteger()

  • type()

Aggregationsfunktionen
  • avg()

  • collect()

  • count()

  • max()

  • min()

  • percentileDisc()

  • stDev()

  • percentileCont()

  • stDevP()

  • sum()

Listenfunktionen
  • join() (verkettet Zeichenfolgen in einer Liste zu einer einzigen Zeichenfolge)

  • keys()

  • labels()

  • nodes()

  • range()

  • relationships()

  • reverse()

  • tail()

Mathematische Funktionen – numerisch
  • abs()

  • ceil()

  • floor()

  • rand()

  • round()

  • sign()

Mathematische Funktionen – logarithmisch
  • e()

  • exp()

  • log()

  • log10()

  • sqrt()

Mathematische Funktionen – trigonometrisch
  • acos()

  • asin()

  • atan()

  • atan2()

  • cos()

  • cot()

  • degrees()

  • pi()

  • radians()

  • sin()

  • tan()

Zeichenfolgenfunktionen
  • join() (verkettet Zeichenfolgen in einer Liste zu einer einzigen Zeichenfolge)

  • left()

  • lTrim()

  • replace()

  • reverse()

  • right()

  • rTrim()

  • split()

  • substring()

  • toLower()

  • toString()

  • toUpper()

  • trim()

Benutzerdefinierte Funktionen

User-defined functions werden derzeit in Neptune nicht unterstützt.

Neptun-spezifische Implementierungsdetails openCypher

In den folgenden Abschnitten wird beschrieben, wie sich die Neptune-Implementierung von von der openCypher Spezifikation unterscheiden oder darüber hinausgehen kann. openCypher

Bewertungen von Pfaden variabler Länge (VLP) in Neptune

Evaluierungen von Pfaden (VLP) variabler Länge entdecken Pfade zwischen Knoten im Diagramm. Die Pfadlänge in einer Abfrage kann uneingeschränkt sein. Um Zyklen zu vermeiden, spezifiziert die openCypher Spezifikation, dass jede Kante höchstens einmal pro Lösung passiert werden muss.

Denn VLPs die Neptune-Implementierung weicht von der openCypher Spezifikation insofern ab, als sie nur konstante Werte für Eigenschaftsgleichheitsfilter unterstützt. Führen Sie die folgende Abfrage aus:

MATCH (x)-[:route*1..2 {dist:33, code:x.name}]->(y) return x,y

Da der Wert des x.name-Eigenschaftsgleichheitsfilters keine Konstante ist, führt diese Abfrage zu einer UnsupportedOperationException mit der folgenden Meldung: Property predicate over variable-length relationships with non-constant expression is not supported in this release.

Temporale Unterstützung in der openCypher Neptun-Implementierung (Neptun-Datenbank 1.3.1.0 und niedriger)

Neptune bietet derzeit begrenzte Unterstützung für die temporale Funktion in. openCypher Die Lösung unterstützt den Datentyp DateTime für temporale Typen.

Die datetime() Funktion kann verwendet werden, um das aktuelle UTC Datum und die aktuelle Uhrzeit wie folgt abzurufen:

RETURN datetime() as res

Datums- und Uhrzeitwerte können aus Zeichenfolgen im Format "dateTtime" analysiert werden, wobei date und time in einem der folgenden unterstützten Formate ausgedrückt werden:

Unterstützte Datumsformate
  • yyyy-MM-dd

  • yyyyMMdd

  • yyyy-MM

  • yyyy-DDD

  • yyyyDDD

  • yyyy

Unterstützte Uhrzeitformate
  • HH:mm:ssZ

  • HHmmssZ

  • HH:mm:ssZ

  • HH:mmZ

  • HHmmZ

  • HHZ

  • HHmmss

  • HH:mm:ss

  • HH:mm

  • HHmm

  • HH

Beispielsweise:

RETURN datetime('2022-01-01T00:01') // or another example: RETURN datetime('2022T0001')

Beachten Sie, dass alle Datums-/Uhrzeitwerte in Neptune als Werte gespeichert und abgerufen openCypher werden. UTC

Neptune openCypher verwendet eine statement Uhr, was bedeutet, dass während der gesamten Dauer einer Abfrage derselbe Zeitpunkt verwendet wird. Eine andere Abfrage innerhalb derselben Transaktion verwendet möglicherweise einen anderen Zeitpunkt.

Neptune unterstützt keine Verwendung von Funktionen innerhalb von Aufrufen von datetime(). Beispielsweise funktioniert Folgendes nicht:

CREATE (:n {date:datetime(tostring(2021))}) // ---> NOT ALLOWED!

Neptune unterstützt die Funktion epochmillis(), die einen datetime-Wert in epochmillis konvertiert. Beispielsweise:

MATCH (n) RETURN epochMillis(n.someDateTime) 1698972364782

Neptune unterstützt zurzeit keine anderen Funktionen und Operationen für DateTime-Objekte, z. B. Addition und Subtraktion.

Temporale Unterstützung in der openCypher Neptune-Implementierung (Neptune Analytics und Neptune Database 1.3.2.0 und höher)

Die folgende Datetime-Funktionalität für OpenCypher gilt für Neptune Analytics. Alternativ können Sie den Labmode-Parameter DatetimeMillisecond=enabled verwenden, um die folgenden Datetime-Funktionen auf Neptune Engine-Release-Version 1.3.2.0 und höher zu aktivieren. Weitere Informationen zur Verwendung dieser Funktionalität im Labmode finden Sie unter. Erweiterte Datetime-Unterstützung

  • Support für Millisekunden. Das Datetime-Literal wird immer mit Millisekunden zurückgegeben, auch wenn Millisekunden 0 ist. (Bisheriges Verhalten bestand darin, Millisekunden zu kürzen.)

    CREATE (:event {time: datetime('2024-04-01T23:59:59Z')}) # Returning the date returns with 000 suffixed representing milliseconds MATCH(n:event) RETURN n.time as datetime { "results" : [ { "n" : { "~id" : "0fe88f7f-a9d9-470a-bbf2-fd6dd5bf1a7d", "~entityType" : "node", "~labels" : [ "event" ], "~properties" : { "time" : "2024-04-01T23:59:59.000Z" } } } ] }
  • Support für den Aufruf der Funktion datetime () über gespeicherte Eigenschaften oder Zwischenergebnisse. Beispielsweise waren die folgenden Abfragen vor dieser Funktion nicht möglich.

    Datetime () über Eigenschaften:

    // Create node with property 'time' stored as string CREATE (:event {time: '2024-04-01T23:59:59Z'}) // Match and return this property as datetime MATCH(n:event) RETURN datetime(n.time) as datetime

    Datetime () im Vergleich zu Zwischenergebnissen:

    // Parse datetime from parameter UNWIND $list as myDate RETURN datetime(myDate) as d
  • Es ist jetzt auch möglich, Datetime-Eigenschaften zu speichern, die in den oben genannten Fällen erstellt wurden.

    Speichern von Datetime aus der String-Eigenschaft einer Eigenschaft in eine andere:

    // Create node with property 'time' stored as string CREATE (:event {time: '2024-04-01T23:59:59Z', name: 'crash'}) // Match and update the same property to datetime type MATCH(n:event {name: 'crash'}) SET n.time = datetime(n.time) // Match and update another node's property MATCH(e:event {name: 'crash'}) MATCH(n:server {name: e.servername}) SET n.time = datetime(e.time)

    Erstellen Sie im Batch-Modus Knoten aus einem Parameter mit einer Datetime-Eigenschaft:

    // Batch create from parameter UNWIND $list as events CREATE (n:crash) {time: datetime(events.time)} // Parameter value { "x":[ {"time":"2024-01-01T23:59:29", "name":"crash1"}, {"time":"2023-01-01T00:00:00Z", "name":"crash2"} ] }
  • Support für eine größere Teilmenge von ISO86 01 Datetime-Formaten. Weitere Informationen finden Sie unter weiter unten in diesem Dokument.

Unterstützte Formate

Das Format eines Datetime-Werts ist [Date] T [Time] [Timezone], wobei T das Trennzeichen ist. Wenn keine explizite Zeitzone angegeben wird, wird UTC (Z) als Standard angenommen.

Zeitzone

Folgende Zeitzonenformate werden unterstützt:

  • +/-hh:mm

  • +/-HHmm

  • +/-HH

Das Vorhandensein einer Zeitzone in einer Datetime-Zeichenfolge ist optional. Falls der Zeitzonen-Offset 0 ist, kann Z anstelle des obigen Zeitzonen-Postfixes verwendet werden, um die Zeit anzugeben. UTC Der unterstützte Bereich einer Zeitzone liegt zwischen -14:00 und + 14:00 Uhr.

Datum

Wenn keine Zeitzone vorhanden ist oder die Zeitzone UTC (Z) ist, werden die folgenden Datumsformate unterstützt:

Anmerkung

DDDbezieht sich auf ein Ordinaldatum, das für einen Tag im Jahr zwischen 001 und 365 steht (366 in Schaltjahren). 2024-002 steht beispielsweise für den 2. Januar 2024.

  • yyyy-MM-dd

  • yyyyMMdd

  • yyyy-MM

  • yyyyMM

  • yyyy-DDD

  • yyyyDDD

  • yyyy

Wenn eine andere Zeitzone als Z ausgewählt wird, sind die unterstützten Datumsformate auf die folgenden beschränkt:

  • yyyy-MM-dd

  • yyyy-DDD

  • yyyyDDD

Der unterstützte Datumsbereich reicht von 1400-01-01 bis 9999-12-31.

Zeit

Wenn keine Zeitzone vorhanden ist oder die Zeitzone (Z) ist, werden folgende Zeitformate unterstützt: UTC

  • HH:mm:ss.SSS

  • HH:mm:ss

  • HHmmss.SSS

  • HHmmss

  • HH:mm

  • HHmm

  • HH

Wenn eine andere Zeitzone als Z ausgewählt wird, sind die unterstützten Zeitformate auf die folgenden beschränkt:

  • HH:mm:ss

  • HH:mm:ss.SSS

Unterschiede in der Semantik der Neptun-Sprache openCypher

Neptune repräsentiert Knoten und Beziehung IDs als Zeichenketten und nicht als Ganzzahlen. Die ID entspricht der ID, die über den Datenloader bereitgestellt wird. Wenn es einen Namespace für die Spalte gibt, entspricht sie dem Namespace und der ID. Daher gibt die Funktion id eine Zeichenfolge statt einer Ganzzahl zurück.

Der Datentyp INTEGER ist auf 64 Bit begrenzt. Wenn Sie mittels der Funktion TOINTEGER größere Fließkomma- oder Zeichenfolgenwerte in eine Ganzzahl konvertieren, werden negative Werte zu LLONG_MIN und positive Werte zu LLONG_MAX verkürzt.

Beispielsweise:

RETURN TOINTEGER(2^100) > 9223372036854775807 RETURN TOINTEGER(-1 * 2^100) > -9223372036854775808

Die Neptune-spezifische Funktion join()

Neptune implementiert eine join() Funktion, die in der Spezifikation nicht enthalten ist. openCypher Sie erstellt aus einer Liste von Zeichenfolgen-Literalen und einem Zeichenfolgen-Trennzeichen ein Zeichenfolgen-Literal. Sie verwendet zwei Argumente:

  • Das erste Argument ist eine Liste von Zeichenfolgenliteralen.

  • Das zweite Argument ist die Trennzeichenfolge, die aus null, einem oder mehreren Zeichen bestehen kann.

Beispiel:

join(["abc", "def", "ghi"], ", ") // Returns "abc, def, ghi"

Die Neptune-spezifische Funktion removeKeyFromMap()

Neptune implementiert eine removeKeyFromMap() Funktion, die in der Spezifikation nicht enthalten ist. openCypher Sie entfernt einen angegebenen Schlüssel aus einer Map und gibt die resultierende neue Map zurück.

Die Funktion verwendet zwei Argumente:

  • Das erste Argument ist die Map, aus der der Schlüssel entfernt werden soll.

  • Das zweite Argument ist der Schlüssel, der aus der Map entfernt werden soll.

Die Funktion removeKeyFromMap() ist besonders nützlich in Situationen, in denen Sie Werte für einen Knoten oder eine Beziehung festlegen möchten, indem Sie eine Liste von Maps entladen. Beispielsweise:

UNWIND [{`~id`: 'id1', name: 'john'}, {`~id`: 'id2', name: 'jim'}] as val CREATE (n {`~id`: val.`~id`}) SET n = removeKeyFromMap(val, '~id')

Benutzerdefinierte ID-Werte für Knoten- und Beziehungseigenschaften

Ab der Engine-Version 1.2.0.2 hat Neptune die openCypher Spezifikation erweitert, sodass Sie jetzt die id Werte für Knoten und Beziehungen inCREATE, MERGE und Klauseln angeben können. MATCH Auf diese Weise können Sie benutzerfreundliche Zeichenketten anstelle von UUIDs systemgenerierten Zeichenketten zuweisen, um Knoten und Beziehungen zu identifizieren.

Warnung

Diese Erweiterung der openCypher Spezifikation ist abwärtsinkompatibel, da sie jetzt als reservierter ~id Eigenschaftsname betrachtet wird. Wenn Sie in Ihren Daten und Abfragen ~id bereits als Eigenschaft verwenden, müssen Sie die vorhandene Eigenschaft zu einem neuen Eigenschaftsschlüssel migrieren und den alten entfernen. Siehe Was Sie tun sollten, wenn Sie ~id zurzeit als Eigenschaft verwenden.

Hier ist ein Beispiel, das zeigt, wie Sie Knoten und Beziehungen erstellen, die benutzerdefiniert IDS sind:

CREATE (n {`~id`: 'fromNode', name: 'john'}) -[:knows {`~id`: 'john-knows->jim', since: 2020}] ->(m {`~id`: 'toNode', name: 'jim'})

Wenn Sie versuchen, eine benutzerdefinierte ID zu erstellen, die bereits verwendet wird, gibt Neptune den Fehler DuplicateDataException aus.

Dies ist ein Beispiel für die Verwendung einer benutzerdefinierten ID in einer MATCH-Klausel:

MATCH (n {`~id`: 'id1'}) RETURN n

Hier ist ein Beispiel für die Verwendung von custom IDs in einer MERGE Klausel:

MATCH (n {name: 'john'}), (m {name: 'jim'}) MERGE (n)-[r {`~id`: 'john->jim'}]->(m) RETURN r

Was Sie tun sollten, wenn Sie ~id zurzeit als Eigenschaft verwenden

In der Engine-Version 1.2.0.2 wird der ~id Schlüssel in openCypher Klauseln nun als Eigenschaft und nicht mehr id als Eigenschaft behandelt. Das bedeutet, dass der Zugriff auf eine Eigenschaft nicht mehr möglich ist, wenn Sie diese mit ~id benannt haben.

Wenn Sie die Eigenschaft ~id verwenden, müssen Sie vor dem Upgrade auf Engine-Version 1.2.0.2 oder höher zunächst die vorhandene Eigenschaft ~id zu einem neuen Eigenschaftsschlüssel migrieren und dann die Eigenschaft ~id entfernen. Betrachten Sie die folgende Abfrage:

  • Erzeugt eine neue Eigenschaft mit dem Namen 'newId' für alle Knoten,

  • kopiert den Wert der Eigenschaft '~id' in die Eigenschaft 'newId',

  • Sie entfernt die Eigenschaft '~id' aus den Daten.

MATCH (n) WHERE exists(n.`~id`) SET n.newId = n.`~id` REMOVE n.`~id`

Dies muss für alle Beziehungen in den Daten ausgeführt werden, die die Eigenschaft ~id besitzen.

Sie müssen auch alle Abfragen ändern, die auf die Eigenschaft ~id verweisen. Beispielsweise würde diese Abfrage:

MATCH (n) WHERE n.`~id` = 'some-value' RETURN n

... wie folgt geändert werden:

MATCH (n) WHERE n.newId = 'some-value' RETURN n

Weitere Unterschiede zwischen Neptune openCypher und Cypher

  • Neptune unterstützt nur TCP Verbindungen für das Bolt-Protokoll. WebSocketsVerbindungen für Bolt werden nicht unterstützt.

  • Neptune openCypher entfernt Leerzeichen, wie sie in Unicode definiert sindtrim(), in den Funktionen undltrim(). rtrim()

  • In Neptune openCypher ) wechselt tostring( Double für große Double-Werte nicht automatisch zur E-Notation.

  • Es werden zwar openCypher CREATE keine mehrwertigen Eigenschaften erzeugt, sie können jedoch in Daten vorkommen, die mit Gremlin erstellt wurden. Wenn Neptune openCypher auf eine Eigenschaft mit mehreren Werten trifft, wird einer der Werte willkürlich ausgewählt, wodurch ein nicht deterministisches Ergebnis entsteht.