Questo documento mette a confronto openCypher e Spanner Graph nei seguenti modi:
- Terminologia
- Modello dati
- Schema
- Query
- Mutazione
Questo documento presuppone che tu abbia familiarità con openCypher v9.
Prima di iniziare
Configura ed esegui query su Spanner Graph utilizzando la console Google Cloud.
Terminologia
openCypher | Spanner Graph |
---|---|
nodi | nodi |
relazioni | bordi |
etichette dei nodi | etichette dei nodi |
tipi di relazioni | etichette dei bordi |
clausole | Spanner Graph utilizza il termine statement per un'unità completa di
esecuzione e clause per un modificatore delle istruzioni.Ad esempio, MATCH è un'istruzione, mentre
WHERE è una clausola. |
Unicità delle relazioni openCypher non restituisce risultati con archi ripetuti in una singola corrispondenza. |
Percorso TRAIL Quando è richiesta unicità in Spanner Graph, utilizza la TRAIL modalità per restituire spigoli univoci in una singola corrispondenza.
|
Conformità agli standard
Spanner Graph adotta gli standard ISO Graph Query Language (GQL) e SQL/Property Graph Queries (SQL/PGQ).
Modello dati
Sia Spanner Graph che openCypher adottano il modello dei dati del grafo delle proprietà con alcune differenze.
openCypher | Spanner Graph |
---|---|
Ogni relazione ha un solo tipo di relazione. |
Sia i nodi che gli archi hanno una o più etichette. |
Schema
openCypher | Spanner Graph |
---|---|
Un grafico non ha uno schema predefinito. | Uno schema di grafo deve essere definito esplicitamente utilizzando l'istruzione CREATE PROPERTY GRAPH .Le etichette sono definite in modo statico nello schema. Per aggiornare le etichette, è necessario aggiornare lo schema. Per ulteriori informazioni, vedi Creare, aggiornare o eliminare uno schema di Spanner Graph. |
Query
Le funzionalità di query di Spanner Graph sono simili a quelle di openCypher. Le differenze tra Spanner Graph e openCypher sono descritte in questa sezione.
Specifica il grafico
In openCypher esiste un grafo predefinito e le query vengono eseguite su questo grafo. In Spanner Graph puoi definire più di un grafo e una query deve iniziare con la clausola GRAPH
per specificare il grafo su cui eseguire la query. Ad esempio:
GRAPH FinGraph
MATCH (p:Person)
RETURN p.name
ORDER BY p.name
LIMIT 1;
Per ulteriori informazioni, consulta la sintassi delle query sui grafici.
Corrispondenza di pattern dei grafici
Spanner Graph supporta funzionalità di corrispondenza di pattern di grafici simili a quelle di openCypher. Le differenze sono spiegate nelle sezioni seguenti.
Unicità della relazione e modalità TRAIL
openCypher non restituisce risultati con archi ripetuti in una singola corrispondenza. In openCypher, questo viene chiamato unicità della relazione. In Spanner Graph,
gli spigoli ripetuti vengono restituiti per impostazione predefinita. Se vuoi che la corrispondenza sia univoca, utilizza la modalità
TRAIL
per assicurarti che non esista un bordo ripetuto nella singola corrispondenza. Per la semantica dettagliata di TRAIL
e di altre modalità di percorso diverse, consulta Modalità percorso.
L'esempio seguente mostra come cambiano i risultati di una query con la modalità TRAIL
:
- Le query in modalità
TRAIL
di openCypher e Spanner Graph restituiscono risultati vuoti perché l'unico percorso possibile è ripeteret1
due volte. - Per impostazione predefinita, la query Spanner Graph restituisce un percorso valido.
openCypher | Grafo Spanner (modalità TRAIL) | Grafo Spanner (modalità predefinita) | ||||
---|---|---|---|---|---|---|
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; |
||||
Risultato vuoto. | Risultato vuoto. | Risultato:
|
Restituire gli elementi del grafico come risultati della query
openCypher | 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, i risultati delle query non restituiscono elementi del grafo. Utilizza la funzione
TO_JSON
per restituire gli elementi del grafico come JSON.
Corrispondenza di pattern di lunghezza variabile e quantificazione dei pattern
La corrispondenza di pattern di lunghezza variabile in openCypher è chiamata quantificazione del percorso in Spanner Graph. La quantificazione del percorso utilizza una sintassi diversa, come mostrato nel seguente esempio. Per ulteriori informazioni, consulta Pattern di percorso quantificato.
openCypher | 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; |
Pattern di lunghezza variabile: elenco di elementi
Spanner Graph ti consente di accedere direttamente alle variabili utilizzate nelle quantificazioni dei percorsi. Nell'esempio seguente, e
in Spanner Graph è uguale a edges(p)
in openCypher.
openCypher | 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; |
Percorso più breve
openCypher ha due funzioni integrate per trovare il percorso più breve tra i nodi:
shortestPath
e allShortestPath
.
shortestPath
trova un singolo percorso più breve tra i nodi.allShortestPath
trova tutti i percorsi più brevi tra i nodi. Possono esserci più percorsi della stessa lunghezza.
Spanner Graph utilizza una sintassi diversa per trovare un singolo percorso più breve tra i nodi: ANY SHORTEST
per shortestPath.
. La funzione allShortestPath
non è supportata in Spanner Graph.
openCypher | 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; |
Dichiarazioni e clausole
La tabella seguente elenca le clausole openCypher e indica se sono supportate o meno in Spanner Graph.
openCypher | Spanner Graph | |
---|---|---|
MATCH |
Supportato. Per ulteriori informazioni, consulta la sezione Corrispondenza di pattern di grafici. | |
OPTIONAL MATCH |
Supportato. Per ulteriori informazioni, consulta la sezione Corrispondenza di pattern di grafici. | |
RETURN / WITH |
Supportato. Per ulteriori informazioni, consulta l'
istruzione RETURN e l'
istruzione WITH .
Spanner Graph richiede l'aliasing esplicito per le espressioni complesse. |
|
Supportato. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear; |
|
Non supportato. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing |
|
WHERE |
Supportato. Per ulteriori informazioni, consulta la definizione di pattern grafico. | |
ORDER BY |
Supportato. Per ulteriori informazioni, consulta la
ORDER BY dichiarazione. |
|
SKIP / LIMIT |
Supportato. Per ulteriori informazioni, consulta l'
istruzione SKIP e l'
istruzione LIMIT .Spanner Graph richiede un'espressione costante per l'offset e il limite. |
|
Supportato. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id SKIP @offsetParameter LIMIT 3; |
|
Non supportato. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id LIMIT VALUE { MATCH (m:Person) RETURN COUNT(*) AS count } AS count; -- Not a constant expression |
|
UNION |
Supportato. Per ulteriori informazioni, consulta Query sul grafo composito. | |
UNION ALL |
Supportato. Per ulteriori informazioni, consulta Query sul grafo composito. | |
UNWIND |
Supportato dalla dichiarazione FOR . |
|
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
MANDATORY MATCH |
Non supportati. | |
CALL[YIELD...] |
Non supportati. | |
CREATE , DELETE , SET ,
REMOVE , MERGE |
Per saperne di più, consulta la sezione Mutazioni e Inserire, aggiornare o eliminare dati in Spanner Graph. |
Tipi di dati
Spanner Graph supporta tutti i tipi di dati GoogleSQL. Per maggiori informazioni, consulta Tipi di dati in GoogleSQL.
Le sezioni seguenti confrontano i tipi di dati openCypher con i tipi di dati di Spanner Graph.
Tipo di struttura
openCypher | Spanner Graph |
---|---|
Nodo | Nodo |
Edge | Edge |
Percorso | Non supportati. |
Tipo di proprietà
openCypher | Spanner Graph |
---|---|
INT |
INT64 |
FLOAT |
FLOAT64 |
STRING |
STRING |
BOOLEAN |
BOOL |
LIST Un elenco omogeneo di tipi semplici. Ad esempio, Elenco di INT , Elenco di STRING .Non puoi combinare INT e STRING in un unico elenco. |
ARRAY |
Tipo composito
openCypher | Spanner Graph |
---|---|
LIST |
ARRAY o JSON |
MAP |
STRUCT o JSON |
Spanner Graph non supporta elenchi eterogenei di tipi diversi o mappe di un elenco di chiavi dinamiche e tipi di valori degli elementi eterogenei. Utilizza JSON per questi casi d'uso.
Coercizione del tipo
openCypher | Spanner Graph |
---|---|
INT -> FLOAT |
Supportato. |
Per ulteriori informazioni sulle regole di conversione dei tipi, consulta Regole di conversione in GoogleSQL.
Funzioni ed espressioni
Oltre alle funzioni e alle espressioni di grafo, Spanner Graph supporta anche tutte le funzioni e le espressioni predefinite di GoogleSQL.
Questa sezione elenca le funzioni ed espressioni openCypher e i relativi equivalenti in Spanner Graph.
Funzioni ed espressioni di tipo strutturale
Tipo | Funzione o espressione openCypher |
Funzione o espressione di Spanner Graph |
|
---|---|---|---|
Nodi ed edge |
exists(n.prop) |
PROPERTY_EXISTS(n, prop) |
|
id (restituisce un numero intero) |
Non supportati. | ||
properties |
TO_JSON |
||
keys (nomi dei tipi di proprietà, ma non i valori delle proprietà) |
PROPERTY_NAMES |
||
labels |
LABELS |
||
Edge | endNode |
Non supportati. | |
startNode |
Non supportati. | ||
type |
LABELS |
||
Percorso | length |
Non supportati. | |
nodes |
Non supportati. | ||
relationships |
Non supportati. | ||
Nodi ed elementi | .
|
. |
|
[]
|
Non supportati. | ||
Pattern come espressione | size(pattern) |
Non supportati. Utilizza una sottoquery come segue
|
Funzioni ed espressioni per i tipi di proprietà
Tipo | Funzione o espressione openCypher |
Funzione o espressione di Spanner Graph |
|
---|---|---|---|
Scalare | 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) |
||
Aggregazione | avg |
AVG |
|
collect |
ARRAY_AGG |
||
count
| COUNT |
||
max |
MAX |
||
min |
MIN |
||
percentileCont |
PERCENTILE_CONT |
||
percentileDisc |
PERCENTILE_DISC |
||
stDev |
STDDEV |
||
stDevP |
Non supportati. | ||
sum |
SUM |
||
Elenco | range |
GENERATE_ARRAY |
|
reverse |
ARRAY_REVERSE |
||
tail |
Spanner Graph non supporta tail .Utilizza ARRAY_SLICE e ARRAY_LENGTH . |
||
Matematico | 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 |
||
Stringa | 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 |
|
Matematico | + |
+ |
|
- |
- |
||
* |
* |
||
/ |
/ |
||
% |
MOD |
||
^ |
POW |
||
Confronto | = |
= |
|
<> |
<> |
||
< |
< |
||
> |
> |
||
<= |
<= |
||
>= |
>= |
||
IS [NOT] NULL |
IS [NOT] NULL |
||
Catena di confronti
|
Spanner Graph
non supporta una catena di confronti. È equivalente ai confronti congiunti con AND . Ad esempio:
|
||
Booleano | AND |
AND |
|
OR |
OR |
||
XOR |
Spanner Graph
non supporta XOR . Scrivi la query con <> .Ad esempio:
|
||
NOT |
NOT |
||
Stringa | STARTS WITH |
STARTS_WITH |
|
ENDS WITH |
ENDS_WITH |
||
CONTAINS |
REGEXP_CONTAINS |
||
+ |
CONCAT |
||
Elenco | + |
ARRAY_CONCAT |
|
IN |
ARRAY_INCLUDES |
||
[] |
[] |
Altre espressioni
openCypher | Spanner Graph |
---|---|
Espressione di caso | Supportato. |
Sottoquery Exists | Supportato. |
Proiezione della mappa | Non supportati.I tipi STRUCT forniscono funzionalità simili. |
Comprensione elenco | Non supportati.GENERATE_ARRAY e ARRAY_TRANSFORM coprono la maggior parte dei casi d'uso. |
Parametro di ricerca
Le seguenti query mostrano la differenza tra l'utilizzo dei parametri in openCypher e in Spanner Graph.
openCypher | Spanner Graph | |
---|---|---|
Parametro | MATCH (n:Person) WHERE n.id = $id RETURN n.name; |
GRAPH FinGraph MATCH (n:Person) WHERE n.id = @id RETURN n.name; |
Mutazione
Spanner Graph utilizza il linguaggio DML di GoogleSQL per modificare le tabelle di input di nodi e archi. Per ulteriori informazioni, consulta Inserire, aggiornare o eliminare i dati di Spanner Graph.
Crea nodo ed edge
openCypher | Spanner Graph | |
---|---|---|
Crea nodi ed archi | CREATE (:Person {id: 100, name: 'John'}); CREATE (:Account {id: 1000, is_blocked: FALSE}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
Creare nodi ed archi con i risultati della query |
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, le etichette vengono assegnate in modo statico in base all'CREATE PROPERTY GRAPH
istruzione DDL.
Aggiorna nodo ed elica
openCypher | Spanner Graph | |
---|---|---|
Aggiorna proprietà | MATCH (p:Person {id: 100}) SET p.country = 'United States'; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100; |
Per aggiornare le etichette del grafo Spanner, consulta Creare, aggiornare o eliminare uno schema del grafo Spanner.
Unisci nodo e bordo
openCypher | Spanner Graph | |
---|---|---|
Inserisci un nuovo elemento o aggiorna le proprietà | MERGE (p:Person {id: 100, country: 'United States'}); |
INSERT OR UPDATE INTO Person (id, country) VALUES (100, 'United States'); |
Elimina nodo ed edge
L'eliminazione degli spigoli equivale all'eliminazione della tabella di input.
openCypher | Spanner Graph | |
---|---|---|
Eliminare nodi ed archi | MATCH (p:Person {id:100}), (a:Account {id:1000}) DELETE (p)-[:Owns]->(a); |
DELETE PersonOwnAccount WHERE id = 100 AND account_id = 1000; |
L'eliminazione dei nodi richiede la gestione di potenziali bordi inutilizzati. Quando viene specificato DELETE CASCADE
, DELETE
rimuove gli archi associati ai nodi come DETACH DELETE
in openCypher. Per ulteriori informazioni, consulta la panoramica dello schema di Spanner.
openCypher | Spanner Graph | |
---|---|---|
Eliminare i nodi e gli archi associati | DETACH DELETE (:Account {id: 1000}); |
DELETE Account WHERE id = 1000; |
Restituire i risultati della mutazione
openCypher | Spanner Graph | |
---|---|---|
Restituire i risultati dopo l'inserimento o l'aggiornamento | 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; |
Restituire i risultati dopo l'eliminazione | DELETE (p:Person {id: 100}) RETURN p.country; |
DELETE FROM Person WHERE id = 100 THEN RETURN country; |