Best Practices für Spanner Graph-Algorithmen

In diesem Dokument werden Best Practices für die Ausführung von Algorithmen in Cloud Spanner Graph beschrieben. Es deckt folgende Themenbereiche ab:

Best Practices für das Graphschema für Algorithmen

Wenn Sie in Cloud Spanner Graph benutzerdefinierte Labels und Attribute verwenden, empfehlen wir, Elementschlüssel immer als Attribute verfügbar zu machen. So können Sie in der RETURN-Klausel der Algorithmusabfrage auf diese Schlüsselattribute zugreifen und sie verwenden, um das Graphelement zu identifizieren, für das der Algorithmus eine Ausgabe generiert.

Algorithmusausgabe verarbeiten

In diesem Abschnitt finden Sie Empfehlungen dazu, was aus der Algorithmusausgabe zurückgegeben werden soll und wo die zurückgegebenen Ergebnisse gespeichert werden sollen.

Was zurückgegeben werden soll

Wenn die Ausgabesignatur des Algorithmus Graphelemente enthält, können Sie in Cloud Spanner Graph jedes Attribut dieser Elemente zurückgeben. Um die Verarbeitungskosten zu senken, empfehlen wir, die Liste der zurückzugebenden Attribute zu minimieren. Geben Sie beispielsweise nur Attribute zurück, die Schlüssel eines Elements sind, da Schlüssel zum Identifizieren des Elements erforderlich sind.

Wo die Daten persistent gespeichert werden sollen

In Cloud Spanner Graph können Sie das Ergebnis der Algorithmusabfrage in Cloud Storage oder in derselben Cloud Spanner Graph-Instanz speichern, in der Sie die Abfrage starten.

Wenn Sie die Daten wieder in Cloud Spanner speichern , ist die Algorithmusausgabe für alle Cloud Spanner-Vorgänge nativ zugänglich. Sie können beispielsweise WeaklyConnectedComponents ausführen und cluster_id wieder im Graphen speichern. Anschließend können Sie PageRank für einen Eingabegraphen mit einer bestimmten cluster_id ausführen. Mit Cloud Spanner-Funktionen wie Änderungsstreams werden neue Algorithmusausgaben an nachgelagerte Systeme weitergegeben. Wenn Sie die Algorithmusausgabe in Cloud Spanner verwenden möchten, empfehlen wir, die Daten in Cloud Spanner zu speichern. In Cloud Spanner Graph werden Algorithmusausgaben effizient in Batches verarbeitet und in Cloud Spanner gespeichert. Alle Schreibvorgänge müssen jedoch über dieselbe Leader Replikat erfolgen. Wenn bereits wichtige Arbeitslasten die Leader-Kapazität beanspruchen, sollten Sie die Algorithmusausführungen staffeln, um Konflikte mit wichtigen Arbeitslasten zu vermeiden.

Sie sollten die Daten in Cloud Storage speichern , wenn Sie die Algorithmusausgabe nicht in Cloud Spanner verwenden möchten oder die Algorithmusausgabe auswerten möchten, bevor Sie sie in Ihre primäre Datenquelle aufnehmen. Informationen zu unterstützten Dateiformaten

Überlegungen zur Datenmodellierung für die Erweiterung des Graphen

In diesem Abschnitt werden einige Überlegungen zur Datenmodellierung bei der Speicherung der Algorithmusausgabe in Cloud Spanner behandelt.

Attribute im Vergleich zu Kanten

Algorithmen können eine Vielzahl von Informationen liefern, darunter:

  • Messwerte auf Knotenebene (z. B. Zentralitätswert). Diese können als neue Attribute im Knoten gespeichert werden.
  • Paarweise Informationen (z. B. Ähnlichkeit zwischen zwei Knoten). Diese können als neue Kanten zwischen den beiden Knoten mit dem Ausgabewert als Kanteneigenschaft gespeichert werden.
  • Algorithmen zur Community-Erkennung identifizieren logische Communities im Graphen und können einem bestimmten Knoten eine oder mehrere Communities zuweisen. Sie können die Community-Mitgliedschaft als neues Attribut im Knoten modellieren, indem Sie jeden Mitgliedsknoten mit der ID der zugewiesenen Community taggen. Sie können die Community-Mitgliedschaft auch als neue Untergraphen modellieren und die logischen Communities als neuen Knotentyp im Graphen speichern, wobei Kanten sie mit Mitgliedsknoten verbinden. Das Community-Attribut kann ausreichen, wenn Sie beim Zugriff auf einen Knoten wissen möchten, zu welcher Community er gehört. Ein Community-Untergraph ist möglicherweise besser geeignet, wenn Sie nach Community navigieren möchten (z. B. Knoten in derselben Community wie ein Startknoten finden). Je nachdem, wie Sie Community-Informationen verwenden möchten, können Sie eine oder beide Optionen auswählen.

Vordefiniertes Schema im Vergleich zu flexiblem Schema

Bevor Sie die Algorithmusausgabe wieder in Cloud Spanner speichern, definieren Sie die Zielspalte oder ‑tabelle im Schema auf eine der folgenden Arten:

  • Wenn Ihre Anwendungsfälle für Algorithmen stabil und bekannt sind, können Sie im Voraus zusätzliche Spalten oder Tabellen hinzufügen.
  • Wenn Sie iterieren und mit verschiedenen Möglichkeiten zum Extrahieren von Informationen experimentieren (z. B. verschiedene Algorithmen, Parameter, Eingabeuntergraphen ausprobieren), benötigen Sie möglicherweise eine flexible Möglichkeit, die Ausgabe aus mehreren Experimenten zu speichern und zu unterscheiden, ohne das Cloud Spanner-Schema für jede Ausführung aktualisieren zu müssen. In diesem Fall können Sie neue Attribute und Kanten, die von Algorithmen erstellt wurden, in generischen untergeordneten Tabellen speichern.

So speichern Sie neue Attribute und Kanten, die von Algorithmen erstellt wurden, in generischen untergeordneten Tabellen:

Schritt 1: Generische untergeordnete Tabellen erstellen

-- Create `AccountAlgoProperty` as a child table of `Account`, to store all
-- properties produced by algorithms for `Account`.
-- `algo_run_id`: a unique ID for a given algorithm run.
-- `int_val`: column to store integer algorithm output.
-- `float_val`: column to store float algorithm output.
CREATE TABLE AccountAlgoProperty (
 id INT64 NOT NULL,
 algo_run_id STRING(200) NOT NULL,
 int_val INT64,
 float_val FLOAT64
) PRIMARY KEY(id, algo_run_id),
 INTERLEAVE IN PARENT Account;

-- Create `AccountAlgoEdge` as a child table of `Account`, to store all
-- outgoing edges produced by algorithms for `Account`.
-- `algo_run_id`: a unique ID for a given algorithm run.
-- `to_id`: destination `Account` id.
-- `int_val`: column to store integer algorithm output.
-- `float_val`: column to store float algorithm output.
CREATE TABLE AccountAlgoEdge (
 id INT64 NOT NULL,
 algo_run_id STRING(200) NOT NULL,
 to_id INT64 NOT NULL,
 int_val INT64,
 float_val FLOAT64,
 CONSTRAINT FK_AccountId FOREIGN KEY (to_id) REFERENCES Account (id) NOT ENFORCED,
) PRIMARY KEY(id, algo_run_id, to_id),
 INTERLEAVE IN PARENT Account;

Schritt 2: Attribute und Kanten, die von Algorithmen erstellt wurden, als Zeilen in untergeordneten Tabellen zusammen mit der eindeutigen algo_run_id speichern, die sie erstellt hat.

-- Store PageRank score as property in child table.
EXPORT DATA
 OPTIONS (format = "CLOUD_SPANNER",
          table = "AccountAlgoProperty",
          write_mode = 'upsert_ignore_all' ) AS
GRAPH FinGraph
CALL PageRank(node_labels => ['Account'], edge_labels => ['Transfers'])
RETURN node.id, "page_rank_123" AS algo_run_id, score As float_val;

-- Store ShortestPath output as edge in child table.
EXPORT DATA
 OPTIONS (format = "CLOUD_SPANNER",
          table = "AccountAlgoEdge",
          write_mode = 'upsert_ignore_all' ) AS
GRAPH FinGraph
CALL ShortestPath(
    source_nodes => ARRAY {
                      MATCH (n:Account {id: 7})
                      RETURN n
                    },
    target_nodes => ARRAY {
                      MATCH (n:Account {id: 16})
                      RETURN n
                    }
  ) YIELD source_node, target_node, path, cost
RETURN source_node.id AS id, "shortest_path_456" AS algo_run_id,
  target_node.id AS to_id, PATH_LENGTH(path) AS int_val, cost AS float_val;

Schritt 3: Mit GRAPH_TABLE auf die Algorithmusausgabe zugreifen

SELECT acct.id, prop.float_val AS page_rank_score
FROM GRAPH_TABLE(
  FinGraph
  MATCH (n:Account)
  RETURN n.id
) acct JOIN AccountAlgoProperty prop ON acct.id = prop.id
  AND prop.algo_run_id = 'page_rank_123';

SELECT acct.id, edge.to_id, edge.int_val AS path_len, edge.float_val AS cost
FROM GRAPH_TABLE(
  FinGraph
  MATCH (n:Account)
  RETURN n.id
) acct JOIN AccountAlgoEdge edge ON acct.id = edge.id
  AND edge.algo_run_id = 'shortest_path_456';

Schritt 4: Optional einen logischen Graphen erstellen, der mit von Algorithmen generierten Attributen und Kanten erweitert wurde, um den Zugriff auf die Algorithmusausgabe zu erleichtern.

-- Create a view that aggregates non-null algorithm properties per node into
-- name-value pairs in JSON.
CREATE OR REPLACE VIEW AccountWithAlgoProperties SQL SECURITY INVOKER AS
SELECT
  n.id, ANY_VALUE(n.create_time) AS create_time,
  ANY_VALUE(n.is_blocked) AS is_blocked, ANY_VALUE(n.nick_name) AS nick_name,
  JSON_OBJECT(
    IF(COUNT(c.algo_run_id) = 0, [], ARRAY_AGG(c.algo_run_id)),
    IF(COUNT(c.algo_run_id) = 0, [], ARRAY_AGG(
      COALESCE(
        IF (c.int_val IS NULL, NULL, TO_JSON(c.int_val)),
        IF (c.float_val IS NULL, NULL, TO_JSON(c.float_val))
      )))) AS algo_props
FROM Account AS n LEFT JOIN AccountAlgoProperty AS c ON n.id = c.id
GROUP BY n.id;

-- Create FinGraphAugmented with algorithm generated properties and edges.
CREATE OR REPLACE PROPERTY GRAPH FinGraphAugmented
  NODE TABLES (
    AccountWithAlgoProperties AS Account
      KEY(id)
      LABEL Account PROPERTIES(
        create_time,
        id,
        is_blocked,
        nick_name,
        algo_props),
    Person
  )
  EDGE TABLES (
    PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
      LABEL Owns,
    AccountTransferAccount
      SOURCE KEY (id) REFERENCES Account (id)
      DESTINATION KEY (to_id) REFERENCES Account (id)
      LABEL Transfers,
    AccountAlgoEdge
      SOURCE KEY (id) REFERENCES Account (id)
      DESTINATION KEY (to_id) REFERENCES Account (id)
  );

Sie können dann direkt auf Algorithmusattribute zugreifen und in der Graphabfrage durch von Algorithmen generierte Kanten navigieren:

-- Retrieve PageRank score property in graph query.
GRAPH FinGraphAugmented
MATCH (a:Account)
RETURN a.id, a.algo_props.page_rank_123 AS page_rank
ORDER BY page_rank DESC
LIMIT 5;

-- Navigate through ShortestPath edge in graph query.
GRAPH FinGraphAugmented
MATCH (s:Account {id: 7})-[e:AccountAlgoEdge {algo_run_id : 'shortest_path_456'}]->(d:Account)
RETURN s.id AS src, d.id AS dst, e.int_val AS path_len, e.float_val AS cost

machine_category für große Arbeitslasten angeben

Für die meisten Arbeitslasten ist die default-Kategorie für Maschinen geeignet. Wenn Ihr Eingabe graph mehr als 1 Milliarde Knoten und mehr als 10 Milliarden Kanten hat, empfehlen wir, dass Sie explizit large für machine_category auswählen.

Regionale Kapazitätsbeschränkungen mit fallback_compute_region abmildern

Wenn in der Home-Region Ihrer Cloud Spanner-Instanz vorübergehende Einschränkungen der Rechenkapazität auftreten, geben Sie eine fallback_compute_region innerhalb derselben Gerichtsbarkeit wie die Home-Region Ihrer Instanz an. So kann Cloud Spanner Graph automatisch auf die Bereitstellung von Rechenressourcen in der Fallback-Region zurückgreifen, wenn in der Home-Region keine Kapazität verfügbar ist.

Rechenressourcen für schnelle Iterationen wiederverwenden

Wenn Sie mit verschiedenen Algorithmen oder verschiedenen Eingabeparametern für kleine Datensätze experimentieren, um schnelle Iterationen zu ermöglichen, empfehlen wir, max_idle_timezu verwenden. Mit einem größeren Wert für max_idle_time kann Cloud Spanner Graph bereits bereitgestellte Rechenressourcen für weitere Algorithmusarbeitslasten wiederverwenden. Dadurch wird der Aufwand für den Kaltstart von Rechenressourcen bei Bedarf reduziert und das Risiko gemindert, dass aufgrund eines vorübergehenden Kapazitätsmangels keine Rechenressourcen bereitgestellt werden können. Beachten Sie, dass die Rechenressourcen für Algorithmen auch im Leerlauf in Rechnung gestellt werden.

Elementtypen in der Ausgabe unterscheiden

Wenn die Algorithmusausgabe mehrere Elementtypen enthält, können Sie ELEMENT_DEFINITION_NAME in die Ausgabe einbeziehen, um sie zu unterscheiden. Beispiel:

EXPORT DATA OPTIONS (
  uri = "gs://bucket-name/page_rank.csv",
  format = "csv",
  overwrite = TRUE) AS
GRAPH FinGraph
CALL PageRank()
YIELD node, score
RETURN ELEMENT_DEFINITION_NAME(node) AS node_type, node.id, score;

Nächste Schritte