Questa pagina descrive come utilizzare i percorsi del grafico in Spanner Graph.
Nei database a grafo, il tipo di dati del percorso del grafico rappresenta una sequenza di nodi interlacciati con archi e mostra la relazione tra questi nodi e archi. Per saperne di più sul tipo di dati percorso, vedi Tipo di percorso del grafico.
Con Spanner Graph Language (GQL), puoi costruire percorsi del grafico ed eseguire query su di essi. Gli esempi in questo documento utilizzano lo stesso schema di Spanner Graph che si trova nella pagina Configura ed esegui query su Spanner Graph.
Costruire un percorso del grafico
Puoi creare un percorso del grafico creando una variabile di percorso in un pattern del grafico o
con la funzione PATH
.
Ti consigliamo di creare un percorso del grafico utilizzando la variabile del percorso. Il formato per creare una variabile di percorso è:
MATCH p = PATH_PATTERN
Per saperne di più, vedi Pattern del grafico.
Esempio
Nel seguente esempio, la query trova i pattern di trasferimenti di denaro tra
conti all'interno di FinGraph
.
GRAPH FinGraph
MATCH p = (src:Account {id: 16})-[t:Transfers]->{2}(dst:Account {id: 7})
RETURN TO_JSON(p) AS full_path;
Risultato
full_path |
---|
[{"identifier": ..., "properties": {"id": 16, ...}, ...}, {"identifier": ..., "properties": {"amount": 300.0, ...}, ...}, ...] |
Il risultato indica che la query ha trovato il pattern Account -> Transfers -> Account
nel database.
Eseguire una query su un percorso del grafico
Puoi utilizzare le seguenti funzioni specifiche per il percorso per eseguire query su un percorso del grafico. Per informazioni più generali sulle query Spanner Graph, consulta Panoramica delle query.
EDGES
La funzione EDGES
restituisce tutti gli archi in un percorso del grafico. Per la semantica
dettagliata, vedi EDGES
.
Esempio
Questa query trova un percorso tra due account che passa attraverso un account intermedio.
Restituisce la quantità del secondo bordo Transfers
nel percorso, che potrebbe essere
tra src
e mid
o tra mid
e dst
.
GRAPH FinGraph
MATCH p = (src:Account {id: 7})-[t1:Transfers]->{1,3}(mid:Account)-[t2:Transfers]->
{1,3}(dst:Account {id: 16})
LET second_edge = EDGES(p)[1]
RETURN DISTINCT src.id AS src, dst.id AS dst, second_edge.amount AS second_edge_amount;
Risultato
src | dst | second_edge_amount |
---|---|---|
7 | 16 | 300 |
NODES
La funzione NODES
restituisce tutti i nodi in un percorso del grafico. Per la semantica
dettagliata, vedi NODES
.
Esempio
Questa query trova il percorso del grafico di due trasferimenti e poi restituisce un elenco JSON che rappresenta il percorso.
GRAPH FinGraph
MATCH p = (src:Account)-[t:Transfers]->{2}(dst:Account)
RETURN TO_JSON(NODES(p)) AS nodes;
Risultato
nodi |
---|
[{"identifier": "...", "properties": {"id": 16}, ...}, {"identifier": "...", "properties": {"id": 20, ...}, ...] |
… |
PATH_FIRST
La funzione PATH_FIRST
trova il primo nodo in un percorso del grafico. Per la semantica
dettagliata, vedi PATH_FIRST
.
Esempio
Questa query trova il primo nodo in un percorso del grafico di due trasferimenti. Restituisce l'etichetta del nodo Account
e il nickname dell'account.
GRAPH FinGraph
MATCH p = -[:Transfers]->{1,3}(dst:Account{id: 7})
RETURN DISTINCT PATH_FIRST(p).id AS can_reach_target;
Risultato
can_reach_target |
---|
7 |
16 |
20 |
PATH_LAST
La funzione PATH_LAST
trova l'ultimo nodo in un percorso del grafico. Per la semantica
dettagliata, vedi PATH_LAST
.
Esempio
Questa query trova l'ultimo nodo in un percorso del grafico di due trasferimenti. Restituisce l'etichetta del nodo Account
e il nickname dell'account.
GRAPH FinGraph
MATCH p =(start:Account{id: 7})-[:Transfers]->{1,3}
RETURN DISTINCT PATH_LAST(p).id as can_reach_target;
Risultato
can_reach_target |
---|
7 |
16 |
20 |
PATH_LENGTH
La funzione PATH_LENGTH
trova il numero di bordi in un percorso del grafico. Per
la semantica dettagliata, vedi PATH_LENGTH
.
Esempio
Questa query trova il numero di archi in un percorso del grafico che contiene da uno a tre trasferimenti.
GRAPH FinGraph
MATCH p = (src:Account)-[e:Transfers]->{1,3}(dst:Account)
RETURN PATH_LENGTH(p) AS num_transfers, COUNT(*) AS num_paths;
Risultato
num_transfers | num_paths |
---|---|
1 | 5 |
2 | 7 |
3 | 11 |
IS_ACYCLIC
La funzione IS_ACYCLIC
controlla se un percorso del grafico ha nodi ripetuti. Restituisce
TRUE
se viene rilevata una ripetizione, altrimenti restituisce FALSE
. Per la semantica
dettagliata, vedi IS_ACYCLIC
.
Esempio
Questa query verifica se il percorso del grafico ha nodi ripetuti.
GRAPH FinGraph
MATCH p = (src:Account)-[t:Transfers]->{2}(dst:Account)
RETURN IS_ACYCLIC(p) AS is_acyclic_path,
ARRAY_TRANSFORM(NODES(p), n->n.id) AS account_ids;
Risultato
is_acyclic_path | account_ids |
---|---|
VERO | 16,20,7 |
VERO | 20,7,16 |
VERO | 20,7,16 |
FALSE | 16,20,16 |
VERO | 7,16,20 |
VERO | 7,16,20 |
FALSE | 20,16,20 |
IS_TRAIL
La funzione IS_TRAIL
controlla se un percorso del grafico ha archi ripetuti. Restituisce
TRUE
se viene rilevata una ripetizione, altrimenti restituisce FALSE
. Per la semantica
dettagliata, vedi IS_TRAIL
.
Esempio
Questa query verifica se il percorso del grafico ha bordi ripetuti.
GRAPH FinGraph
MATCH p = (src:Account)-[t:Transfers]->{3}(dst:Account)
WHERE src.id < dst.id
RETURN IS_TRAIL(p) AS is_trail_path,
ARRAY_TRANSFORM(t, t->t.id) AS transfer_ids
Risultato
is_trail_path | transfer_ids |
---|---|
FALSE | 16,20,16 |
VERO | 7,16,20 |
VERO | 7,16,20 |
Modalità percorso
In Spanner Graph, il comportamento predefinito è restituire tutti i percorsi, inclusi quelli con nodi e archi ripetuti. Puoi utilizzare le seguenti modalità del percorso per includere o escludere i percorsi con nodi e archi ripetuti. Per la semantica dettagliata, consulta la documentazione della modalità Percorso.
WALK
La modalità percorso WALK
restituisce tutti i percorsi, inclusi quelli con nodi e archi ripetuti. WALK
è la modalità di percorso predefinita.
Esempio
La seguente query mostra l'utilizzo della modalità percorso WALK
in un pattern di percorso quantificato.
Il primo percorso nei risultati ha bordi ripetuti.
GRAPH FinGraph
MATCH p = WALK (src:Account)-[t:Transfers]->{3}(dst:Account)
WHERE src.id < dst.id
RETURN ARRAY_TRANSFORM(t, t->t.id) AS transfer_ids
Risultato
transfer_ids |
---|
16,20,16 |
7,16,20 |
7,16,20 |
ACYCLIC
La modalità percorso ACYCLIC
filtra i percorsi con nodi ripetuti.
Esempio
La seguente query mostra l'utilizzo della modalità percorso ACYCLIC
in un pattern di percorso quantificato.
Il percorso con nodi src
e dst
uguali viene filtrato.
GRAPH FinGraph
MATCH p = ACYCLIC (src:Account)-[t:Transfers]->{2}(dst:Account)
RETURN ARRAY_TRANSFORM(NODES(p), n->n.id) AS account_ids
Risultato
account_ids |
---|
16,20,7 |
20,7,16 |
20,7,16 |
7,16,20 |
7,16,20 |
TRAIL
La modalità percorso TRAIL
filtra i percorsi con bordi ripetuti.
Esempio
La seguente query mostra l'utilizzo della modalità percorso TRAIL
in un pattern di percorso quantificato.
I percorsi con bordi ripetuti vengono filtrati.
GRAPH FinGraph
MATCH p = TRAIL (src:Account)-[t:Transfers]->{3}(dst:Account)
WHERE src.id < dst.id
RETURN ARRAY_TRANSFORM(t, t->t.id) AS transfer_ids
Risultato
transfer_ids |
---|
7,16,20 |
7,16,20 |
Prefisso di ricerca del percorso
Puoi utilizzare un prefisso di ricerca del percorso per limitare un pattern di percorso in modo da restituire il percorso più breve da ogni partizione di dati. Per la semantica dettagliata, vedi Prefisso di ricerca del percorso.
ANY SHORTEST
Il prefisso di ricerca del percorso ANY SHORTEST
restituisce il percorso più breve (il percorso con il minor numero di archi) che corrisponde al pattern di ogni partizione di dati. Se
sono presenti più percorsi più brevi per partizione, ne restituisce uno qualsiasi.
Esempio
La seguente query corrisponde a qualsiasi percorso tra ogni coppia di [a, b]
.
GRAPH FinGraph
MATCH p = ANY SHORTEST (a:Account {is_blocked:true})-[t:Transfers]->{1,4}(b:Account)
LET total_amount = SUM(t.amount)
RETURN a.id AS account1_id, total_amount, b.id AS account2_id;
Risultato
account1_id | total_amount | account2_id |
---|---|---|
16 | 500 | 16 |
16 | 800 | 7 |
16 | 300 | 20 |
Regole di conversione
Per ulteriori informazioni, consulta Regole di conversione GRAPH_PATH.
Esempio di caso d'uso
Nel seguente esempio di caso d'uso, tutti gli account sono stati indirizzati
tramite uno o tre account, dall'ID account 20
.
GRAPH FinGraph
MATCH p = (start:Account {id: 20})-[:Transfers]->{1,3}(dst:Account)
RETURN DISTINCT dst.id AS dst;
Risultato
dst |
---|
7 |
16 |
20 |
Tuttavia, una query che restituisce l'ID account 20
potrebbe essere una query eccessivamente generica
perché inizia con l'ID account 20
. Per mostrare risultati più specifici, puoi
forzare la query a mostrare solo percorsi di grafi aciclici senza nodi ripetuti.
Per farlo, puoi:
- Usa
MATCH p = ACYCLIC <path_pattern>
; oppure - Applicare un filtro
IS_ACYCLIC(p)
nella query
La seguente query utilizza MATCH p = ACYCLIC PATH_PATTERN
:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})-[:Transfers]->{1,3}(dst:Account)
RETURN DISTINCT dst.id AS dst;
Risultato
dst |
---|
7 |
16 |
Se vuoi sapere il primo account tramite cui viene trasferito il denaro, puoi eseguire la seguente query:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})(-[:Transfers]->
(nexts:Account)){1,3}(dst:Account)
RETURN dst.id AS dst, ARRAY_AGG(DISTINCT nexts[0].id) AS unique_starts;
Questa query è non convenzionale perché introduce una nuova variabile all'interno del
percorso quantificato utilizzando nexts
per ottenere il risultato. Con le variabili di percorso, puoi
semplificare la query:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id AS dst, ARRAY_AGG(DISTINCT NODES(p)[OFFSET(1)].id) AS unique_starts;
L'utilizzo di NODES(p)
restituisce tutti i nodi lungo il percorso. Poiché il primo account
nodo è specificato come start
, il successivo (al primo offset) è il primo
account tramite cui vengono trasferiti i fondi.
Risultato
dst | unique_starts |
---|---|
7 | 16, 7 |
I percorsi sono più utili quando sono presenti più percorsi quantificati. Puoi aggiungere
un vincolo in base al quale i percorsi trovati da start
devono passare per l'ID account
7
:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})-[:Transfers]->
{1,3}(mid:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id AS dst,
ARRAY_AGG(DISTINCT NODES(p)[OFFSET(1)].id) AS unique_starts;
Anche se l'istruzione MATCH
è cambiata, il resto della query non deve essere modificato. Senza utilizzare le variabili di percorso, in alcuni casi non è possibile
per Spanner sapere staticamente quale percorso quantificato ispezionare.
Utilizzando una variabile di percorso, puoi ottenere la somma di tutti i trasferimenti:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})-[:Transfers]->
{1,3}(mid:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
LET all_transfers = EDGES(p)
LET transfer_amounts = SUM(all_transfers.amount)
RETURN dst.id AS dst,
ARRAY_AGG(DISTINCT NODES(p)[OFFSET(1)].id) AS participating_neighbor_nodes, transfer_amounts;
Risultato
dst | participating_neighbor_nodes | transfer_amounts |
---|---|---|
16 | 7 | 600 |
16 | 7 | 800 |