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
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
andshortestPath()
werden derzeit nicht unterstützt.allShortestPaths()
OPTIONAL MATCH
— wird derzeit in Neptune nicht unterstützt. Neptune unterstützt jedoch benutzerdefinierte ID-WerteMATCH in -Abfragen.MANDATORY MATCH
-
RETURN
– Unterstützt, jedoch nicht in Verbindung mit nichtstatischen Werten fürSKIP
oderLIMIT
. 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ürSKIP
oderLIMIT
. 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 inCREATE
-Abfragen erstellen.DELETE
SET
REMOVE
MERGE
– Neptune unterstützt benutzerdefinierte ID-Werte inMERGE
-Abfragen.
— wird derzeit in Neptune nicht unterstützt.CALL[YIELD...]
UNION, UNION ALL
– Schreibgeschützte Abfragen werden unterstützt, Mutationsabfragen werden zurzeit jedoch nicht unterstützt.-
USING
—USING
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
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
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 "
dateT
time"
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 sind
trim()
, in den Funktionen undltrim()
.rtrim()
In Neptune openCypher
)
wechselttostring(
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.