Spanner Graph-Abfragen – Übersicht

In diesem Dokument wird beschrieben, wie Sie Attributdiagramme in Spanner Graph abfragen. In den Beispielen in diesem Abschnitt wird das Graphschema 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 Graph-Abfragen auf folgende Arten ausführen:

Spanner Graph-Abfragestruktur

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

Das folgende Beispiel veranschaulicht die Grundstruktur eines Spanner-Diagramms Abfrage.

Beispiel für die Struktur einer Spanner Graph-Abfrage

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

Musterabgleich grafisch darstellen

Mit dem Diagrammmusterabgleich können Sie bestimmte Muster in Ihrem Diagramm finden. Die grundlegendsten Muster sind Elementmuster (Knotenmuster und Kantenmuster), die den Graphenelementen (Knoten und Kanten) entsprechen. Elementmuster können in und komplexere Muster zu erkennen.

Knotenmuster

Ein Knotenmuster ist ein Muster, das Knoten aus Ihrem Graphen entspricht. Dieses Muster ein übereinstimmendes Klammernpaar, das optional eine Variable für Graphmuster, einen Labelausdruck und Eigenschaftsfilter enthalten.

Alle Knoten finden

Die folgende Abfrage gibt alle Knoten im Graphen zurück. Die Variable n mit dem Namen Eine Variable für Graph-Muster, 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 suchen

Die folgende Abfrage stimmt mit allen Knoten im Diagramm überein, die den Person haben label: 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 Gruppe der Eigenschaften, die von Die Variable n des Diagrammmusters ist die Obermenge der Eigenschaften, Knoten, 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 das Attribut create_time, aber nicht haben die Eigenschaft birthday. Für solche Knoten wird für die Eigenschaft birthday ein NULL zurückgegeben.
  • Knoten, die dem Label Person entsprechen, haben das Attribut birthday, aber nicht das Attribut create_time. NULL wird für create_time zurückgegeben. für solche Knoten.

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 stimmt mit allen Knoten im Diagramm überein, die das Label Person haben. und wobei die Eigenschaft id gleich 1 ist.

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

Sie können die WHERE-Klausel verwenden, um komplexere Filterbedingungen für und Eigenschaften.

Die folgende Abfrage stimmt mit allen Knoten im Diagramm überein, die den Person haben Label und die Eigenschaft birthday liegt vor 1990-01-10.

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 gleicht Kanten oder Beziehungen zwischen Knoten ab. 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 Die Konto-ID von Tinfoil Security
1 7
3 16
2 20

Alle Kanten finden, die dem Labelausdruck und Eigenschaftenfilter 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 Die Konto-ID von Tinfoil Security
2 2020-01-28T01:55:09.206Z 20
3 2020-02-18T13:44:20.655Z 16

Alle Kanten mit einem beliebigen Kantenmuster in Richtung finden

Obwohl alle Kanten in Spanner Graph gerichtet sind, können Sie die Methode Das Randmuster any direction -[]- in einer Abfrage, um die Kanten in beide Richtungen abzugleichen.

Mit der folgenden Abfrage werden alle Übertragungen ermittelt, bei denen ein gesperrtes Konto betroffen 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 Attributfiltern 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.

Übereinstimmung mit einem quantifizierten Edge-Muster

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

Das Randmuster wird mit dem Quantifizierer {1, 3} nachträglich fixiert.

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 mit der Funktion ARRAY_LENGTH auf die group variable e Weitere Informationen finden Sie unter Zugriffsgruppenvariable.

Einige Zeilen in den Beispielergebnissen werden wiederholt, da mehrere Zeilen Pfade zwischen demselben Paar aus src- und dst-Konten, die mit dem Muster übereinstimmen.

Ü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 die Diagrammelemente in der Reihenfolge ihrer Darstellung entlang der übereinstimmenden Pfade beibehalten werden. Sie können eine Gruppe zusammenfassen, Variable mit horizontaler Aggregation.

Zugriffsgruppenvariable

Im folgenden Beispiel wird so auf die Variable e zugegriffen:

  • Eine Graphmustervariable, die in der Klausel WHEREe.amount > 100 (innerhalb des quantifizierten Musters) an eine einzelne Kante gebunden ist.
  • Eine Gruppenvariable, die an ein Array von Edge-Elementen in ARRAY_LENGTH(e) gebunden ist in der RETURN-Anweisung (außerhalb des quantifizierten Musters).
  • Eine Gruppenvariable, die an ein aggregiertes Array von Edge-Elementen gebunden ist durch SUM(e.amount) außerhalb des quantifizierten Musters. Dies ist ein Beispiel für 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.

Abgleich mit ANY

Mit der folgenden Abfrage werden alle erreichbaren eindeutigen Konten ermittelt, bei denen es sich um ein oder zwei Konten handelt. Transfers entfernt von einem angegebenen Account-Knoten.

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 Sie können den Account-Knoten mit {id: 16} jedoch in zwei verschiedenen vom Quellknoten Account entfernt, enthalten die Ergebnisse 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

Muster grafisch darstellen

Ein Graphenmuster besteht aus einem oder mehreren Pfadmustern, die durch Kommas , getrennt sind. Grafikmuster können eine WHERE-Klausel enthalten, mit der Sie auf alle Mustervariablen in den Pfadmustern grafisch darstellen, 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 mit einem Zwischenkonto in ein gesperrtes Konto.
  • Das zweite Muster findet Pfade von einem Konto zum Kontoinhaber.

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.

  • Für jede Anweisung wird die Ausgabe der vorherigen Anweisung als Eingabe verwendet. Die Eingabe ist für die erste Anweisung leer.
  • Die Ausgabe der letzten Anweisung ist das Endergebnis.

Maximale Anzahl von Überweisungen an ein blockiertes Konto ermitteln

Mit der folgenden Abfrage werden das Konto und der Inhaber mit den meisten ausgehenden in ein gesperrtes Konto übertragen werden.

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. Es werden nur einige Eigenschaften der Zwischenergebnisse angezeigt, Kürze.

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 hat 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

Die Konto-ID von Tinfoil Security owner_name
7 Alex

Return-Anweisung

Return-Anweisung definiert, was von den übereinstimmenden Mustern zurückgegeben werden soll. Zugriff Variablen grafisch darstellen, Ausdrücke und andere Klauseln wie ORDER_BY GROUP_BY verwendet. Weitere Informationen finden Sie in der RETURN-Anweisung.

Spanner Graph unterstützt nicht die Rückgabe von Graphelementen als Abfrageergebnisse. Wenn das gesamte Diagrammelement zurückgegeben werden soll, verwenden Sie die TO_JSON-Funktion.

Grafikelemente 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;

Ergebnis

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

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 eines jeden linearen Abfrageanweisung wird als Eingabe für die nächste lineare Abfrageanweisung verwendet.

Im folgenden Beispiel wird der Inhaber des Kontos mit den meisten Anfragen ermittelt durch Verkettung mehrerer linearer Anweisungen eines Graphen aneinander. 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

Die Konto-ID von Tinfoil Security owner_name num_incoming_transfers
16 Lee 3

Funktionen und Ausdrücke

Sie können alle Funktionen, Operatoren und Bedingungen in GoogleSQL, einschließlich Aggregatfunktionen und andere Skalarfunktionen in der Spanner-Grafik-Abfrage.

Spanner Graph unterstützt auch integrierte Funktionen und Operatoren für Grafikelemente.

Integrierte Funktionen und Operatoren

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

  • PROPERTY_EXISTS(n, birthday): Gibt zurück, ob n birthday verfügbar macht Property.
  • 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 in der TO_JSON-Funktion.

In der folgenden Abfrage werden das Prädikat PROPERTY_EXISTS, die Funktionen LABELS und 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
false wahr Person ["Urlaubskasse"] Adelaide, Australien {&quot;identifier&quot;:&quot;mUZpbkdyYXBoLlBlcnNvbgB4kQI=&quot;,&quot;kind&quot;:&quot;node&quot;,&quot;labels&quot;:[&quot;Person&quot;],&quot;properties&quot;:{&quot;birthday&quot;:&quot;1991-12-21T08:00:00Z&quot;,&quot;city&quot;:&quot;Adelaide&quot;,&quot;country&quot;:&quot;Australia&quot;,&quot;id&quot;:1,&quot;name&quot;:&quot;Alex&quot;}}

Unterabfragen

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

  • Eine Unterabfrage ist in geschweifte Klammern {} eingeschlossen.
  • 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:
    • Das betreffende Diagramm wird aus dem nächstgelegenen äußeren Abfragekontext abgeleitet.
    • Die Unterabfrage muss mit einer Anweisung zum Abgleichen von Graphmustern mit dem MATCH. beginnen.
  • Eine Diagrammmustervariable, die außerhalb des Unterabfragebereichs deklariert wurde, kann nicht in der Unterabfrage wieder deklariert, kann aber in Ausdrücke oder Funktionen innerhalb der Unterabfrage.

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 Übertragungen 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 Die Konto-ID von Tinfoil Security 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.

Die folgende Abfrage veranschaulicht die Verwendung von Abfrageparametern.

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

Diagramme und Tabellen zusammen abfragen

Sie können Graph-Abfragen in Verbindung mit SQL verwenden, um auf Informationen aus Grafiken und Tabellen in einer Anweisung zusammenfassen.

GRAPH_TABLE

Der Operator GRAPH_TABLE verwendet eine Abfrage für einen linearen Graphen und gibt sein Ergebnis in eine tabellarische Form, die sich nahtlos in eine SQL-Abfrage integrieren lässt. Dieses Interoperabilität ermöglicht es Ihnen, Abfrageergebnisse in Grafiken mit nicht grafisch dargestellten Inhalten andersherum.

Sie können beispielsweise eine Tabelle CreditReports erstellen und Guthabenpunkte hinzufü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 Diagrammmusterabgleichsfunktion in GRAPH_TABLE identifizieren 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