Bonnes pratiques pour optimiser les requêtes Spanner Graph

Ce document décrit les bonnes pratiques à suivre pour optimiser les performances des requêtes Spanner Graph, y compris les optimisations suivantes:

  • Évitez une analyse complète de la table d'entrée pour les nœuds et les arêtes.
  • Réduisez la quantité de données que la requête doit lire à partir du stockage.
  • Réduire la taille des données intermédiaires

Commencer par les nœuds de cardinalité inférieure

Écrivez l'itération du chemin de sorte qu'elle commence par les nœuds de cardinalité la plus faible. Cette approche réduit la taille de l'ensemble de résultats intermédiaires et accélère l'exécution des requêtes.

Par exemple, les requêtes suivantes ont la même sémantique:

  • Parcours de bord avant:

    GRAPH FinGraph
    MATCH (p:Person)-[:Owns]->(a:Account)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    
  • Traversée de bordure inverse:

    GRAPH FinGraph
    MATCH (a:Account)<-[:Owns]-(p:Person)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    

En supposant qu'il y ait moins de personnes portant le nom Alex que de comptes bloqués, nous vous recommandons d'écrire cette requête dans la traversée de bord avant.

Commencer à partir de nœuds de cardinalité inférieure est particulièrement important pour la traversée de chemin de longueur variable. L'exemple suivant montre la méthode recommandée pour trouver les comptes qui se trouvent à moins de trois transferts d'un compte donné.

GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;

Spécifier tous les libellés par défaut

Spanner Graph infère les nœuds éligibles et les libellés d'arête si les libellés sont omis. Nous vous recommandons de spécifier des libellés pour tous les nœuds et les arêtes dans la mesure du possible, car cette inférence n'est pas toujours possible et peut entraîner l'analyse d'un plus grand nombre de libellés que nécessaire.

Instruction MATCH unique

L'exemple suivant recherche les comptes associés à au plus trois transferts depuis le compte donné:

GRAPH FinGraph
MATCH (src:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id;

Dans les instructions MATCH

Spécifiez des libellés sur les nœuds et les arêtes lorsqu'ils font référence au même élément, mais se trouvent dans des instructions MATCH.

L'exemple suivant illustre cette approche recommandée:

GRAPH FinGraph
MATCH (acct:Account {id: 7})-[:Transfers]->{1,3}(other_acct:Account)
RETURN acct, COUNT(DISTINCT other_acct) AS related_accts
GROUP BY acct

NEXT

MATCH (acct:Account)<-[:Owns]-(p:Person)
RETURN p.id AS person, acct.id AS acct, related_accts;

Étape suivante