Utiliser des chemins

Cette page explique comment utiliser les chemins de graphique dans Spanner Graph.

Dans les bases de données orientées graphe, le type de données de chemin de graphique représente une séquence de nœuds entrelacés avec des arêtes et montre comment ces nœuds et ces arêtes sont liés. Pour en savoir plus sur le type de données de tracé, consultez la section Type de tracé du graphique.

Avec le langage Spanner Graph (GQL), vous pouvez créer des chemins de graphique et y effectuer des requêtes. Les exemples de ce document utilisent le même schéma Spanner Graph que celui présenté sur la page Configurer et interroger Spanner Graph.

Créer un chemin de graphique

Vous pouvez créer un chemin de graphique en créant une variable de chemin dans un modèle de graphique ou avec la fonction PATH.

Nous vous recommandons de créer un chemin de graphique à l'aide de la variable de chemin. Le format pour créer une variable de chemin d'accès est le suivant:

MATCH p = PATH_PATTERN

Pour en savoir plus, consultez la section Modèle de graphique.

Exemple

Dans l'exemple suivant, la requête identifie des tendances de transferts d'argent entre des comptes au cours de 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;

Résultat

full_path
[{"identifier": ..., "properties": {"id": 16, ...}, ...}, {"identifier": ..., "properties": {"amount": 300.0, ...}, ...}, ...]

Le résultat indique que la requête a trouvé le modèle Account -> Transfers -> Account dans la base de données.

Interroger un chemin de graphique

Vous pouvez utiliser les fonctions spécifiques au chemin suivantes pour interroger un chemin de graphique. Pour en savoir plus sur les requêtes Spanner Graph, consultez la présentation des requêtes.

EDGES

La fonction EDGES renvoie tous les arcs d'un chemin de graphique. Pour en savoir plus sur la sémantique, consultez EDGES.

Exemple

Cette requête trouve un chemin entre deux comptes qui passent par un compte intermédiaire. Il renvoie la valeur de l'arête Transfers secondaire du chemin, qui peut être comprise entre src et mid ou entre mid et 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;

Résultat

src dst second_edge_amount
7 16 300

NODES

La fonction NODES renvoie tous les nœuds d'un chemin de graphique. Pour en savoir plus sur la sémantique, consultez NODES.

Exemple

Cette requête trouve le chemin de graphique de deux transferts, puis renvoie une liste JSON représentant le chemin.

GRAPH FinGraph
MATCH p = (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
RETURN TO_JSON(NODES(p)) AS nodes;

Résultat

nœuds
[{"identifier": "...", "properties": {"id": 16}, ...}, {"identifier": "...", "properties": {"id": 20, ...}, ...]

PATH_FIRST

La fonction PATH_FIRST recherche le premier nœud d'un chemin de graphique. Pour en savoir plus sur la sémantique, consultez PATH_FIRST.

Exemple

Cette requête recherche le premier nœud dans un chemin de graphique de deux transferts. Il renvoie le libellé du nœud Account et le pseudo du compte.

GRAPH FinGraph
MATCH p = -[:Transfers]->{1,3}(dst:Account{id: 7})
RETURN DISTINCT PATH_FIRST(p).id AS can_reach_target;

Résultat

can_reach_target
7
16
20

PATH_LAST

La fonction PATH_LAST trouve le dernier nœud d'un chemin de graphique. Pour en savoir plus sur la sémantique, consultez PATH_LAST.

Exemple

Cette requête recherche le dernier nœud dans un chemin de graphique de deux transferts. Il renvoie le libellé du nœud Account et le pseudo du compte.

GRAPH FinGraph
MATCH p =(start:Account{id: 7})-[:Transfers]->{1,3}
RETURN DISTINCT PATH_LAST(p).id as can_reach_target;

Résultat

can_reach_target
7
16
20

PATH_LENGTH

La fonction PATH_LENGTH détermine le nombre d'arêtes dans un chemin de graphique. Pour en savoir plus sur la sémantique, consultez PATH_LENGTH.

Exemple

Cette requête permet de trouver le nombre d'arêtes dans un chemin de graphique contenant un à trois transferts.

GRAPH FinGraph
MATCH p = (src:Account)-[e:Transfers]->{1,3}(dst:Account)
RETURN PATH_LENGTH(p) AS num_transfers, COUNT(*) AS num_paths;

Résultat

num_transfers num_paths
1 5
2 7
3 11

IS_ACYCLIC

La fonction IS_ACYCLIC vérifie si un chemin de graphique comporte des nœuds en répétition. Elle renvoie TRUE si une répétition est détectée, sinon elle renvoie FALSE. Pour en savoir plus sur la sémantique, consultez IS_ACYCLIC.

Exemple

Cette requête vérifie si ce chemin de graphique comporte des nœuds en répétition.

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;

Résultat

is_acyclic_path source_account_id mid_account_id dst_account_id
TRUE 16 20 7
TRUE 20 7 16
TRUE 20 7 16
FALSE 16 20 16
TRUE 7 16 20
TRUE 7 16 20
FALSE 20 16 20

IS_TRAIL

La fonction IS_TRAIL vérifie si un chemin de graphique comporte des arêtes répétées. Elle renvoie TRUE si une répétition est détectée, sinon elle renvoie FALSE. Pour en savoir plus sur la sémantique, consultez IS_TRAIL.

Exemple

Cette requête vérifie si ce chemin de graphique comporte des arêtes répétées.

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;

Résultat

is_trail_path t1_id t2_id t3_id
FALSE 16 20 16
TRUE 7 16 20
TRUE 7 16 20

Modes de chemin

Dans Spanner Graph, le comportement par défaut consiste à renvoyer tous les chemins, y compris ceux avec des nœuds et des arêtes répétés. Vous pouvez utiliser les modes de chemin d'accès suivants pour inclure ou exclure des chemins d'accès comportant des nœuds et des arêtes répétés. Pour en savoir plus sur la sémantique, consultez la documentation sur Pathmode.

WALK

Le mode de chemin WALK renvoie tous les chemins, y compris ceux avec des nœuds et des arêtes répétés. WALK est le mode de chemin par défaut.

Exemple

La requête suivante illustre l'utilisation du mode de chemin WALK sur un modèle de chemin non quantifié. Le premier chemin d'accès dans les résultats utilise le même bord pour t1 et 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;

Résultat

transfer1_id transfer2_id transfer3_id
16 20 16
7 16 20
7 16 20

ACYCLIC

Le mode de chemin ACYCLIC filtre les chemins comportant des nœuds en répétition.

Exemple

La requête suivante montre comment utiliser le mode de chemin ACYCLIC sur un modèle de chemin non quantifié. Le chemin avec des nœuds src et dst égaux est filtré.

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;

Résultat

account1_id account2_id account3_id
20 7 16
20 7 16
7 16 20
7 16 20
16 20 7

TRAIL

Le mode de chemin TRAIL filtre les chemins comportant des arêtes répétées.

Exemple

La requête suivante illustre l'utilisation du mode de chemin TRAIL sur un modèle de chemin non quantifié. Le chemin dont les arêtes t1 et t3 sont égales est filtré.

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;

Résultat

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

Préfixe de recherche de chemin

Vous pouvez utiliser un préfixe de recherche de chemin pour limiter un modèle de chemin afin de renvoyer le chemin le plus court de chaque partition de données. Pour en savoir plus sur la sémantique, consultez la section Préfixe de recherche de chemin.

ANY SHORTEST

Le préfixe de recherche de chemin ANY SHORTEST renvoie le chemin le plus court (celui avec le moins d'arêtes) qui correspond au format de chaque partition de données. S'il existe plusieurs chemins les plus courts par partition, renvoie l'un d'eux.

Exemple

La requête suivante correspond à n'importe quel chemin entre chaque paire de [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;

Résultat

account1_id total_amount account2_id
16 500 16
16 800 7
16 300 20

Règles de conversion

Pour en savoir plus, consultez les règles de conversion GRAPH_PATH.

Exemple de cas d'utilisation

Dans l'exemple de cas d'utilisation suivant, vous constatez que tous les comptes ont été acheminés via un à trois comptes, à partir de l'ID de compte 20.

GRAPH FinGraph
MATCH p = (start:Account {id: 20})-[:Transfers]->{1,3}(dst:Account)
RETURN DISTINCT dst.id AS dst;

Résultat

dst
7
16
20

Toutefois, une requête qui renvoie l'ID de compte 20 peut être trop large, car elle commence par l'ID de compte 20. Pour afficher des résultats plus spécifiques, vous pouvez forcer votre requête à n'afficher que des chemins de graphique acycliques sans nœuds répétés. Pour ce faire, vous pouvez procéder comme suit:

  • Utilisez MATCH p = ACYCLIC <path_pattern> ; ou
  • Appliquer un filtre IS_ACYCLIC(p) dans votre requête

La requête suivante utilise 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;

Résultat

dst
7
16

Si vous souhaitez connaître le premier compte via lequel l'argent est transféré, vous pouvez exécuter la requête suivante:

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;

Cette requête n'est pas conventionnelle, car elle introduit une nouvelle variable dans le chemin quantifié à l'aide de nexts pour obtenir le résultat. Avec les variables de chemin, vous pouvez simplifier la requête:

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'utilisation de NODES(p) renvoie tous les nœuds du chemin. Comme le compte de nœud de premier niveau est spécifié comme start, le suivant (au premier décalage) est le premier compte par lequel l'argent est transféré.

Résultat

dst unique_starts
7 16, 7

Les chemins sont plus utiles lorsqu'il existe plusieurs chemins quantifiés. Vous pouvez ajouter une contrainte selon laquelle les chemins trouvés à partir de start doivent passer par l'ID de compte 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;

Bien que l'instruction MATCH ait changé, le reste de la requête n'a pas besoin d'être modifié. Sans utiliser de variables de chemin, il est parfois impossible pour Spanner de savoir de manière statique quel chemin quantifié inspecter.

À l'aide d'une variable de chemin, vous pouvez obtenir la somme de tous les transferts:

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;

Résultat

dst participating_neighbor_nodes transfer_amounts
16 7 600
16 7 800

Étape suivante