Questo documento mette a confronto openCypher e Spanner Graph nei seguenti modi:
- Terminologia
- Modello dati
- Schema
- Query
- Mutazione
In questo documento si presuppone che tu abbia familiarità con openCypher v9.
Prima di iniziare
Configura ed esegui query sul grafico di Spanner utilizzando la console Google Cloud.
Terminologia
openCypher | Spanner Graph |
---|---|
nodi | nodi |
relazioni | bordi |
etichette dei nodi | etichette dei nodi |
tipi di relazione | etichette dei bordi |
clausole | Il grafico Spanner utilizza il termine statement per un'unità completa di
esecuzione e clause per un modificatore alle istruzioni.Ad esempio, MATCH è un'affermazione mentre
WHERE è una clausola. |
unicità della relazione openCypher non restituisce risultati con bordi ripetuti in un'unica corrispondono. |
Percorso TRAIL Quando è richiesta unicità in Spanner Graph, utilizza la TRAIL modalità per restituire spigoli univoci in una singola corrispondenza.
|
Conformità agli standard
Il grafico Spanner adotta l'ISO Linguaggio di query grafico (GQL) e Query SQL/grafici di proprietà standard (SQL/PGQ).
Modello dati
Sia Spanner Graph che openCypher adottano il modello di dati del grafo delle proprietà con alcune differenze.
openCypher | Spanner Graph |
---|---|
Ogni relazione ha esattamente un tipo di relazione. |
Sia i nodi che i bordi hanno una o più etichette. |
Schema
openCypher | Spanner Graph |
---|---|
Un grafico non ha uno schema predefinito. | Uno schema di un grafico deve essere definito esplicitamente utilizzando
CREATE PROPERTY GRAPH .Le etichette sono definite in modo statico nello schema. Per aggiornare le etichette, devi aggiornare lo schema. Per saperne di più, consulta Creare, aggiornare o rilasciare uno schema di un grafico di Spanner. |
Query
Le funzionalità di query di Spanner Graph sono simili a quelle di openCypher. Le differenze tra il grafico Spanner e openCypher sono descritte in questa sezione.
Specifica il grafico
In openCypher è presente un solo grafico predefinito e le query operano in base
grafico. In Spanner Graph puoi definire più grafici e una query
deve iniziare con la clausola GRAPH
per specificare il grafico 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 pattern del grafico
Spanner Graph supporta funzionalità di corrispondenza dei pattern di grafici simili a openCypher. Le differenze sono spiegate nelle sezioni seguenti.
Unicità delle relazioni e modalità TRAIL
openCypher non restituisce risultati con archi ripetuti in una singola corrispondenza. In openCypher, questo viene chiamato unicità della relazione. Nel grafico Spanner,
i bordi 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à openCypher e grafico Spanner
TRAIL
restituiscono un valore vuoto perché l'unico percorso possibile è ripeteret1
due volte. - Per impostazione predefinita, la query grafico Spanner restituisce un percorso valido.
openCypher | Grafico Spanner (modalità TRAIL) | Grafico 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 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 della query non restituiscono elementi del grafico. Utilizza la
TO_JSON
per restituire gli elementi del grafico in formato JSON.
Corrispondenza di pattern a lunghezza variabile e quantificazione di pattern
La corrispondenza di pattern a lunghezza variabile in openCypher è chiamata quantificazione dei percorsi nel grafico di Spanner. La quantificazione dei percorsi utilizza una sintassi diversa, come mostrato nell'esempio che segue. Per saperne di più, consulta Pattern del 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 a lunghezza variabile: elenco di elementi
Spanner Graph ti consente di accedere direttamente alle variabili utilizzate nel percorso
e quantificazioni. Nell'esempio seguente, e
nel grafico Spanner è uguale
come 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. È possibile avere 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.
allShortestPath
non è supportato.
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; |
Istruzioni e clausole
La tabella seguente elenca le clausole openCypher e indica se sono supportati in Spanner Graph.
openCypher | Spanner Graph | |
---|---|---|
CONFRONTA | Supportata. Per ulteriori informazioni, consulta la sezione Corrispondenza dei pattern dei grafici. | |
CORRISPONDENZA FACOLTATIVA | Supportata. Per ulteriori informazioni, consulta la sezione Corrispondenza dei pattern dei grafici. | |
RETURN / WITH |
Supportata. Per ulteriori informazioni, consulta
l'istruzione RETURN e
Dichiarazione WITH.
Spanner Graph richiede aliasing esplicito per espressioni complicate. |
|
Supportata. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear; |
|
Azione non supportata. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing |
|
WHERE | Supportata. Per ulteriori informazioni, consulta la definizione di pattern grafico. | |
ORDER BY | Supportata. Per ulteriori informazioni, consulta Istruzione ORDER BY. | |
IGNORA / LIMITE |
Supportata. Per ulteriori informazioni, consulta
l'istruzione SKIP e l'
Dichiarazione 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; |
|
Azione non supportata. |
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, vedi Query su grafici composti. | |
UNIONE TUTTO | Supportata. Per ulteriori informazioni, consulta Query sul grafo composito. | |
SVUOTA | Supportato dall'istruzione 'FOR'. | |
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
CORRISPONDENZA OBBLIGATORIA | Non supportati. | |
CHIAMA[RENDIMENTO...] | Non supportati. | |
CREATE, DELETE, SET, REMOVE, MERGE | Per ulteriori informazioni, consulta la sezione Mutazione. e Inserire, aggiornare o eliminare dati nel grafico di Spanner. |
Tipi di dati
Spanner Graph supporta tutti i tipi di dati GoogleSQL. Per ulteriori informazioni le informazioni, vedi Tipi di dati in GoogleSQL.
Le seguenti sezioni confrontano i tipi di dati openCypher con i dati del grafico Spanner di testo.
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 |
BOOLEANO | BOOL |
ELENCO 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 |
---|---|
ELENCO | ARRAY o JSON |
MAPPA | STRUCT o JSON |
Spanner Graph non supporta elenchi eterogenei di tipi diversi o mappe di un elenco di chiavi dinamiche e tipi di valori di elementi eterogenei. Utilizza le funzionalità di JSON per questi casi d'uso.
Coercizione del tipo
openCypher | Spanner Graph |
---|---|
INT -> FLOAT | Supportata. |
Per ulteriori informazioni sulle regole di conversione dei tipi, consulta Regole di conversione in GoogleSQL.
Funzioni ed espressioni
Oltre alle funzioni e alle espressioni del grafico, Spanner Graph supporta anche tutte le funzioni e le espressioni integrate di GoogleSQL.
Per un elenco completo di funzioni ed espressioni, consulta Funzioni, operatori e condizioni di GoogleSQL.
Questa sezione elenca le funzioni e le espressioni openCypher e le relative equivalenti nel grafico di Spanner.
Funzioni ed espressioni di tipo strutturale
Tipo | openCypher funzione o espressione |
Grafico Spanner funzione o espressione |
|
---|---|---|---|
Nodo ed perimetro |
exists(n.prop) | property_exists(n, proposta) | |
id(restituisce un numero intero) | Non supportati. | ||
proprietà | to_json |
||
chiavi (nomi dei tipi di proprietà, ma non valori delle proprietà) |
property_names |
||
etichette | labels | ||
Edge | endNode | Non supportati. | |
startNode | Non supportati. | ||
tipo | etichette | ||
Percorso | lunghezza | Non supportati. | |
nodi | Non supportati. | ||
relazioni | Non supportati. | ||
Nodo ed perimetro | riferimento proprietà |
. | |
[] riferimento proprietà dinamica
|
Non supportati. | ||
Pattern come espressione | taglia(motivo) | Non supportati. Utilizza una sottoquery come segue
|
Funzioni ed espressioni del tipo di proprietà
Tipo | openCypher funzione o espressione |
Funzione o espressione di Spanner Graph |
|
---|---|---|---|
Scalare | unione | unione | |
head | array_first | ||
ultima | array_last | ||
size(elenco) | array_length | ||
size(stringa) | lunghezza | ||
timestamp | unix_millis(current_timestamp()) | ||
toBoolean/toFloat/toInteger | cast( |
||
Aggregazione | media | media | |
collect | array_agg | ||
conteggio | conteggio | ||
max | max | ||
min | min | ||
percentileCont | percentile_cont | ||
percentileDisc | percentile_disc | ||
stDev | sviluppo stdev | ||
stDevP | stdev_pop | ||
somma | somma | ||
Elenco | intervallo | generate_array | |
inversa | array_reverse | ||
tail | Il grafico Spanner non supporta tail .Utilizza array_slice e array_length
. |
||
Matematico | abs | abs | |
ceil | ceil | ||
piano | piano | ||
Rand | Rand | ||
tonda | tonda | ||
firmare | firmare | ||
e | esp(1) | ||
exp | exp | ||
log | log | ||
log10 | log10 | ||
sqrt | sqrt | ||
acos | acos | ||
asin | asin | ||
atan | atan | ||
atan2 | atan2 | ||
cos | cos | ||
culla | culla | ||
gradi | r * 90 / asin(1) | ||
pi greco | pi greco | ||
radianti | d * asin(1) / 90 | ||
sin | sin | ||
marrone chiaro | marrone chiaro | ||
Stringa | a sinistra | a sinistra | |
ltrim | ltrim | ||
sostituisci | sostituisci | ||
inversa | inversa | ||
a destra | a destra | ||
rtrim | rtrim | ||
split | split | ||
substring | substr | ||
tolower | minore | ||
tostringa | cast( |
||
Toupper | superiore | ||
tagliare | tagliare | ||
DISTINCT | DISTINCT | DISTINCT | |
Matematici | + | + | |
- | - | ||
* | * | ||
/ | / | ||
% | MOD | ||
^ | POW | ||
Confronto | = | = | |
<> | <> | ||
< | < | ||
> | > | ||
<= | <= | ||
>= | >= | ||
[NON] È NULLO | [NON] È NULLO | ||
Catena di confronto
|
Spanner Graph
non supporta una catena di confronti. Equivale a
confronti congiunti con AND . Ad esempio:
|
||
Booleano | E | E | |
OPPURE | OPPURE | ||
XOR |
Grafico Spanner
non supporta XOR. Scrivi la query con <> .Ad esempio:
|
||
NOT | NOT | ||
Stringa | INIZIA DA | starts_with | |
TERMINA CON | ends_with | ||
CONTAINS | regexp_contains | ||
+ | string_concat | ||
Elenco | + | array_concat | |
IN | array_includes | ||
[] | [] |
Altre espressioni
openCypher | Spanner Graph |
---|---|
Espressione di caso | Supportata. |
Sottoquery Exists | Supportato. |
Proiezione mappa | Non supportati. I tipi STRUCT offrono funzionalità simili. |
Comprensione elenco | Non supportato. generate_array e array_transform coprono la maggior parte dei casi d'uso. |
Parametro di ricerca
Le seguenti query mostrano la differenza tra l'uso dei parametri in 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 DML GoogleSQL per modificare le tabelle di input dei nodi e del perimetro. Per ulteriori informazioni, vedi Inserisci, aggiorna o elimina i dati del grafico di Spanner.
Crea nodo e perimetro
openCypher | Spanner Graph | |
---|---|---|
crea nodi e bordi | CREATE (:Person {id: 100, name: 'John'}); CREATE (:Account {id: 1000, is_blocked: FALSE}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
Crea nodi e 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 e perimetro
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 grafico di Spanner, consulta Crea, aggiorna o rilascia uno schema di Spanner Graph.
Unisci nodo e perimetro
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 e perimetro
Eliminare gli archi è come eliminare la 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 pendenti. Quando DELETE CASCADE
viene specificato, DELETE
rimuove i bordi associati di
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; |
Restituisci risultati di 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; |
Restituisci i risultati dopo l'eliminazione | DELETE (p:Person {id: 100}) RETURN p.country; |
DELETE FROM Person WHERE id = 100 THEN RETURN country; |