Spanner Graph-Referenz für openCypher-Nutzer

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-Pfad

Wenn 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.

Beispieldiagramm

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:
src_id dst_id
16 20

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

openCypher Cloud Spanner Graph
Knoten Knoten
Edge Edge
Pfad Pfad

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

openCypher Cloud Spanner Graph
LIST ARRAY oder JSON
MAP STRUCT oder JSON

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 .
property reference
.
[]
dynamic property reference
MATCH (n)
RETURN n[n.name]

Nicht unterstützt.
Muster als Ausdruck size(pattern) Nicht unterstützt. Verwenden Sie eine Unterabfrage wie die folgende:
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

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
a < b < c

Spanner Graph unterstützt keine Vergleichskette. Dies entspricht Vergleichen, die mit AND verknüpft sind.
Beispiel:

      a < b AND b < C
      

Boolesch AND AND
OR OR
XOR
XOR wird von Spanner Graph nicht unterstützt. Schreiben Sie die Abfrage mit <>.

Beispiel:
      boolean_1 <> boolean_2
      

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});

MATCH (p:Person {id: 100}), (a:Account {id: 1000}) CREATE (p)-[:Owns {create_time: timestamp()}]->(a);
INSERT INTO
Person (id, name)
VALUES (100, "John");

INSERT INTO Account (id, is_blocked) VALUES (1000, FALSE);
INSERT INTO PersonOwnAccount (id, account_id, create_time) VALUES (100, 1000, CURRENT_TIMESTAMP());
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;

Nächste Schritte