Spanner Graph-Abfragen – Übersicht

In diesem Dokument wird beschrieben, wie Sie Property-Graphen in Spanner Graph abfragen. In den Beispielen in diesem Abschnitt wird das Diagrammschema verwendet, das Sie unter Cloud Spanner Graph einrichten und abfragen erstellt haben. Es ist im folgenden Diagramm dargestellt:

Beispiel für ein Spanner Graph-Schema

Spanner Graph-Abfrage ausführen

Sie können Spanner-Graphabfragen auf folgende Arten ausführen:

Spanner Graph-Abfragestruktur

In diesem Abschnitt werden die einzelnen Abfragekomponenten ausführlich beschrieben.

Das folgende Beispiel veranschaulicht die grundlegende Struktur einer Spanner-Graphabfrage.

Beispiel für die Struktur einer Spanner Graph-Abfrage

Mit Spanner Graph können Sie mehrere Graphen in einer Datenbank erstellen. Zuerst wird mit der Klausel GRAPH der Zielgraph FinGraph angegeben.

Musterabgleich für Graphen

Mit der Mustererkennung in Diagrammen können Sie bestimmte Muster in Ihrem Diagramm finden. Die einfachsten Muster sind Elementmuster (Knotenmuster und Kantenmuster), die den Graphenelementen (Knoten und Kanten) entsprechen. Elementmuster können zu Pfadmustern und komplexeren Mustern kombiniert werden.

Knotenmuster

Ein Knotenmuster ist ein Muster, das mit Knoten in Ihrem Diagramm übereinstimmt. Dieses Muster besteht aus einem übereinstimmenden Klammerpaar, das optional eine Graphenmustervariable, einen Labelausdruck und Property-Filter enthalten kann.

Alle Knoten finden

Die folgende Abfrage gibt alle Knoten im Graphen zurück. Die Variable n, eine sogenannte Grafikmustervariable, wird an die übereinstimmenden Knoten gebunden. In diesem Fall entspricht das Knotenmuster allen Knoten im Graphen.

GRAPH FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;

Ergebnis

Die Abfrage gibt label und id so zurück:

Label id
Konto 7
Konto 16
Konto 20
Person 1
Person 2
Person 3

Alle Knoten mit einem bestimmten Label finden

Die folgende Abfrage stimmt mit allen Knoten im Graphen überein, die das Person-Label haben. Die Abfrage gibt die Properties label, id und name der übereinstimmenden Knoten zurück.

GRAPH FinGraph
MATCH (p:Person)
RETURN LABELS(p) AS label, p.id, p.name;

Ergebnis

Label id Name
Person 1 Alex
Person 2 Dana
Person 3 Lee

Alle Knoten finden, die einem Labelausdruck entsprechen

Sie können einen Labelausdruck mit einem oder mehreren logischen Operatoren erstellen.

Die folgende Abfrage stimmt mit allen Knoten im Graphen überein, die entweder das Label Person oder Account haben. Die von der Graphenmustervariablen n freigegebenen Eigenschaften sind ein Überset der von den Knoten freigegebenen Eigenschaften, die entweder das Label Person oder Account haben.

GRAPH FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;
  • In den Ergebnissen haben alle Knoten das Attribut id.
  • Knoten, die dem Label Account entsprechen, haben die Eigenschaft create_time, aber nicht die Eigenschaft birthday. Für solche Knoten wird für die Eigenschaft birthday ein NULL zurückgegeben.
  • Knoten, die dem Label Person entsprechen, haben die Eigenschaft birthday, aber nicht die Eigenschaft create_time. Für solche Knoten wird für die Eigenschaft create_time ein NULL zurückgegeben.

Ergebnis

Label id Geburtstag create_time
Konto 7 NULL 2020-01-10T14:22:20.222Z
Konto 16 NULL 2020-01-28T01:55:09.206Z
Konto 20 NULL 2020-02-18T13:44:20.655Z
Person 1 1991-12-21T08:00:00Z NULL
Person 2 1980-10-31T08:00:00Z NULL
Person 3 1986-12-07T08:00:00Z NULL

Weitere Informationen zu Regeln für Labelausdrücke finden Sie unter Labelausdruck.

Alle Knoten finden, die dem Labelausdruck und dem Property-Filter entsprechen

Die folgende Abfrage gleicht alle Knoten im Graphen ab, die das Label Person haben und bei denen das Attribut id dem Wert 1 entspricht.

GRAPH FinGraph
MATCH (p:Person {id: 1})
RETURN LABELS(p) AS label, p.id, p.name, p.birthday;

Ergebnis

Label id Name Geburtstag
Person 1 Alex 1991-12-21T08:00:00Z

Mit der WHERE-Klausel lassen sich komplexere Filterbedingungen für Labels und Properties erstellen.

Die folgende Abfrage entspricht allen Knoten im Graphen, die das Label Person haben und bei denen die Property birthday vor 1990-01-10 liegt.

GRAPH FinGraph
MATCH (p:Person WHERE p.birthday < '1990-01-10')
RETURN LABELS(p) AS label, p.name, p.birthday;

Ergebnis

Label Name Geburtstag
Person Dana 1980-10-31T08:00:00Z
Person Lee 1986-12-07T08:00:00Z

Rahmenmuster

Ein Kantenmuster entspricht Kanten oder Beziehungen zwischen Knoten. Kantenmuster werden in eckige Klammern [] mit den Symbolen -, -> oder <- eingeschlossen, um Richtungen anzugeben.

Ähnlich wie bei Knotenmustern werden Graphmustervariablen verwendet, um sie an übereinstimmende Kantenelemente zu binden.

Alle Kanten mit übereinstimmenden Labels finden

Die folgende Abfrage gibt alle Kanten im Graphen zurück, die das Label Owns haben. Die Grafikmustervariable e ist an die übereinstimmenden Kanten gebunden.

GRAPH FinGraph
MATCH -[e:Owns]->
RETURN e.id AS owner_id, e.account_id;

Ergebnis

owner_id account_id
1 7
3 16
2 20

Alle Kanten finden, die dem Labelausdruck und dem Property-Filter entsprechen

Ähnlich wie bei einem Knotenmuster können für ein Kantenmuster Labelausdrücke, Property-Spezifikationen und WHERE-Klauseln verwendet werden, wie in der folgenden Abfrage gezeigt. Die Abfrage sucht nach allen Kanten, die mit Owns gekennzeichnet sind und die Eigenschaft create_time in einem bestimmten Zeitraum haben.

GRAPH FinGraph
MATCH -[e:Owns WHERE e.create_time > '2020-01-14'
                 AND e.create_time < '2020-05-14']->
RETURN e.id AS owner_id, e.create_time, e.account_id;

Ergebnis

owner_id create_time account_id
2 2020-01-28T01:55:09.206Z 20
3 2020-02-18T13:44:20.655Z 16

Alle Kanten mit beliebigem Richtungsmuster finden

Auch wenn alle Kanten in Spanner-Graphen gerichtet sind, können Sie das any directionKantenmuster -[]- in einer Abfrage verwenden, um Kanten in beide Richtungen abzugleichen.

Mit der folgenden Abfrage werden alle Überweisungen gefunden, an denen ein blockiertes Konto beteiligt ist.

GRAPH FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account)
WHERE account.is_blocked
RETURN transfer.order_number, transfer.amount;

Ergebnis

order_number Menge
304330008004315 300
304120005529714 100
103650009791820 300
302290001255747 200

Pfadmuster

Ein Pfadmuster besteht aus abwechselnden Knoten- und Kantenmustern.

Alle Pfade von einem Knoten mit angegebenen Label- und Property-Filtern mithilfe eines Pfadmusters finden

Mit der folgenden Abfrage werden alle Überweisungen zu einem Konto gefunden, die von einem Konto in Besitz von Person initiiert wurden und bei denen id = 2 ist.

Jedes übereinstimmende Ergebnis stellt einen Pfad von Person {id: 2} über eine verbundene Account über die Kante Owns zu einer anderen Account über die Kante Transfers dar.

GRAPH FinGraph
MATCH
  (p:Person {id: 2})-[:Owns]->(account:Account)-[t:Transfers]->
  (to_account:Account)
RETURN
  p.id AS sender_id, account.id AS from_id, to_account.id AS to_id;

Ergebnis

sender_id from_id to_id
2 20 7
2 20 16

Quantifizierte Pfadmuster

Mit einem quantifizierten Muster kann ein Muster innerhalb eines bestimmten Bereichs wiederholt werden.

Mit einem quantifizierten Kantenmuster abgleichen

Mit der folgenden Abfrage werden alle Zielkonten gefunden, die sich ein bis drei Übertragungen von einer Quelle Account mit id = 7 entfernt befinden, mit Ausnahme des Quellkontos selbst.

Das Kantenmuster mit dem Quantifikator {1, 3} als Suffix.

GRAPH FinGraph
MATCH (src:Account {id: 7})-[e:Transfers]->{1, 3}(dst:Account)
WHERE src != dst
RETURN src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length, dst.id AS dst_account_id;

Ergebnis

src_account_id path_length dst_account_id
7 1 16
7 1 16
7 1 16
7 3 16
7 3 16
7 2 20
7 2 20

Im vorherigen Beispiel wird die ARRAY_LENGTH-Funktion verwendet, um auf group variable e zuzugreifen. Weitere Informationen finden Sie unter Zugriffsgruppenvariable.

Einige Zeilen in den Beispielergebnissen werden wiederholt, da es möglicherweise mehrere Pfade zwischen demselben Paar von src- und dst-Konten gibt, die dem Muster entsprechen.

Übereinstimmung mit einem quantifizierten Pfadmuster

Mit der folgenden Abfrage werden Pfade zwischen Account-Knoten mit ein bis zwei Transfers-Kanten über blockierte Zwischenkonten gefunden.

Das Pfadmuster in Klammern wird quantifiziert und die WHERE-Klausel wird in den Klammern verwendet, um Bedingungen für das wiederholte Muster anzugeben.

GRAPH FinGraph
MATCH
  (src:Account)
  ((:Account)-[:Transfers]->(interm:Account) WHERE interm.is_blocked){1,2}
    -[:Transfers]->(dst:Account)
RETURN src.id AS src_account_id, dst.id AS dst_account_id;

Ergebnis

src_account_id dst_account_id
7 20
7 20
20 20

Gruppenvariablen

Eine in einem quantifizierten Muster deklarierte Graphenmustervariable wird als Gruppenvariable betrachtet, wenn auf sie außerhalb des quantifizierten Musters zugegriffen wird. Sie wird an ein Array von übereinstimmenden Graphenelementen gebunden.

Sie können auf eine Gruppenvariable als Array zugreifen, in dem Diagrammelemente in der Reihenfolge ihrer Darstellung entlang der übereinstimmenden Pfade beibehalten werden. Sie können eine Gruppenvariable mithilfe der horizontalen Aggregation zusammenfassen.

Variable für Zugriffsgruppe

Im folgenden Beispiel wird auf die Variable e so zugegriffen:

  • Eine Graphmustervariable, die in der Klausel WHEREe.amount > 100 (innerhalb des quantifizierten Musters) an eine einzelne Kante gebunden ist.
  • Eine Gruppenvariable, die in der RETURN-Anweisung in ARRAY_LENGTH(e) an ein Array von Kantenelementen gebunden ist (außerhalb des quantifizierten Musters).
  • Eine Gruppenvariable, die an ein Array von Kantenelementen gebunden ist und von SUM(e.amount) außerhalb des quantifizierten Musters aggregiert wird. Dies ist ein Beispiel für eine horizontale Aggregation.
GRAPH FinGraph
MATCH
  (src:Account {id: 7})-[e:Transfers WHERE e.amount > 100]->{0,2}
  (dst:Account)
WHERE src.id != dst.id
LET total_amount = SUM(e.amount)
RETURN
  src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length,
  total_amount, dst.id AS dst_account_id;

Ergebnis

src_account_id path_length total_amount dst_account_id
7 1 300 16
7 2 600 20

Beliebige und beliebige kürzeste Pfade

Wenn Sie die übereinstimmenden Pfade in jeder Pfadgruppe mit denselben Quell- und Zielknoten einschränken möchten, können Sie das Suchpräfix für den Pfad ANY oder ANY SHORTEST verwenden. Sie können diese Präfixe nur vor einem vollständigen Pfadmuster anwenden und nicht in Klammern.

Übereinstimmung mit BEIMEVERWENDEN

Mit der folgenden Abfrage werden alle erreichbaren eindeutigen Konten gefunden, die sich ein oder zwei Transfers von einem bestimmten Account-Knoten entfernt befinden.

Das Pfadsuchpräfix ANY sorgt dafür, dass nur ein Pfad zwischen einem eindeutigen Paar von src- und dst-Account-Knoten zurückgegeben wird. Im folgenden Beispiel können Sie den Knoten Account mit {id: 16} über zwei verschiedene Pfade vom Quellknoten Account aus erreichen. Die Ergebnisse enthalten jedoch nur einen Pfad.

GRAPH FinGraph
MATCH ANY (src:Account {id: 7})-[e:Transfers]->{1,2}(dst:Account)
LET ids_in_path = ARRAY(SELECT e.to_id FROM UNNEST(e) AS e)
RETURN src.id AS src_account_id, dst.id AS dst_account_id, ids_in_path;

Ergebnis

src_account_id dst_account_id ids_in_path
7 16 16
7 20 16,20

Diagrammmuster

Ein Graphenmuster besteht aus einem oder mehreren Pfadmustern, die durch Kommas , getrennt sind. Graphmuster können eine WHERE-Klausel enthalten, mit der Sie auf alle Graphmustervariablen in den Pfadmustern zugreifen können, um Filterbedingungen zu bilden. Jedes Pfadmuster führt zu einer Sammlung von Pfaden.

Übereinstimmung mit einem Graphenmuster

Die folgende Abfrage identifiziert Zwischenkonten und ihre Inhaber, die an Transaktionen mit einem Betrag von über 200 € beteiligt sind, über die Gelder von einem Quellkonto in ein blockiertes Konto übertragen werden.

Die folgenden Pfadmuster bilden das Graphmuster:

  • Das erste Muster findet Pfade, bei denen die Übertragung von einem Konto über ein Zwischenkonto in ein blockiertes Konto erfolgt.
  • Das zweite Muster findet Pfade von einem Konto zu der Person, die es besitzt.

Die Variable interm dient als gemeinsame Verknüpfung zwischen den beiden Pfadmustern. Daher muss interm in beiden Pfadmustern auf denselben Elementknoten verweisen. Dadurch wird ein äquivalenter Join-Vorgang basierend auf der Variablen interm erstellt.

GRAPH FinGraph
MATCH
  (src:Account)-[t1:Transfers]->(interm:Account)-[t2:Transfers]->(dst:Account),
  (interm)<-[:Owns]-(p:Person)
WHERE dst.is_blocked = TRUE AND t1.amount > 200 AND t2.amount > 200
RETURN
  src.id AS src_account_id, dst.id AS dst_account_id,
  interm.id AS interm_account_id, p.id AS owner_id;

Ergebnis

src_account_id dst_account_id interm_account_id owner_id
20 16 7 1

Lineare Abfrageanweisungen

Sie können mehrere Graph-Anweisungen zu einer linearen Abfrageanweisung verketten. Die Anweisungen werden in der Reihenfolge ausgeführt, in der sie in der Abfrage erscheinen.

  • Jede Anweisung nimmt die Ausgabe der vorherigen Anweisung als Eingabe. Die Eingabe ist für die erste Anweisung leer.
  • Die Ausgabe der letzten Anweisung ist das Endergebnis.

Maximale Überweisung an ein gesperrtes Konto ermitteln

Mit der folgenden Abfrage wird das Konto und sein Inhaber mit der größten ausgehenden Überweisung an ein blockiertes Konto ermittelt.

GRAPH FinGraph
MATCH (src_account:Account)-[transfer:Transfers]->(dst_account:Account)
WHERE dst_account.is_blocked
ORDER BY transfer.amount DESC
LIMIT 1
MATCH (src_account:Account)<-[owns:Owns]-(owner:Person)
RETURN src_account.id AS account_id, owner.name AS owner_name;

In der folgenden Tabelle wird veranschaulicht, wie die Zwischenergebnisse an die Anweisungen übergeben werden. Aus Gründen der Übersichtlichkeit werden nur einige Eigenschaften der Zwischenergebnisse angezeigt.

Aussage Zwischenergebnis (abgekürzt)
MATCH
  (src_account:Account)
    -[transfer:Transfers]->
  (dst_account:Account)
WHERE dst_account.is_blocked
src_account Übertragung dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}

ORDER BY transfer.amount DESC
src_account Übertragung dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}

LIMIT 1
src_account Übertragung dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}

MATCH
  (src_account:Account)
    <-[owns:Owns]-
  (owner:Person)
src_account Übertragung dst_account belongs to owner
{id: 7} {amount: 300.0} {id: 16, is_blocked: true} {person_id: 1, account_id: 7} {id: 1, name: Alex}

RETURN
  src_account.id AS account_id,
  owner.name AS owner_name
account_id owner_name
7 Alex

Ergebnis

account_id owner_name
7 Alex

Return-Anweisung

Mit der Rückgabeanweisung wird festgelegt, was aus den übereinstimmenden Mustern zurückgegeben werden soll. Sie kann auf Graphmustervariablen zugreifen, Ausdrücke und andere Klauseln wie ORDER_BY und GROUP_BY enthalten. Weitere Informationen finden Sie in der RETURN-Anweisung.

Spanner Graph unterstützt nicht die Rückgabe von Graphelementen als Abfrageergebnisse. Wenn Sie das gesamte Grafikelement zurückgeben möchten, verwenden Sie die Funktion TO_JSON oder SAFE_TO_JSON. Wir empfehlen, SAFE_TO_JSON zu verwenden.

Diagrammelemente als JSON zurückgeben

GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Returning a graph element in the final results is NOT allowed. Instead, use
-- the TO_JSON function or explicitly return the graph element's properties.
RETURN TO_JSON(n) AS n;
GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Certain fields in the graph elements, such as TOKENLIST, can't be returned
-- in the TO_JSON function. In those cases, use the SAFE_TO_JSON function instead.
RETURN SAFE_TO_JSON(n) AS n;

Ergebnis

n
{"identifier":"mUZpbkdyYXBoLkFjY291bnQAeJEO","kind":"node","labels":["Account"],"properties":{"create_time":"2020-01-10T14:22:20.222Z","id":7,"is_blocked":false,"nick_name":"Urlaubsfonds"}}

Größere Abfragen mit dem NEXT-Keyword erstellen

Mit dem Schlüsselwort NEXT können Sie mehrere Anweisungen für lineare Graphabfragen verketten. Die Eingabe für die erste lineare Abfrageanweisung ist leer. Die Ausgabe jeder linearen Abfrageanweisung wird als Eingabe für die nächste lineare Abfrageanweisung verwendet.

Im folgenden Beispiel wird der Inhaber des Kontos mit den meisten eingehenden Überweisungen ermittelt, indem mehrere lineare Graphausdrücke verkettet werden. Sie können dieselbe Variable (in diesem Beispiel account) verwenden, um in mehreren linearen Anweisungen auf dasselbe Diagrammelement zu verweisen.

GRAPH FinGraph
MATCH (:Account)-[:Transfers]->(account:Account)
RETURN account, COUNT(*) AS num_incoming_transfers
GROUP BY account
ORDER BY num_incoming_transfers DESC
LIMIT 1

NEXT

MATCH (account:Account)<-[:Owns]-(owner:Person)
RETURN account.id AS account_id, owner.name AS owner_name, num_incoming_transfers;

Ergebnis

account_id owner_name Anzahl_eingehender_Übertragungen
16 Lee 3

Funktionen und Ausdrücke

Sie können alle GoogleSQL-Funktionen (sowohl Aggregations- als auch Skalarfunktionen), Operatoren und Bedingte Ausdrücke in Spanner-Graphabfragen verwenden. Spanner Graph unterstützt außerdem grafspezifische Funktionen und Operatoren.

Integrierte Funktionen und Operatoren

Die folgenden Funktionen und Operatoren werden häufig in GQL verwendet:

  • PROPERTY_EXISTS(n, birthday): Gibt zurück, ob n das Attribut birthday freigibt.
  • LABELS(n): Gibt die Labels von n zurück, wie im Diagrammschema definiert.
  • PROPERTY_NAMES(n): Gibt die Attributnamen von n zurück.
  • TO_JSON(n): Gibt n im JSON-Format zurück. Weitere Informationen finden Sie unter TO_JSON-Funktion.

In der folgenden Abfrage werden das Prädikat PROPERTY_EXISTS, die Funktion LABELS und die Funktion TO_JSON sowie andere vordefinierte Funktionen wie ARRAY_AGG und CONCAT veranschaulicht.

GRAPH FinGraph
MATCH (person:Person)-[:Owns]->(account:Account)
RETURN person, ARRAY_AGG(account.nick_name) AS accounts
GROUP BY person

NEXT

RETURN
  LABELS(person) AS labels,
  TO_JSON(person) AS person,
  accounts,
  CONCAT(person.city, ", ", person.country) AS location,
  PROPERTY_EXISTS(person, is_blocked) AS is_blocked_property_exists,
  PROPERTY_EXISTS(person, name) AS name_property_exists
LIMIT 1;

Ergebnis

is_blocked_property_exists name_property_exists Labels Konten Standort Person
falsch wahr Person ["Urlaubskasse"] Adelaide, Australien {"identifier":"mUZpbkdyYXBoLlBlcnNvbgB4kQI=","kind":"node","labels":["Person"],"properties":{"birthday":"1991-12-21T08:00:00Z","city":"Adelaide","country":"Australia","id":1,"name":"Alex"}}

Unterabfragen

Eine Unterabfrage ist eine in einer anderen Abfrage verschachtelte Abfrage. Im Folgenden finden Sie die Regeln für untergeordnete Abfragen in Spanner-Graphen:

  • Eine Unterabfrage ist in geschweifte Klammern {} gesetzt.
  • Eine Unterabfrage kann mit der führenden GRAPH-Klausel beginnen, um den Gültigkeitsbereich des Graphen anzugeben. Der angegebene Graph muss nicht mit dem in der äußeren Abfrage verwendeten Graphen übereinstimmen.
  • Wenn die GRAPH-Klausel in der Unterabfrage weggelassen wird, geschieht Folgendes:
    • Der gültige Graph wird aus dem nächstgelegenen äußeren Abfragekontext abgeleitet.
    • Die Unterabfrage muss mit einer Anweisung zum Abgleichen von Graphmustern mit dem MATCH. beginnen.
  • Eine Variable für das Diagrammmuster, die außerhalb des Gültigkeitsbereichs der Unterabfrage deklariert wurde, kann nicht noch einmal innerhalb der Unterabfrage deklariert werden. Sie kann jedoch in Ausdrücken oder Funktionen innerhalb der Unterabfrage referenziert werden.

Mit einer untergeordneten Abfrage die Gesamtzahl der Überweisungen von jedem Konto ermitteln

In der folgenden Abfrage wird die Verwendung der untergeordneten Abfrage VALUE veranschaulicht. Die untergeordnete Abfrage ist in eckige Klammern {} mit dem Präfix VALUE eingeschlossen. Die Abfrage gibt die Gesamtzahl der Überweisungen zurück, die von einem Konto aus initiiert wurden.

GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(account:Account)
RETURN p.name, account.id AS account_id, VALUE {
  MATCH (a:Account)-[transfer:Transfers]->(:Account)
  WHERE a = account
  RETURN SUM(transfer.amount) AS total_transfer
} AS total_transfer;

Ergebnis

Name account_id total_transfer
Alex 7 400
Dana 20 700
Lee 16 300

Eine Liste der unterstützten Unterabfrageausdrücke finden Sie unter Unterabfragen in Spanner-Graphen.

Abfrageparameter

Sie können Spanner Graph mit Parametern abfragen. Weitere Informationen finden Sie in der Syntax und in den Spanner-Clientbibliotheken unter Daten mit Parametern abfragen.

In der folgenden Abfrage wird die Verwendung von Suchparametern veranschaulicht.

GRAPH FinGraph
MATCH (person:Person {id: @id})
RETURN person.name;

Diagramme und Tabellen gemeinsam abfragen

Sie können Graphabfragen in Verbindung mit SQL verwenden, um in einer einzigen Anweisung auf Informationen aus Ihren Grafiken und Tabellen zuzugreifen.

GRAPH_TABLE

Der Operator GRAPH_TABLE nimmt eine lineare Grafikabfrage an und gibt das Ergebnis in tabellarischer Form zurück, die nahtlos in eine SQL-Abfrage eingebunden werden kann. Dank dieser Interoperabilität können Sie die Ergebnisse von Graphabfragen mit nicht grafischen Inhalten anreichern und umgekehrt.

Sie können beispielsweise eine CreditReports-Tabelle erstellen und einige Kreditberichte einfügen, wie im folgenden Beispiel gezeigt:

CREATE TABLE CreditReports (
  person_id     INT64 NOT NULL,
  create_time   TIMESTAMP NOT NULL,
  score         INT64 NOT NULL,
) PRIMARY KEY (person_id, create_time);
INSERT INTO CreditReports (person_id, create_time, score)
VALUES
  (1,"2020-01-10 06:22:20.222", 700),
  (2,"2020-02-10 06:22:20.222", 800),
  (3,"2020-03-10 06:22:20.222", 750);

Anschließend können Sie Personen mithilfe der Diagrammmusterabgleich-Funktion in GRAPH_TABLE ermitteln und die Ergebnisse der Diagrammabfrage mit der Tabelle CreditReports zusammenführen, um auf den Kreditscore zuzugreifen.

SELECT
  gt.person.id,
  credit.score AS latest_credit_score
FROM GRAPH_TABLE(
  FinGraph
  MATCH (person:Person)-[:Owns]->(:Account)-[:Transfers]->(account:Account)
  WHERE account.is_blocked
  RETURN DISTINCT person
) AS gt
JOIN CreditReports AS credit
  ON gt.person.id = credit.person_id
ORDER BY credit.create_time;

Ergebnis:

person_id latest_credit_score
1 700
2 800

Nächste Schritte

Best Practices für die Abfrageoptimierung