<ph type="x-smartling-placeholder">
In diesem Dokument wird openCypher und Spanner Graph in den folgenden Beispielen verglichen: Möglichkeiten:
- Terminologie
- Datenmodell
- Schema
- Abfrage
- Mutation
In diesem Dokument wird vorausgesetzt, dass Sie mit openCypher v9 an.
Hinweise
Spanner Graph mit der Google Cloud Console einrichten und abfragen
Terminologie
openCypher | Cloud Spanner Graph |
---|---|
Knoten | Knoten |
Beziehungen | Kanten |
Knotenlabels | Knotenlabels |
Beziehungstypen | Edge-Labels |
Klauseln | In Spanner Graph wird der Begriff statement für eine vollständige Einheit
Ausführung und clause für einen Modifikator für Anweisungen.Beispielsweise ist MATCH eine Anweisung, während
WHERE ist eine Klausel. |
Eindeutigkeit von Beziehungen openCypher gibt keine Ergebnisse mit sich wiederholenden Kanten in einem einzigen Übereinstimmung. |
TRAIL-Pfad Wenn Eindeutigkeit im Spanner-Diagramm erwünscht ist, verwenden TRAIL -Modus, um eindeutige Kanten in einer einzelnen Übereinstimmung zurückzugeben.
|
Einhaltung von Standards
Spanner Graph übernimmt ISO Grafikabfragesprache (GQL) und SQL-/Property-Diagramm-Abfragen (SQL/PGQ).
Datenmodell
Sowohl Spanner Graph als auch openCypher übernehmen das Attributgrafik-Datenmodell mit einige Unterschiede.
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 Graph-Schema muss explizit mithilfe der Methode
CREATE PROPERTY GRAPH -Anweisung:Labels werden im Schema statisch definiert. Um Labels zu aktualisieren, das Schema aktualisieren. Weitere Informationen finden Sie unter Spanner-Diagrammschema erstellen, aktualisieren oder löschen. |
Abfrage
Die Abfragefunktionen von Spanner Graph sind denen von openCypher ähnlich. Die Unterschiede zwischen Spanner Graph und openCypher werden unter diesem Abschnitt.
Grafik angeben
In openCypher gibt es eine Standardgrafik und Abfragen verwenden die Standardgrafik
Diagramm. In Spanner Graph können Sie mehr als einen Graphen und eine Abfrage definieren
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 unter Syntax von Graphabfragen.
Musterabgleich grafisch darstellen
Spanner Graph unterstützt ähnliche Funktionen zum Abgleich von Diagrammmustern wie openCypher aus. Die Unterschiede werden in den folgenden Abschnitten erläutert.
Eindeutigkeit von Beziehungen und TRAIL-Modus
openCypher gibt keine Ergebnisse mit sich wiederholenden Kanten in einer einzelnen Übereinstimmung zurück. dies
wird in openCypher als Eindeutigkeit von Beziehungen bezeichnet. Im Spanner-Diagramm
sich wiederholende Kanten werden standardmäßig zurückgegeben. Wenn Eindeutigkeit gewünscht ist, verwenden Sie
Modus TRAIL
, um sicherzustellen, dass in der einzelnen Übereinstimmung keine sich wiederholende Kante vorhanden ist. Für
Detaillierte Semantik von TRAIL
und anderen Pfadmodi finden Sie unter
Pfadmodus:
Das folgende Beispiel zeigt, wie sich die Ergebnisse einer Abfrage im TRAIL
-Modus ändern:
- Bei Abfragen im
TRAIL
-Modus von openCypher und Spanner Graph wird ein leerer Wert zurückgegeben Ergebnisse, weil der einzig mögliche Weg darin besteht,t1
zweimal zu wiederholen. - Standardmäßig gibt die Spanner Graph-Abfrage einen gültigen Pfad zurück.
openCypher | Spanner-Diagramm (TRAIL-Modus) | Spanner-Diagramm (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:
|
Grafikelemente 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; |
Im Spanner-Diagramm werden bei Abfrageergebnissen keine Graph-Elemente zurückgegeben. Verwenden Sie die Methode
TO_JSON
-Funktion, um Graph-Elemente als JSON zurückzugeben.
Musterabgleich und Musterquantifizierung mit variabler Länge
Der Musterabgleich mit variabler Länge wird in openCypher als Pfadquantifizierung bezeichnet. im Spanner-Diagramm. Für die Pfadquantifizierung wird eine andere Syntax verwendet, wie hier gezeigt: im folgenden Beispiel. 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 im Pfad verwendeten Variablen zugreifen
Quantifizierungen. Im folgenden Beispiel ist e
in Spanner Graph identisch
als 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 verfügt über zwei integrierte Funktionen, um den kürzesten Pfad zwischen Knoten zu finden:
shortestPath
und allShortestPath
.
shortestPath
findet einen einzelnen kürzesten Pfad zwischen Knoten.allShortestPath
findet die kürzesten Pfade zwischen Knoten. Es kann mehrere Pfade derselben Länge sein.
Spanner Graph verwendet eine andere Syntax, um einen einzelnen kürzesten Pfad zu finden
zwischen Knoten: ANY SHORTEST
für shortestPath.
allShortestPath
wird 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 und es wird angegeben, ob werden sie in Spanner Graph unterstützt.
openCypher | Cloud Spanner Graph | |
---|---|---|
VERGLEICH | Unterstützt. Weitere Informationen finden Sie unter Diagrammmusterabgleich. | |
OPTIONALE ÜBEREINSTIMMUNG | Unterstützt. Weitere Informationen finden Sie unter Diagrammmusterabgleich. | |
RÜCKGABE / MIT |
Unterstützt. Weitere Informationen finden Sie in der
RETURN-Anweisung und die
WITH-Anweisung.
Spanner Graph erfordert ein explizites Aliasing für komplizierte Ausdrücke. |
|
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. | |
ÜBERSPRINGEN / LIMIT |
Unterstützt. Weitere Informationen finden Sie in der
SKIP-Anweisung und die
LIMIT-Anweisung. Spanner Graph erfordert einen konstanten Ausdruck für den Offset und den Grenzwert. |
|
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 Grafik. | |
UNION ALLE | Unterstützt. Weitere Informationen finden Sie unter Abfrage für zusammengesetzte Grafik. | |
WINDKRAFT ENTWICKELN | Unterstützt durch FOR-Anweisung. | |
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
ERFORDERLICHE ÜBEREINSTIMMUNG | Nicht unterstützt. | |
[ERTRAG...] ANRUFEN | Nicht unterstützt. | |
ERSTELLEN, LÖSCHEN, SETZEN, ENTFERNEN, Zusammenführen | Weitere Informationen finden Sie im Abschnitt Mutation und Daten im Spanner-Diagramm 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-Diagrammdaten verglichen Typen.
Strukturtyp
openCypher | Cloud Spanner Graph |
---|---|
Knoten | Knoten |
Edge | Edge |
Pfad | Nicht unterstützt. |
Attributtyp
openCypher | Cloud Spanner Graph |
---|---|
GANZZAHL | INT64 |
FLOAT | FLOAT64 |
STRING | STRING |
BOOLEAN | BOOL |
LISTE Eine homogene Liste einfacher Typen. Beispiel: Liste mit INT, Liste mit STRING. INT und STRING können nicht in einer Liste kombiniert werden. |
ARRAY |
Zusammengesetzter Typ
openCypher | Cloud Spanner Graph |
---|---|
LISTE | ARRAY oder JSON |
MAP | STRUCT oder JSON |
Spanner Graph unterstützt keine heterogenen Listen verschiedener Typen oder Eine Zuordnung einer dynamischen Schlüsselliste und heterogener Elementwerttypen. Verwenden Sie JSON für diese Anwendungsfälle.
Typerzwingung
openCypher | Cloud Spanner Graph |
---|---|
INT -> GLEITKOMMAZAHL | Unterstützt. |
Weitere Informationen zu Typkonvertierungsregeln finden Sie unter Konvertierungsregeln in GoogleSQL
Funktionen und Ausdrücke
Neben Graphfunktionen und -ausdrücken unterstützt auch alle in GoogleSQL integrierten Funktionen und Ausdrücke.
Eine vollständige Liste der Funktionen und Ausdrücke finden Sie unter GoogleSQL-Funktionen, -Operatoren und -Bedingungen.
In diesem Abschnitt werden openCypher-Funktionen und -Ausdrücke sowie deren in Spanner-Grafik angezeigt.
Strukturtypfunktionen und -ausdrücke
Typ | openCypher Funktion oder Ausdruck |
Spanner-Diagramm Funktion oder Ausdruck |
|
---|---|---|---|
Knoten und Edge |
exists(n.prop) | property_exists(n; prop) | |
id(gibt Ganzzahl zurück) | Nicht unterstützt. | ||
properties | to_json |
||
Schlüssel (Namen der Property-Typen, aber keine Property-Werte) |
property_names |
||
Labels | labels | ||
Edge | endNode | Nicht unterstützt. | |
startNode | Nicht unterstützt. | ||
Typ | Labels | ||
Pfad | Zeitfenster | Nicht unterstützt. | |
Knoten | Nicht unterstützt. | ||
Beziehungen | Nicht unterstützt. | ||
Knoten und Edge | Property-Referenz |
. | |
[] Referenz zu dynamischen Attributen
|
Nicht unterstützt. | ||
Muster als Ausdruck | Größe(Muster) | Nicht unterstützt. Verwenden Sie eine Unterabfrage so:
|
Attributtyp-Funktionen und -Ausdrücke
Typ | openCypher Funktion oder Ausdruck |
Spanner-Diagramm Funktion oder Ausdruck |
|
---|---|---|---|
Skalar | Koalesce | Koalesce | |
head | array_first | ||
letzten | array_last | ||
Größe(Liste) | array_length | ||
Größe(String) | Zeitfenster | ||
timestamp | unix_millis(current_timestamp()) | ||
toBoolean/toFloat/toInteger | Cast( |
||
Aggregat | durchschn. | durchschn. | |
collect | array_agg | ||
Anzahl | Anzahl | ||
max | max | ||
Min. | Min. | ||
percentileCont | percentile_cont | ||
percentileDisc | percentile_disc | ||
stDev | Standardabweichung | ||
stDevP | stdev_pop | ||
Summe | Summe | ||
Liste | Bereich | generate_array | |
reverse | array_reverse | ||
Tail | tail wird von Spanner Graph nicht unterstützt.Verwenden Sie array_slice und array_length .
. |
||
Mathematische Daten | Bauchmuskeln | Bauchmuskeln | |
Ceil | Ceil | ||
Boden | Boden | ||
Rand | Rand | ||
Rund | Rund | ||
Signieren | Signieren | ||
e | exp(1) | ||
exp | exp | ||
log | log | ||
log10 | log10 | ||
Quadrat | Quadrat | ||
Acos | Acos | ||
Asin | Asin | ||
Atan | Atan | ||
atan2 | atan2 | ||
cos | cos | ||
cot | cot | ||
Grad | r * 90 / asin(1) | ||
Pi | Pi | ||
Bogenmaß | d * asin(1) / 90 | ||
Sinus | Sinus | ||
Hellbraun | Hellbraun | ||
String | links | links | |
ltrim | ltrim | ||
Ersetzen | Ersetzen | ||
reverse | reverse | ||
rechts | rechts | ||
RTRM | RTRM | ||
split | split | ||
Teilzeichenfolge | substr | ||
Tolower | niedriger | ||
Tostring | cast( |
||
Toupper | upper | ||
schneiden | schneiden | ||
DISTINCT | DISTINCT | DISTINCT | |
Mathematische Daten | + | + | |
- | - | ||
* | * | ||
/ | / | ||
% | MOD | ||
^ | POW | ||
Vergleich | = | = | |
<> | <> | ||
< | < | ||
> | > | ||
<= | <= | ||
>= | >= | ||
IST [NICHT] NULL | IST [NICHT] NULL | ||
Vergleichskette
|
Spanner-Diagramm
unterstützt keine Vergleichskette. Dies entspricht
Vergleiche, die mit AND verbunden sind. Beispiel:
|
||
Boolesch | UND | UND | |
ODER | ODER | ||
XODER |
Spanner-Diagramm
unterstützt XOR nicht. Schreiben Sie die Abfrage mit <> .Beispiel:
|
||
NOT | NOT | ||
String | Beginnt mit | starts_with | |
ENDET MIT | ends_with | ||
CONTAINS | regexp_contains | ||
+ | string_concat | ||
Liste | + | array_concat | |
IN | array_includes | ||
[] | [] |
Andere Ausdrücke
openCypher | Cloud Spanner Graph |
---|---|
Groß-/Kleinschreibungsausdruck | Unterstützt. |
Unterabfrage 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 in „openCypher“ und im 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
Spanner Graph verwendet GoogleSQL DML, um die Knoten- und Edge-Eingabetabellen zu ändern. Weitere Informationen finden Sie unter Daten des Spanner-Diagramms einfügen, aktualisieren oder löschen
Knoten und Edge 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 ); |
Im Spanner-Diagramm werden die Labels gemäß der
CREATE PROPERTY GRAPH
.
Knoten und Edge aktualisieren
openCypher | Cloud Spanner Graph | |
---|---|---|
Attribute 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-Diagrammlabels finden Sie unter Erstellen, aktualisieren oder löschen Sie ein Spanner-Diagrammschema.
Knoten und Edge verbinden
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 Edge löschen
Das Löschen der 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; |
Das Löschen von Knoten erfordert den Umgang mit potenziell hängenden Kanten. Wenn DELETE CASCADE
angegeben ist, entfernt DELETE
die zugehörigen Kanten von
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; |