In diesem Dokument wird beschrieben, wie Sie Algorithmen in Spanner Graph ausführen.
Struktur der Algorithmusabfrage in Spanner Graph
Eine Spanner Graph-Algorithmusabfrage hat die folgende Struktur:
EXPORT DATA OPTIONS (export_option_list) AS
GRAPH graph_name
match_clause
call_statement algorithm_name(common_input, algorithm_specific_input)
YIELD algorithm_specific_output
RETURN results
export_option_list: Optionen, die definieren, wie die Abfrageergebnisse des Algorithmus beibehalten werden. Weitere Informationen finden Sie unter Cloud Storage-Optionen und Spanner-Optionen.graph_name: Der Name des Graphen.match_clause: Optionale MATCH-Anweisungen zum Definieren von Algorithmus-Eingabeelementen.call_statement: Verwenden Sie dieCALL-Anweisung, wenn Sie die Variablematch_clauseweglassen und den gesamten Graphen bearbeiten möchten. Verwenden Sie die AnweisungCALL PER(), wenn die Variablematch_clausevorhanden ist und Sie die Arbeitstabelle bearbeiten möchten. Weitere Informationen finden Sie unter GQL CALL.algorithm_name: Der Name des auszuführenden Algorithmus. Informationen zu den verfügbaren Algorithmen finden Sie unter Spanner Graph-Algorithmen.common_input: Benannte Eingabeparameter, die für alle Algorithmusabfragen gelten. Weitere Informationen finden Sie unter Häufige Eingabeparameter für Algorithmen.algorithm_specific_input: Benannte Eingabeparameter für den Algorithmus. Weitere Informationen finden Sie unter den Eingabeparametern, die in Spanner Graph-Algorithmen definiert sind.algorithm_specific_output: Die Ausgabe des Algorithmusaufrufs. Weitere Informationen finden Sie in den Ausgaben, die unter Spanner Graph-Algorithmen definiert sind, und in derYIELD-Klausel in der CALL-Anweisung.results: Definiert, was in den Abfrageergebnissen zurückgegeben werden soll.
Die Abfrage besteht aus einer EXPORT DATA-Anweisung, die definiert, wie Ergebnisse persistent gespeichert werden, und einer GRAPH-KLAUSEL, die das Ergebnis der Algorithmusabfrage erzeugt.
In ihrer einfachsten Form identifiziert die Graph-Klausel den Graphen, verwendet eine CALL-Anweisung, um einen Algorithmus aufzurufen, der eine vordefinierte Ausgabe liefert, und verwendet dann eine RETURN-Anweisung, um anzugeben, was aus der Ausgabe des Algorithmus zurückgegeben werden soll.
Optional kann die Graph-Klausel unterstützte MATCH-Anweisungen verwenden, um die gewünschten Elemente auszuwählen. Verwenden Sie in diesem Fall eine PER ()-Klausel, um alle Zeilen, die von der MATCH-Anweisung zurückgegeben werden, als Eingabe für den Algorithmus zu gruppieren.
Der Algorithmus arbeitet mit einem logischen Untergraphen, der aus der eindeutigen Gruppe von ausgewählten Knoten und Kanten besteht.
Die Abfrage gibt keine Daten zurück. Die Variable export_option_list bestimmt, wie Ergebnisse gespeichert werden.
Weitere Informationen zu Abfragen mit Spanner Graph-Algorithmen finden Sie in den folgenden Abschnitten dieses Dokuments:
- Häufig verwendete Eingabeparameter für Algorithmen
- Algorithmusausgabe verarbeiten
- Beispielabfragen für Algorithmen ausführen
Häufige Eingabeparameter für Algorithmen
Geben Sie diese benannten Eingabeparameter im folgenden Format an: NAME => VALUE, ....
| Name | Werttyp | Erforderlich | Standardwert | Beschreibung |
|---|---|---|---|---|
node_labels |
ARRAY |
Nein | (keine) | Wird nur unterstützt, wenn CALL verwendet wird. Eine Liste der Knotenlabels, die in die Algorithmus-Eingabe aufgenommen werden sollen. Wenn angegeben, werden nur Knoten mit mindestens einem übereinstimmenden Label einbezogen.
|
edge_labels |
ARRAY |
Nein | (keine) | Wird nur unterstützt, wenn CALL verwendet wird. Eine Liste der Kantenlabels, die in die Algorithmuseingabe aufgenommen werden sollen. Wenn angegeben, werden nur Kanten mit mindestens einem übereinstimmenden Label berücksichtigt.
|
edge_weight_property |
STRING |
Nein | (keine) | Der Name des Kantenattributs, das die Gewichtungen enthält. Wenn nicht definiert, weist das System allen Kanten eine Standardgewichtung von 1 zu. Der Typ des Attributwerts muss numerisch sein. |
machine_category |
STRING |
Nein | Standard | Die Maschinenkategorie, die für die Ausführung des Algorithmus verwendet werden soll. Unterstützte Werte: default, large |
fallback_compute_region |
STRING |
Nein | (keine) | Die Fallback-Region, in der die Algorithmusausführung stattfindet, wenn in der Heimatregion Kapazitätsengpässe auftreten. Muss sich in derselben Gerichtsbarkeit wie die Heimatregion der Spanner-Instanz befinden (z. B. us-central1, wenn die Heimatregion us-east1 ist). |
max_idle_time |
STRING |
Nein | Lab-Dauer: | Gibt an, wie lange die Compute-Instanz nach Abschluss des Algorithmus für die Wiederverwendung aktiv bleiben soll. Das Format ist eine Folge von Dezimalzahlen mit jeweils einem Suffix für die Einheit, z. B. 4m, 1.5h oder 1h45m. Gültige Zeiteinheiten sind ns, us (oder µs), ms, s, m, h. |
Algorithmusausgabe verarbeiten
Sie müssen die Abfrageergebnisse des Algorithmus persistent speichern, bevor Sie sie prüfen können. Verwenden Sie export_data_option, um zu beschreiben, wie die Ergebnisse persistent gespeichert werden. Sie können die Ergebnisse in Cloud Storage oder in derselben Spanner-Instanz speichern, aus der die Abfrage stammt.
Ergebnisse in Cloud Storage speichern
Wenn Sie diese Option verwenden möchten, muss dem von Google verwalteten Spanner-Dienstkonto
service-PROJECT_NUMBER@gcp-sa-spanner. die Rolle Storage-Objekt-Administrator (roles/storage.objectAdmin) zugewiesen sein.
Die folgenden EXPORT DATA-Optionen werden beim Speichern von Ergebnissen in Cloud Storage unterstützt. Geben Sie die Optionen im folgenden Format an: NAME=VALUE, ....
| Name | Werttyp | Erforderlich | Beschreibung |
|---|---|---|---|
uri |
STRING |
Ja | Der Ziel-URI für den Export im gs://bucket/path/file-Format. Wenn Sie eine große Datenmenge exportieren, verwenden Sie einen Platzhalter in uri, um die Daten in mehrere Dateien zu exportieren. Beispiel: gs://bucket/path/file_*.csv |
format |
STRING |
Ja | Das Format der exportierten Daten. Unterstützte Werte: CSV, PARQUET, AVRO. |
header |
BOOL |
Nein | Wenn true, gibt das System Spaltenüberschriften für die erste Zeile jeder Datendatei aus. Der Standardwert ist false. Gilt nur für CSV. |
overwrite |
BOOL |
Nein | Wenn true, werden alle vorhandenen Dateien mit demselben URI überschrieben. Andernfalls wird ein Fehler zurückgegeben, wenn Dateien mit demselben URI vorhanden sind. Der Standardwert ist false. |
field_delimiter |
STRING |
Nein | Das Trennzeichen, das Felder trennt. Standard: , (Komma). Gilt nur für CSV. |
compression |
STRING |
Nein | Gibt das Komprimierungsformat an. Wenn Sie kein Komprimierungsformat angeben, bleiben die Dateien unkomprimiert.
|
Die Spaltennamen in der RETURN-Klausel definieren die Spaltennamen in Cloud Storage-Ausgabedateien.
Daten in eine oder mehrere Dateien exportieren
Spanner Graph-Abfragen unterstützen einen einzelnen Platzhalteroperator (*) in der uri. Der Platzhalter kann im Dateinamen, aber nicht im Bucket-Namen, Ordnernamen oder in der Dateiendung enthalten sein. Wenn Sie den Platzhalteroperator verwenden, wird Spanner Graph angewiesen, mehrere fragmentierte Dateien basierend auf dem von Ihnen angegebenen Muster zu erstellen, wenn die Ergebnismenge groß ist. Das System ersetzt den Platzhalteroperator durch eine Zahl, die bei null beginnt und links mit Nullen auf 12 Ziffern aufgefüllt wird. Mit dem URI gs://my-bucket/file-*.csv werden beispielsweise Dateien wie gs://my-bucket/file-000000000000.csv, gs://my-bucket/file-000000000001.csv und ähnliche Dateien erstellt.
Wenn Sie einen uri ohne Platzhalter verwenden, ist das Ergebnis eine einzelne Datei, z. B. gs://my-bucket/file.csv.
Datentypen
Wenn Sie Daten exportieren, werden die Spanner Graph-Datentypen je nach Format so konvertiert:
CSV
Alle Datentypen werden in ihre String-Darstellung konvertiert:
BOOL-Werte werden intrueoderfalseumgewandelt.BYTES-Werte werden base64-codiert.TIMESTAMP-Werte werden alsYYYY-MM-DD HH:MM:SS.ffffff UTCformatiert.NULL-Werte werden als leere Strings angezeigt.
Verschachtelte und wiederkehrende Daten können nicht im CSV-Format exportiert werden.
Avro
| Spanner-Datentyp | Avro-Datentyp |
|---|---|
BOOL |
BOOLEAN |
INT64 |
LONG |
FLOAT |
FLOAT |
DOUBLE |
DOUBLE |
NUMERIC |
BYTES mit logischem Typ DECIMAL(38,9) |
STRING |
STRING |
BYTES |
BYTES |
TIMESTAMP |
LONG (Mikrosekunden seit Epoche) |
NULL |
null |
Parquet
| Spanner-Datentyp | Parquet-Datentyp |
|---|---|
BOOL |
BOOLEAN |
INT64 |
INT64 |
FLOAT |
FLOAT |
DOUBLE |
DOUBLE |
NUMERIC |
DECIMAL(38,9) |
STRING |
STRING |
BYTES |
BYTE_ARRAY |
TIMESTAMP |
TIMESTAMP_MICROS |
NULL |
null |
Ergebnisse in Spanner speichern
Die folgenden EXPORT DATA-Optionen werden unterstützt, wenn Ergebnisse in Ihrer Quell-Spanner-Instanz gespeichert werden. Geben Sie die Optionen im folgenden Format an: NAME=VALUE, ....
| Name | Werttyp | Erforderlich | Beschreibung |
|---|---|---|---|
format |
STRING |
Ja | Das Format der exportierten Daten. Muss CLOUD_SPANNER lauten. |
table |
STRING |
Ja | Der Name der Cloud Spanner-Zieltabelle, in die Ergebnisse geschrieben werden sollen. Dies kann eine beliebige Tabelle in der Spanner-Instanz sein. |
write_mode |
STRING |
Ja | Der zu verwendende Schreibmodus. Unterstützte Werte:
In beiden Modi werden Datensätze, die eine Einschränkungsverletzung verursachen würden (z. B. fehlende Schlüssel bei einer Aktualisierung, Verletzung eines eindeutigen Index, Verletzung einer Fremdschlüsseleinschränkung), von Spanner übersprungen. Der Schreibvorgang schlägt jedoch bei Fehlern fehl, die nicht auf eine Verletzung von Einschränkungen zurückzuführen sind, z. B. bei einem Spaltentypkonflikt oder fehlenden Werten für NOT NULL-Spalten. |
Voraussetzungen
Wenn Sie Algorithmus-Ergebnisse in Spanner speichern, muss Ihre Algorithmus-Abfrage die folgenden Anforderungen erfüllen:
- Die Zieltabelle muss vorhanden sein.
- Spalten müssen mit einem passenden Typ vorhanden sein: Alle in der
RETURN-Klausel angegebenen Spaltennamen müssen bereits in der Zieltabelle mit einem passenden Datentyp vorhanden sein. Verwenden Sie bei Bedarf Aliase, um die Spaltennamen der Zieltabelle abzugleichen. Beispiel:RETURN node.id AS person_id. - Alle Primärschlüsselspalten einbeziehen: Die
RETURN-Klausel muss alle Primärschlüsselspalten der Zieltabelle enthalten.
Semantik schreiben
Das Speichern von Ergebnissen in Spanner ist ein nicht transaktionaler Vorgang. Er bietet Atomarität auf Zeilenebene. Das bedeutet, dass das System entweder alle Spalten aus derselben Zeile erfolgreich schreibt oder keine davon. Es folgt der „Mindestens einmal“-Semantik. Das bedeutet, dass eine Zeile mehrmals geschrieben werden kann. Wenn Sie während der Ausführung aus der Zieltabelle lesen, erhalten Sie möglicherweise unvollständige Ergebnisse.
Wenn die Gesamtausführung fehlschlägt, werden bereits übernommene Änderungen nicht rückgängig gemacht. Der Schreibvorgang schlägt beim ersten nicht wiederholbaren Fehler fehl. Wenn ein Schreibfehler auftritt, gibt der ERROR_MESSAGE in GRAPH_OPERATION_EXECUTION_STATUS den Primärschlüssel der Zeile an, die fehlgeschlagen ist, sowie den genauen Grund für den Fehler.
Das System schreibt die Algorithmus-Ergebnisse mit der MEDIUM-Priorität zurück in Spanner Graph.
Beispielabfragen für Algorithmen ausführen
In diesem Abschnitt finden Sie Beispielabfragen für Spanner Graph-Algorithmen, die Sie für eine Testinstanz ausführen können. Eine vollständige Liste der von Spanner Graph unterstützten Algorithmen finden Sie unter Spanner Graph-Algorithmen.
Hinweis
Damit Sie die Beispielabfragen für Spanner Graph-Algorithmen ausführen können, müssen Sie zuerst Folgendes ausführen:
- Folgen Sie der Anleitung unter Spanner Graph einrichten und abfragen, um einen Spanner Graph zu erstellen.
- Prüfen Sie, ob Sie die erforderlichen Berechtigungen haben.
- Optional: Erweitern Sie das Spanner Graph-Schema, wenn Sie die Ausgabe in Spanner speichern.
Fügen Sie der Tabelle Account eine neue Spalte mit dem Namen page_rank hinzu. Spanner schreibt die Algorithmus-Ergebnisse in diese neue Spalte. Aktualisieren Sie dann die Diagrammdefinition, damit Sie als Knotenattribut auf page_rank zugreifen können.
-- Add `page_rank` as a column. Data type of this column matches the data type defined in `PageRank` output signature.
ALTER TABLE Account ADD COLUMN page_rank FLOAT64;
-- Rerun the graph definition DDL to pickup `page_rank` as a new property.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (`Account`, `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`
);
Algorithmus für den vollständigen Graphen mit Labelfilter ausführen und Ergebnisse in Cloud Storage speichern
In diesem Beispiel wird die Anweisung PageRank ausgeführt, um die Konten anhand der Überweisungen, an denen sie beteiligt sind, in eine Rangfolge zu bringen. Die Abfrageergebnisse werden im CSV-Format als my-bucket-name/my-output.csv in einem Cloud Storage-Bucket gespeichert.
EXPORT DATA OPTIONS (
uri = "gs://my-bucket-name/my-output.csv",
format = "csv"
) AS
GRAPH FinGraph
CALL PageRank(node_labels => ['Account'], edge_labels => ['Transfers']) YIELD node, score
RETURN node.id, score AS page_rank
In Cloud Storage sollte eine CSV-Datei mit zwei Spalten (id und page_rank) angezeigt werden, wenn diese Abfrage erfolgreich abgeschlossen wurde.
Algorithmus für den durch MATCH definierten Subgraphen ausführen und Ergebnisse im Graphen speichern
In diesem Beispiel wird das Muster MATCH verwendet, um dynamisch einen logischen Untergraphen abzugleichen, der alle Account-Knoten und nur Transfer-Kanten mit einem Betrag von weniger als 500 enthält.
Dieser logische Teilgraph ist die Eingabe für den PageRank-Algorithmus.
Spanner speichert die Algorithmus-Ergebnisse in der Tabelle Account.
EXPORT DATA OPTIONS (
format = "CLOUD_SPANNER",
table = "Account",
write_mode = 'update_ignore_all'
) AS
GRAPH FinGraph
MATCH (n:Account)
RETURN n
FULL UNION ALL
MATCH -[e:Transfers WHERE e.amount < 500]->
RETURN e
NEXT
CALL PER () PageRank() YIELD node, score
RETURN node.id, score AS page_rank
Führen Sie nach erfolgreichem Abschluss der Abfrage die folgende Abfrage aus:
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id, ROUND(n.page_rank, 2) AS page_rank
ORDER BY page_rank DESC, id ASC
Die Ergebnisse sollten in etwa so aussehen:
| id | page_rank |
|---|---|
| 20 | 0.49 |
| 16 | 0,46 |
| 7 | 0,05 |
Status der Algorithmusausführung prüfen
Wenn eine Graphalgorithmus-Abfrage erfolgreich abgeschlossen wurde, gibt sie null Zeilen und den Status Success zurück. Je nach Größe des Eingabediagramms und den spezifischen Algorithmuskonfigurationen kann die Ausführung des Algorithmus einige Zeit dauern. Sie können den Fortschritt und den Ausführungsstatus einer Graphalgorithmus-Abfrage in der Tabelle SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS prüfen. In dieser Tabelle werden Informationen 30 Tage lang aufbewahrt.
GRAPH_OPERATION_EXECUTION_STATUS Schema
| Spaltenname | Typ | Beschreibung |
|---|---|---|
QUERY_ID |
STRING |
Die ID für die Graph-Algorithmus-Abfrage. |
QUERY_TEXT |
STRING |
Der Text der Abfrageanweisung. |
START_TIMESTAMP |
TIMESTAMP |
Der Zeitpunkt, zu dem die Ausführung der Abfrage begonnen hat. |
LAST_UPDATE_TIMESTAMP |
TIMESTAMP |
Der Zeitpunkt, zu dem der Status zuletzt aktualisiert wurde. |
PROGRESS |
FLOAT64 |
Geschätzter Prozentsatz der Fertigstellung. Der Wert liegt zwischen 0 und 1, wobei 0 „gestartet“ und 1 „abgeschlossen“ bedeutet. |
STATUS |
STRING |
Aktueller Ausführungsstatus. Mögliche Werte sind PENDING, IN_PROGRESS, OK oder ein Fehlerstatuscode wie CANCELLED, DEADLINE_EXCEEDED, INVALID_ARGUMENT, FAILED_PRECONDITION, RESOURCE_EXHAUSTED, UNAVAILABLE oder UNKNOWN. |
ERROR_MESSAGE |
STRING |
Fehlermeldung, wenn die Abfrageausführung fehlgeschlagen ist. |
In der folgenden Beispielabfrage werden Graphabfragen aufgelistet, die noch nicht erfolgreich abgeschlossen wurden:
SELECT
query_id,
query_text,
start_timestamp,
last_update_timestamp,
progress,
status,
error_message
FROM
SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS
WHERE
status != "OK"
ORDER BY
start_timestamp DESC;
Algorithmusausführung abbrechen
Wenn Sie eine laufende Abfrage eines Diagrammalgorithmus abbrechen möchten, suchen Sie in der Tabelle SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS nach der query_id und rufen Sie dann cancel_query für diese query_id auf.