Riferimento del grafico Spanner per gli utenti di openCypher

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

Grafico di esempio

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

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

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

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( as )
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( as string)
Toupper superiore
tagliare tagliare
DISTINCT DISTINCT DISTINCT
Matematici + +
- -
* *
/ /
% MOD
^ POW
Confronto = =
&lt;&gt; <>
< <
> >
<= <=
>= >=
[NON] È NULLO [NON] È NULLO
Catena di confronto
a < b < c

Spanner Graph non supporta una catena di confronti. Equivale a confronti congiunti con AND.
Ad esempio:

      a < b AND b < C
      

Booleano E E
OPPURE OPPURE
XOR
Grafico Spanner non supporta XOR. Scrivi la query con <>.

Ad esempio:
      boolean_1 <> boolean_2
      

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

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

Passaggi successivi