Questa pagina descrive come utilizzare i percorsi del grafo in Spanner Graph.
Nei database a grafo, il tipo di dati Percorso grafico rappresenta una sequenza di nodi alternati ad archi e mostra la relazione tra questi nodi e archi. Per scoprire di più sul tipo di dati del percorso, consulta Tipo di percorso grafico.
Con Spanner Graph Language (GQL), puoi creare percorsi nel grafo 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.
Costruisci un percorso del grafo
Puoi creare un percorso del grafo creando una variabile di percorso in un pattern di grafo o con la funzione PATH
.
Ti consigliamo di creare un percorso del grafico utilizzando la variabile path. Il formato per creare una variabile di percorso è:
MATCH p = PATH_PATTERN
Per saperne di più, consulta Modello di grafico.
Esempio
Nell'esempio seguente, la query trova schemi di trasferimenti di denaro tra conto all'interno di FinGraph
.
GRAPH FinGraph
MATCH p = (src:Account {id: 16})-[t1:Transfers]->(mid:Account)-[t2:Transfers]->
(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.
Esegui 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 di Spanner Graph, consulta la panoramica delle query.
EDGES
La funzione EDGES
restituisce tutti gli archi in un percorso del grafo. Per una semantica dettagliata, consulta 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 può 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 grafo. Per una semantica dettagliata, consulta NODES
.
Esempio
Questa query trova il percorso del grafo di due trasferimenti e restituisce un elenco JSON rappresentante il percorso.
GRAPH FinGraph
MATCH p = (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(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 una semantica dettagliata, consulta 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 una semantica dettagliata, consulta PATH_LAST
.
Esempio
Questa query trova l'ultimo nodo in un percorso del grafo 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 spigoli in un percorso del grafico. Per la semantica dettagliata, vedi PATH_LENGTH
.
Esempio
Questa query trova il numero di archi in un percorso del grafo contenente 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 grafo contiene nodi ripetuti. Restituisce
TRUE
se viene trovata una ripetizione, altrimenti restituisce FALSE
. Per una semantica dettagliata, consulta IS_ACYCLIC
.
Esempio
Questa query controlla se il percorso del grafico contiene nodi ripetuti.
GRAPH FinGraph
MATCH p = (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
RETURN IS_ACYCLIC(p) AS is_acyclic_path, src.id AS source_account_id,
mid.id AS mid_account_id, dst.id AS dst_account_id;
Risultato
is_acyclic_path | source_account_id | mid_account_id | dst_account_id |
---|---|---|---|
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 grafo contiene archi ripetuti. Restituisce
TRUE
se viene trovata una ripetizione, altrimenti restituisce FALSE
. Per una semantica dettagliata, consulta IS_TRAIL
.
Esempio
Questa query verifica se il percorso del grafo contiene archi ripetuti.
GRAPH FinGraph
MATCH p = (src:Account)-[t1:Transfers]->(mid1:Account)-[t2:Transfers]->
(mid2:Account)-[t3:Transfers]->(dst:Account)
WHERE src.id < dst.id
RETURN IS_TRAIL(p) AS is_trail_path, t1.id AS t1_id, t2.id AS t2_id, t3.id AS t3_id;
Risultato
is_trail_path | t1_id | t2_id | t3_id |
---|---|---|---|
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 ed archi ripetuti. Puoi utilizzare i seguenti modi per i percorsi per includere o escludere i percorsi con nodi e bordi ripetuti. Per una semantica dettagliata, consulta la documentazione di Pathmode.
WALK
La modalità di percorso WALK
restituisce tutti i percorsi, inclusi quelli con nodi e bordi ripetuti. WALK
è la modalità di percorso predefinita.
Esempio
La seguente query mostra l'utilizzo della modalità di percorso WALK
su un
pattern di percorso non quantificato. Il primo percorso nei risultati utilizza lo stesso bordo per t1
e t3
.
GRAPH FinGraph
MATCH p = WALK (src:Account)-[t1:Transfers]->(mid1:Account)-[t2:Transfers]->
(mid2:Account)-[t3:Transfers]->(dst:Account)
WHERE src.id < dst.id
RETURN t1.id AS transfer1_id, t2.id AS transfer2_id, t3.id AS transfer3_id;
Risultato
transfer1_id | transfer2_id | transfer3_id |
---|---|---|
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à di percorso ACYCLIC
su un
pattern di percorso non quantificato.
Il percorso con nodi src
e dst
uguali viene escluso.
GRAPH FinGraph
MATCH p = ACYCLIC (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
RETURN src.id AS account1_id, mid.id AS account2_id, dst.id AS account3_id;
Risultato
account1_id | account2_id | account3_id |
---|---|---|
20 | 7 | 16 |
20 | 7 | 16 |
7 | 16 | 20 |
7 | 16 | 20 |
16 | 20 | 7 |
TRAIL
La modalità percorso TRAIL
filtra i percorsi con spigoli ripetuti.
Esempio
La seguente query mostra l'utilizzo della modalità di percorso TRAIL
su un
pattern di percorso non quantificato. Il percorso i cui bordi t1
e t3
sono uguali viene escluso.
GRAPH FinGraph
MATCH p = TRAIL (src:Account)-[t1:Transfers]->(mid1:Account)-[t2:Transfers]->
(mid2:Account)-[t3:Transfers]->(dst:Account)
RETURN
t1.id AS transfer1_id, t2.id AS transfer2_id, t3.id AS transfer3_id;
Risultato
transfer1_id | transfer2_id | transfer3_id |
---|---|---|
16 | 20 | 7 |
16 | 20 | 7 |
20 | 7 | 16 |
20 | 7 | 16 |
7 | 16 | 20 |
7 | 16 | 20 |
7 | 16 | 20 |
7 | 16 | 20 |
20 | 16 | 20 |
Prefisso di ricerca del percorso
Puoi utilizzare un prefisso di ricerca del percorso per limitare un pattern del percorso in modo che restituisca il percorso più breve da ogni partizione di dati. Per una semantica dettagliata, vedi Prefisso di ricerca dei percorsi.
ANY SHORTEST
Il prefisso di ricerca del percorso ANY SHORTEST
restituisce il percorso più breve (con il minor numero di spigoli) che corrisponde al pattern di ogni partizione di dati. Se esistono più percorsi più brevi per partizione, restituisce uno qualsiasi di questi.
Esempio
La seguente query corrisponde a qualsiasi percorso tra ogni coppia di [a, b]
.
GRAPH FinGraph
MATCH p = ANY SHORTEST (a:Account)-[t:Transfers]->{1,4}(b:Account)
WHERE a.is_blocked
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 le regole di conversione GRAPH_PATH.
Esempio di caso d'uso
Nel seguente esempio di caso d'uso, tutti gli account sono stati instradati 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 troppo generica
perché inizia con l'ID account 20
. Per mostrare risultati più specifici, puoi impostare la query in modo da mostrare solo percorsi di grafici aciclici senza nodi ripetuti.
Per farlo, puoi:
- Utilizza
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 conoscere il primo account tramite il quale 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
, quello successivo (al primo offset) è il primo
account tramite il quale viene trasferito il denaro.
Risultato
dst | unique_starts |
---|---|
7 | 16, 7 |
I percorsi sono più utili quando sono presenti più percorsi quantificati. Puoi aggiungere un vincolo che imponga che i percorsi trovati da start
debbano 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 in modo statico 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 |