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 |