Lavorare con i percorsi

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

Passaggi successivi