Riferimento a Spanner Graph per gli utenti di openCypher

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 è ripetere t1 due volte.
  • Per impostazione predefinita, la query Spanner Graph restituisce un percorso valido.

Grafo di esempio

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

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

Non supportati.
Pattern come espressione size(pattern) Non supportati. Utilizza una sottoquery come segue
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

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

Spanner Graph non supporta una catena di confronti. È equivalente ai confronti congiunti con AND.
Ad esempio:

      a < b AND b < C
      

Booleano AND AND
OR OR
XOR
Spanner Graph non supporta XOR. Scrivi la query con <>.

Ad esempio:
      boolean_1 <> boolean_2
      

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

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());
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 GRAPHistruzione 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;

Passaggi successivi