Best Practices für die Feinabstimmung von Spanner Graph-Abfragen

In diesem Dokument werden Best Practices für die Abstimmung von Spanner Graph-Abfragen beschrieben , die folgende Optimierungen umfassen:

  • Vermeiden Sie einen vollständigen Scan der Eingabetabelle nach Knoten und Kanten.
  • Reduzieren Sie die Datenmenge, die die Abfrage aus dem Speicher lesen muss.
  • Reduzieren Sie die Größe der Zwischendaten.

Mit Knoten mit niedrigerer Kardinalität beginnen

Schreiben Sie den Path Traversal so, dass er mit den Knoten mit der niedrigeren Kardinalität beginnt. Dieser Ansatz hält die Zwischenergebnismenge gering und beschleunigt die Abfrage Ausführung.

Die folgenden Abfragen haben beispielsweise die gleiche Semantik:

  • Forward Edge Traversal:

    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;
    
  • Rückwärtsgerichtete Kantendurchquerung:

    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;
    

Angenommen, es gibt weniger Personen mit dem Namen Alex als tatsächlich gesperrte Konten zu erstellen, empfehlen wir, diese Abfrage in die Edge Traversal.

Das ist besonders wichtig für die Pfaddurchquerung mit variabler Länge. Das folgende Beispiel zeigt die empfohlene Methode um Konten zu finden, die vorübergehend von einem bestimmten Konto in drei Sprünge machen.

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

Alle Labels standardmäßig angeben

Spanner Graph leitet die qualifizierenden Knoten und Edge-Labels ab, wenn Labels werden weggelassen. Es wird empfohlen, Labels für alle Knoten und Kanten anzugeben. da diese Inferenz nicht immer möglich ist und mehr Labels als nötig gescannt werden.

Einzelne MATCH-Anweisung

Im folgenden Beispiel werden Konten gefunden, die mit höchstens drei Übertragungen vom angegebenes Konto:

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

In MATCH-Anweisungen

Geben Sie Labels für Knoten und Kanten an, wenn sie sich auf dasselbe Element beziehen, aber in verschiedenen MATCH-Anweisungen enthalten sind.

Das folgende Beispiel zeigt diesen empfohlenen Ansatz:

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;

Nächste Schritte