Lavorare con i percorsi

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

Passaggi successivi