Bonnes pratiques pour le réglage des requêtes de graphique Spanner

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 des nœuds et des arêtes de la table d'entrée.
  • Réduisez la quantité de données que la requête doit lire dans l'espace de 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 préserve la taille de l'ensemble de résultats intermédiaire et accélère la requête l'exécution.

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

  • Balayage 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 bord inversée:

    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 a moins de personnes portant le nom Alex qu'il n'y en a bloqués, nous vous recommandons d'écrire cette requête dans le dossier en périphérie.

Il est particulièrement important de commencer avec des nœuds à cardinalité un traversée de répertoire de longueur variable. L'exemple suivant montre la méthode recommandée pour rechercher les comptes transférés de manière transitive à partir d'un compte donné en trois sauts.

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 de bordure 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 les étiquettes des nœuds et des arêtes lorsqu'ils font référence au même élément, mais sont dans les 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