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 über die Console verwalten Google Cloud .
gcloud spanner-BefehlszeilentoolSenden Sie einen Befehl mit dem Befehl
gcloud spanner databases execute-sql.Die REST API von
executeSqlundexecuteStreamingSqlDie RPC API für
ExecuteSqlundExecuteStreamingSql
Spanner Graph-Abfrageergebnisse visualisieren
Sie können die Ergebnisse Ihrer Spanner-Graphabfrage in Spanner Studio visualisieren, wenn die Abfrage vollständige Knoten im JSON-Format zurückgibt. Weitere Informationen finden Sie unter Mit Spanner-Grafikvisualisierungen arbeiten.
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 in der Abfrage 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 grundlegendsten 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 aus Ihrem Diagramm übereinstimmt. Dieses Muster besteht aus einem übereinstimmenden Paar von Klammern, das optional eine Graphmustervariable, 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 Graphmustervariable, 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 Menge der Eigenschaften, die von der Graphmustervariablen n freigegeben werden, ist ein Obermenge der Eigenschaften, die von den Knoten mit dem Label Person oder Account freigegeben werden.
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
Accountentsprechen, haben die Propertycreate_time, aber nicht die Propertybirthday. Für solche Knoten wird für die EigenschaftbirthdayeinNULLzurückgegeben. - Knoten, die dem
Person-Label entsprechen, haben die Propertybirthday, aber nicht die Propertycreate_time. Für solche Knoten wird für die Eigenschaftcreate_timeeinNULLzurü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 sucht nach allen Knoten im Graphen, 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 mit dem Label Person und der Property birthday ist 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 entspricht Kanten oder Beziehungen zwischen Knoten. Kantenmuster werden in eckige Klammern [] mit den Symbolen -, -> oder <- eingeschlossen, um Richtungen anzugeben.
Ähnlich wie Knotenmuster 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 Transfers haben.
Die Grafikmustervariable e ist an die übereinstimmenden Kanten gebunden.
GRAPH FinGraph
MATCH -[e:Transfers]->
RETURN e.Id as src_account, e.order_number
Ergebnis
| src_account | order_number |
|---|---|
| 7 | 304330008004315 |
| 7 | 304120005529714 |
| 16 | 103650009791820 |
| 20 | 304120005529714 |
| 20 | 302290001255747 |
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 Transfers gekennzeichnet sind und mit einer angegebenen order_number übereinstimmen.
GRAPH FinGraph
MATCH -[e:Transfers {order_number: "304120005529714"}]->
RETURN e.Id AS src_account, e.order_number
Ergebnis
| src_account | order_number |
|---|---|
| 7 | 304120005529714 |
| 20 | 304120005529714 |
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 {is_blocked:true})
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.
Quantifiziertes Kantenmuster abgleichen
Mit der folgenden Abfrage werden alle Zielkonten gefunden, die sich ein bis drei Überweisungen von einer Quelle Account mit id = 7 entfernt befinden, mit Ausnahme des Kontos 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 access group variable.
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)
((a:Account)-[:Transfers]->(b:Account {is_blocked:true}) WHERE a != b){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 Diagrammmustervariable wird als Gruppenvariable betrachtet, wenn auf sie außerhalb des quantifizierten Musters zugegriffen wird. Sie wird an ein Array von übereinstimmenden Diagrammelementen 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 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 außerhalb des quantifizierten Musters mit
SUM(e.amount)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 gesamten 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_CONCAT(ARRAY_AGG(e.Id), [dst.Id])
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 | 7,16 |
| 7 | 20 | 7,16,20 |
Muster in Diagrammen
Ein Graphmuster besteht aus einem oder mehreren Pfadmustern, die durch Komma (,) 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 auf 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 {is_blocked:true})
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 {is_blocked:true})
|
|
||||||||||||
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
| Die Konto-ID von Tinfoil Security | 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
| Die Konto-ID von Tinfoil Security | owner_name | Anzahl_eingehender_Übertragungen |
|---|---|---|
| 16 | Lee | 3 |
Funktionen und Ausdrücke
Sie können alle GoogleSQL-Funktionen (sowohl Aggregat- 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 in GQL häufig verwendet:
PROPERTY_EXISTS(n, birthday): Gibt zurück, obndas Attributbirthdayfreigibt.LABELS(n): Gibt die Labels vonnzurück, wie im Diagrammschema definiert.PROPERTY_NAMES(n): Gibt die Attributnamen vonnzurück.TO_JSON(n): Gibtnim JSON-Format zurück. Weitere Informationen finden Sie unterTO_JSON-Funktion.
das Prädikat PROPERTY_EXISTS, die Funktion LABELS und die Funktion TO_JSON sowie andere integrierte Funktionen wie ARRAY_AGG und CONCAT.
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 Bereichs 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 COUNT(transfer) AS num_transfers
} AS num_transfers;
Ergebnis
| Name | Die Konto-ID von Tinfoil Security | Anzahl_Übertragungen |
|---|---|---|
| Alex | 7 | 2 |
| Dana | 20 | 2 |
| Lee | 16 | 1 |
Eine Liste der unterstützten Unterabfrageausdrücke finden Sie unter Spanner-Graph-Unterabfragen.
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 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 von Interesse anhand der Diagrammmusterabgleiche in GRAPH_TABLE ermitteln und die Ergebnisse der Diagrammabfrage mit der Tabelle CreditReports zusammenführen, um auf einen Kreditscore zuzugreifen.
SELECT
gt.person.id,
credit.score AS latest_credit_score
FROM GRAPH_TABLE(
FinGraph
MATCH (person:Person)-[:Owns]->(:Account)-[:Transfers]->(account:Account {is_blocked:true})
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