In diesem Dokument werden openCypher und Spanner Graph in folgenden Punkten verglichen:
- Terminologie
- Datenmodell
- Schema
- Abfrage
- Mutation
In diesem Dokument wird davon ausgegangen, dass Sie mit openCypher v9 vertraut sind.
Hinweis
Spanner Graph mit der Google Cloud Console einrichten und abfragen
Terminologie
openCypher | Cloud Spanner Graph |
---|---|
Knoten | Knoten |
Beziehungen | Kanten |
Knotenlabels | Knotenlabels |
Beziehungstypen | Kantenlabels |
Klauseln | In Spanner Graph wird der Begriff statement für eine vollständige Ausführungseinheit und clause für einen Modifikator für Anweisungen verwendet.MATCH ist beispielsweise eine Anweisung, während WHERE eine Klausel ist. |
Eindeutigkeit von Beziehungen openCypher gibt keine Ergebnisse mit sich wiederholenden Kanten in einer einzelnen Übereinstimmung zurück. |
TRAIL -PfadWenn im Spanner-Graph Eindeutigkeit erforderlich ist, verwenden Sie den TRAIL -Modus, um eindeutige Kanten in einer einzelnen Übereinstimmung zurückzugeben.
|
Compliance mit Standards
Spanner Graph unterstützt die ISO-Standards Graph Query Language (GQL) und SQL/Property Graph Queries (SQL/PGQ).
Datenmodell
Sowohl Spanner Graph als auch openCypher verwenden das Property-Graph-Datenmodell mit einigen Unterschieden.
openCypher | Cloud Spanner Graph |
---|---|
Jede Beziehung hat genau einen Beziehungstyp. |
Sowohl Knoten als auch Kanten haben ein oder mehrere Labels. |
Schema
openCypher | Cloud Spanner Graph |
---|---|
Ein Diagramm hat kein vordefiniertes Schema. | Ein Graphenschema muss explizit mit der CREATE PROPERTY GRAPH -Anweisung definiert werden.Labels werden im Schema statisch definiert. Wenn Sie Labels aktualisieren möchten, müssen Sie das Schema aktualisieren. Weitere Informationen finden Sie unter Spanner-Graphschema erstellen, aktualisieren oder löschen. |
Abfrage
Die Abfragefunktionen von Spanner Graph ähneln denen von openCypher. Die Unterschiede zwischen Spanner Graph und openCypher werden in diesem Abschnitt beschrieben.
Grafik angeben
In openCypher gibt es einen Standardgraphen, auf den Abfragen angewendet werden. In Spanner Graph können Sie mehrere Grafiken definieren. Eine Abfrage muss mit der GRAPH
-Klausel beginnen, um die abzufragende Grafik anzugeben. Beispiel:
GRAPH FinGraph
MATCH (p:Person)
RETURN p.name
ORDER BY p.name
LIMIT 1;
Weitere Informationen finden Sie in der Syntax für Diagrammabfragen.
Musterabgleich für Graphen
Spanner Graph unterstützt Funktionen zum Abgleichen von Graphmustern, die denen von openCypher ähneln. Die Unterschiede werden in den folgenden Abschnitten erläutert.
Eindeutigkeit von Beziehungen und TRAIL-Modus
In openCypher werden keine Ergebnisse mit sich wiederholenden Kanten in einer einzelnen Übereinstimmung zurückgegeben. In openCypher wird dies als Eindeutigkeit der Beziehung bezeichnet. In Spanner Graph werden standardmäßig wiederkehrende Kanten zurückgegeben. Wenn Eindeutigkeit erforderlich ist, verwenden Sie den Modus TRAIL
, um sicherzustellen, dass in der einzelnen Übereinstimmung keine sich wiederholenden Kanten vorhanden sind. Eine detaillierte Semantik von TRAIL
und anderen Pfadmodi finden Sie unter Pfadmodus.
Im folgenden Beispiel wird gezeigt, wie sich die Ergebnisse einer Abfrage im Modus TRAIL
ändern:
- Die Abfragen im
TRAIL
-Modus von openCypher und Spanner Graph geben keine Ergebnisse zurück, da der einzige mögliche Pfad darin besteht,t1
zweimal zu wiederholen. - Standardmäßig gibt die Spanner Graph-Abfrage einen gültigen Pfad zurück.
openCypher | Spanner Graph (TRAIL-Modus) | Spanner Graph (Standardmodus) | ||||
---|---|---|---|---|---|---|
MATCH (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]->(dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
GRAPH FinGraph MATCH TRAIL (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]->(dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
GRAPH FinGraph MATCH (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]-> (dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
||||
Leeres Ergebnis. | Leeres Ergebnis. | Ergebnis:
|
Diagramme als Abfrageergebnisse zurückgeben
openCypher | Cloud Spanner Graph |
---|---|
MATCH (account:Account) WHERE account.id = 16; RETURN account; |
GRAPH FinGraph MATCH (account:Account) WHERE account.id = 16; RETURN TO_JSON(account) AS account; |
In Spanner Graph werden in Abfrageergebnissen keine Graphenelemente zurückgegeben. Mit der Funktion TO_JSON
können Sie Grafikelemente als JSON zurückgeben.
Musterabgleich mit variabler Länge und Musterquantifizierung
Das Musterabgleich mit variabler Länge in openCypher wird in Spanner Graph als Pfadquantifizierung bezeichnet. Für die Pfadquantifizierung wird eine andere Syntax verwendet, wie im folgenden Beispiel gezeigt. Weitere Informationen finden Sie unter Quantifiziertes Pfadmuster.
openCypher | Cloud Spanner Graph |
---|---|
MATCH (src:Account)-[:Transfers*1..2]->(dst:Account) WHERE src.id = 16 RETURN dst.id ORDER BY dst.id; |
GRAPH FinGraph MATCH (src:Account)-[:Transfers]->{1,2}(dst:Account) WHERE src.id = 16 RETURN dst.id ORDER BY dst.id; |
Muster mit variabler Länge: Liste von Elementen
Mit Spanner Graph können Sie direkt auf die Variablen zugreifen, die in Pfadquantifizierungen verwendet werden. Im folgenden Beispiel entspricht e
in Spanner Graph edges(p)
in openCypher.
openCypher | Cloud Spanner Graph |
---|---|
MATCH p=(src:Account)-[:Transfers*1..3]->(dst:Account) WHERE src.id = 16 RETURN edges(p); |
GRAPH FinGraph MATCH (src:Account) -[e:Transfers]->{1,3} (dst:Account) WHERE src.id = 16 RETURN TO_JSON(e) AS e; |
Kürzester Pfad
openCypher bietet zwei integrierte Funktionen, um den kürzesten Pfad zwischen Knoten zu finden: shortestPath
und allShortestPath
.
shortestPath
ermittelt einen einzelnen kürzesten Pfad zwischen Knoten.allShortestPath
ermittelt alle kürzesten Pfade zwischen Knoten. Es können mehrere Pfade derselben Länge vorhanden sein.
In Spanner Graph wird eine andere Syntax verwendet, um einen einzelnen kürzesten Pfad zwischen Knoten zu finden: ANY SHORTEST
für shortestPath.
. Die Funktion allShortestPath
wird in Spanner Graph nicht unterstützt.
openCypher | Cloud Spanner Graph |
---|---|
MATCH (src:Account {id: 7}), (dst:Account {id: 20}), p = shortestPath((src)-[*1..10]->(dst)) RETURN length(p) AS path_length; |
GRAPH FinGraph MATCH ANY SHORTEST (src:Account {id: 7})-[e:Transfers]->{1, 3} (dst:Account {id: 20}) RETURN ARRAY_LENGTH(e) AS path_length; |
Anweisungen und Klauseln
In der folgenden Tabelle sind die openCypher-Klauseln aufgeführt. Außerdem wird angegeben, ob sie in Spanner Graph unterstützt werden.
openCypher | Cloud Spanner Graph | |
---|---|---|
MATCH |
Unterstützt. Weitere Informationen finden Sie unter Graphmusterabgleich. | |
OPTIONAL MATCH |
Unterstützt. Weitere Informationen finden Sie unter Graphmusterabgleich. | |
RETURN / WITH |
Unterstützt. Weitere Informationen finden Sie in der
RETURN -Anweisung und der
WITH -Anweisung.
Für komplexe Ausdrücke ist in Spanner Graph eine explizite Aliasierung erforderlich. |
|
Unterstützt. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear; |
|
Nicht unterstützt. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing |
|
WHERE |
Unterstützt. Weitere Informationen finden Sie in der Definition für Diagrammmuster. | |
ORDER BY |
Unterstützt. Weitere Informationen finden Sie in der
ORDER BY -Anweisung. |
|
SKIP / LIMIT |
Unterstützt. Weitere Informationen finden Sie in der
SKIP -Anweisung und der
LIMIT -Anweisung.Für Spanner Graph ist ein konstanter Ausdruck für den Offset und das Limit erforderlich. |
|
Unterstützt. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id SKIP @offsetParameter LIMIT 3; |
|
Nicht unterstützt. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id LIMIT VALUE { MATCH (m:Person) RETURN COUNT(*) AS count } AS count; -- Not a constant expression |
|
UNION |
Unterstützt. Weitere Informationen finden Sie unter Abfrage für zusammengesetzte Grafiken. | |
UNION ALL |
Unterstützt. Weitere Informationen finden Sie unter Abfrage für zusammengesetzte Grafiken. | |
UNWIND |
Unterstützt durch die FOR -Anweisung. |
|
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
MANDATORY MATCH |
Nicht unterstützt. | |
CALL[YIELD...] |
Nicht unterstützt. | |
CREATE , DELETE , SET , REMOVE , MERGE |
Weitere Informationen finden Sie im Abschnitt Mutation und unter Daten in Spanner-Graphen einfügen, aktualisieren oder löschen. |
Datentypen
Spanner Graph unterstützt alle GoogleSQL-Datentypen. Weitere Informationen finden Sie unter Datentypen in GoogleSQL.
In den folgenden Abschnitten werden openCypher-Datentypen mit Spanner Graph-Datentypen verglichen.
Strukturtyp
Attributtyp
openCypher | Cloud Spanner Graph |
---|---|
INT |
INT64 |
FLOAT |
FLOAT64 |
STRING |
STRING |
BOOLEAN |
BOOL |
LIST Eine homogene Liste einfacher Typen. Beispiel: Liste von INT , Liste von STRING .INT und STRING können nicht in einer einzigen Liste kombiniert werden. |
ARRAY |
Zusammengesetzter Typ
Spanner Graph unterstützt keine heterogenen Listen verschiedener Typen oder Zuordnungen einer dynamischen Schlüsselliste und heterogener Elementwerttypen. Verwenden Sie für diese Anwendungsfälle JSON.
Typumwandlung
openCypher | Cloud Spanner Graph |
---|---|
INT -> FLOAT |
Unterstützt. |
Weitere Informationen zu Typkonvertierungsregeln finden Sie unter Konvertierungsregeln in GoogleSQL.
Funktionen und Ausdrücke
Neben Graphfunktionen und ‑ausdrücken unterstützt Spanner Graph auch alle integrierten Funktionen und Ausdrücke von GoogleSQL.
In diesem Abschnitt werden openCypher-Funktionen und ‑Ausdrücke sowie ihre Entsprechungen in Spanner Graph aufgeführt.
Funktionen und Ausdrücke für strukturelle Typen
Typ | openCypher -Funktion oder ‑Ausdruck |
Spanner Graph Funktion oder Ausdruck |
|
---|---|---|---|
Knoten und Kante |
exists(n.prop) |
PROPERTY_EXISTS(n, prop) |
|
id (gibt Ganzzahl zurück) |
Nicht unterstützt. | ||
properties |
TO_JSON |
||
keys (Namen von Property-Typen, aber keine Property-Werte) |
PROPERTY_NAMES |
||
labels |
LABELS |
||
Edge | endNode |
Nicht unterstützt. | |
startNode |
Nicht unterstützt. | ||
type |
LABELS |
||
Pfad | length |
Nicht unterstützt. | |
nodes |
Nicht unterstützt. | ||
relationships |
Nicht unterstützt. | ||
Knoten und Kante | .
|
. |
|
[]
|
Nicht unterstützt. | ||
Muster als Ausdruck | size(pattern) |
Nicht unterstützt. Verwenden Sie eine Unterabfrage wie die folgende:
|
Funktionen und Ausdrücke für Property-Typen
Typ | openCypher -Funktion oder ‑Ausdruck |
Spanner Graph Funktion oder Ausdruck |
|
---|---|---|---|
Skalar | coalesce |
COALESCE |
|
head |
ARRAY_FIRST |
||
last |
ARRAY_LAST |
||
size(list) |
ARRAY_LENGTH |
||
size(string) |
LENGTH |
||
timestamp |
UNIX_MILLIS(CURRENT_TIMESTAMP()) |
||
toBoolean /toFloat /toInteger |
CAST(expr AS type) |
||
Aggregat | avg |
AVG |
|
collect |
ARRAY_AGG |
||
count
| COUNT |
||
max |
MAX |
||
min |
MIN |
||
percentileCont |
PERCENTILE_CONT |
||
percentileDisc |
PERCENTILE_DISC |
||
stDev |
STDDEV |
||
stDevP |
Nicht unterstützt. | ||
sum |
SUM |
||
Liste | range |
GENERATE_ARRAY |
|
reverse |
ARRAY_REVERSE |
||
tail |
Spanner Graph unterstützt tail nicht.Verwenden Sie stattdessen ARRAY_SLICE und ARRAY_LENGTH . |
||
Mathematische Daten | abs |
ABS |
|
ceil |
CEIL |
||
floor |
FLOOR |
||
rand |
RAND |
||
round |
ROUND |
||
sign |
SIGN |
||
e |
EXP(1) |
||
exp |
EXP |
||
log |
LOG |
||
log10 |
LOG10 |
||
sqrt |
SQRT |
||
acos |
ACOS |
||
asin |
ASIN |
||
atan |
ATAN |
||
atan2 |
ATAN2 |
||
cos |
COS |
||
cot |
COT |
||
degrees |
r * 90 / ASIN(1) |
||
pi |
ACOS(-1) |
||
radians |
d * ASIN(1) / 90 |
||
sin |
SIN |
||
tan |
TAN |
||
String | left |
LEFT |
|
ltrim |
LTRIM |
||
replace |
REPLACE |
||
reverse |
REVERSE |
||
right |
RIGHT |
||
rtrim |
RTRIM |
||
split |
SPLIT |
||
substring |
SUBSTR |
||
tolower |
LOWER |
||
tostring |
CAST(expr AS STRING) |
||
toupper |
UPPER |
||
trim |
TRIM |
||
DISTINCT | DISTINCT |
DISTINCT |
|
Mathematische Daten | + |
+ |
|
- |
- |
||
* |
* |
||
/ |
/ |
||
% |
MOD |
||
^ |
POW |
||
Vergleich | = |
= |
|
<> |
<> |
||
< |
< |
||
> |
> |
||
<= |
<= |
||
>= |
>= |
||
IS [NOT] NULL |
IS [NOT] NULL |
||
Vergleichskette
|
Spanner Graph unterstützt keine Vergleichskette. Dies entspricht Vergleichen, die mit AND verknüpft sind. Beispiel:
|
||
Boolesch | AND |
AND |
|
OR |
OR |
||
XOR |
XOR wird von Spanner Graph nicht unterstützt. Schreiben Sie die Abfrage mit <> .Beispiel:
|
||
NOT |
NOT |
||
String | STARTS WITH |
STARTS_WITH |
|
ENDS WITH |
ENDS_WITH |
||
CONTAINS |
REGEXP_CONTAINS |
||
+ |
CONCAT |
||
Liste | + |
ARRAY_CONCAT |
|
IN |
ARRAY_INCLUDES |
||
[] |
[] |
Andere Ausdrücke
openCypher | Cloud Spanner Graph |
---|---|
Fallausdruck | Unterstützt. |
Unterabfrage „Ist vorhanden“ | Unterstützt. |
Kartenprojektion | Nicht unterstützt.STRUCT -Typen bieten ähnliche Funktionen. |
Listenverständnis | Nicht unterstützt.GENERATE_ARRAY und ARRAY_TRANSFORM decken die meisten Anwendungsfälle ab. |
Abfrageparameter
Die folgenden Abfragen zeigen den Unterschied zwischen der Verwendung von Parametern in openCypher und in Spanner Graph.
openCypher | Cloud Spanner Graph | |
---|---|---|
Parameter | MATCH (n:Person) WHERE n.id = $id RETURN n.name; |
GRAPH FinGraph MATCH (n:Person) WHERE n.id = @id RETURN n.name; |
Mutation
In Spanner Graph werden die Knoten- und Kanteneingabetabellen mithilfe der GoogleSQL-DML mutiert. Weitere Informationen finden Sie unter Spanner-Graph-Daten einfügen, aktualisieren oder löschen.
Knoten und Kante erstellen
openCypher | Cloud Spanner Graph | |
---|---|---|
Knoten und Kanten erstellen | CREATE (:Person {id: 100, name: 'John'}); CREATE (:Account {id: 1000, is_blocked: FALSE}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
Knoten und Kanten mit Abfrageergebnissen erstellen |
MATCH (a:Account {id: 1}), (oa:Account) WHERE oa <> a CREATE (a)-[:Transfers {amount: 100, create_time: timestamp()}]->(oa); |
INSERT INTO AccountTransferAccount(id, to_id, create_time, amount) SELECT a.id, oa.id, CURRENT_TIMESTAMP(), 100 FROM GRAPH_TABLE( FinGraph MATCH (a:Account {id:1000}), (oa:Account) WHERE oa <> a ); |
In Spanner Graph werden die Labels gemäß der DDL-Anweisung CREATE PROPERTY GRAPH
statisch zugewiesen.
Knoten und Kante aktualisieren
openCypher | Cloud Spanner Graph | |
---|---|---|
Unterkünfte aktualisieren | MATCH (p:Person {id: 100}) SET p.country = 'United States'; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100; |
Informationen zum Aktualisieren von Spanner-Graph-Labels finden Sie unter Spanner-Graph-Schema erstellen, aktualisieren oder löschen.
Knoten und Kante zusammenführen
openCypher | Cloud Spanner Graph | |
---|---|---|
Neues Element einfügen oder Eigenschaften aktualisieren | MERGE (p:Person {id: 100, country: 'United States'}); |
INSERT OR UPDATE INTO Person (id, country) VALUES (100, 'United States'); |
Knoten und Kante löschen
Das Löschen von Kanten entspricht dem Löschen der Eingabetabelle.
openCypher | Cloud Spanner Graph | |
---|---|---|
Knoten und Kanten löschen | MATCH (p:Person {id:100}), (a:Account {id:1000}) DELETE (p)-[:Owns]->(a); |
DELETE PersonOwnAccount WHERE id = 100 AND account_id = 1000; |
Beim Löschen von Knoten müssen potenzielle lose Kanten behandelt werden. Wenn DELETE CASCADE
angegeben ist, entfernt DELETE
die zugehörigen Kanten von Knoten wie DETACH DELETE
in openCypher. Weitere Informationen finden Sie unter Spanner-Schema – Übersicht.
openCypher | Cloud Spanner Graph | |
---|---|---|
Knoten und zugehörige Kanten löschen | DETACH DELETE (:Account {id: 1000}); |
DELETE Account WHERE id = 1000; |
Mutationsergebnisse zurückgeben
openCypher | Cloud Spanner Graph | |
---|---|---|
Ergebnisse nach dem Einfügen oder Aktualisieren zurückgeben | MATCH (p:Person {id: 100}) SET p.country = 'United States' RETURN p.id, p.name; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100 THEN RETURN id, name; |
Ergebnisse nach dem Löschen zurückgeben | DELETE (p:Person {id: 100}) RETURN p.country; |
DELETE FROM Person WHERE id = 100 THEN RETURN country; |