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:
Spanner Graph-Abfrage ausführen
Sie können Spanner-Graphabfragen auf folgende Arten ausführen:
Die Google Cloud Console
Reichen Sie eine Anfrage auf der Seite Spanner Studio ein. Klicken Sie auf der Seite Datenbankübersicht oder Tabellenübersicht auf Spanner Studio, um die Seite Spanner Studio aufzurufen. Weitere Informationen zum Zugriff auf Spanner Studio finden Sie unter Daten mit der Google Cloud Console verwalten.
gcloud spanner
-BefehlszeilentoolSenden Sie einen Befehl mit dem Befehl
gcloud spanner databases execute-sql
.Die REST API von
executeSql
undexecuteStreamingSql
Die RPC API
ExecuteSql
undExecuteStreamingSql
Spanner Graph-Abfragestruktur
In diesem Abschnitt werden die einzelnen Abfragekomponenten ausführlich beschrieben.
Das folgende Beispiel veranschaulicht die grundlegende Struktur einer Spanner-Graphabfrage.
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 Eigenschaftcreate_time
, aber nicht die Eigenschaftbirthday
. Für solche Knoten wird für die Eigenschaftbirthday
einNULL
zurückgegeben. - Knoten, die dem Label
Person
entsprechen, haben die Eigenschaftbirthday
, aber nicht die Eigenschaftcreate_time
. Für solche Knoten wird für die Eigenschaftcreate_time
einNULL
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 direction
Kantenmuster -[]-
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
WHERE
e.amount > 100
(innerhalb des quantifizierten Musters) an eine einzelne Kante gebunden ist. - Eine Gruppenvariable, die in der
RETURN
-Anweisung inARRAY_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 |
|
||||||||||||
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 |
|
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, obn
das Attributbirthday
freigibt.LABELS(n)
: Gibt die Labels vonn
zurück, wie im Diagrammschema definiert.PROPERTY_NAMES(n)
: Gibt die Attributnamen vonn
zurück.TO_JSON(n)
: Gibtn
im JSON-Format zurück. Weitere Informationen finden Sie unterTO_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