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:
Spanner-Graph-Abfrage ausführen
Sie können Spanner Graph-Abfragen 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
ExecuteSql
undExecuteStreamingSql
RPC API
Spanner Graph-Abfragestruktur
In diesem Abschnitt werden die einzelnen Abfragekomponenten ausführlich beschrieben.
Das folgende Beispiel veranschaulicht die Grundstruktur eines Spanner-Diagramms 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 Attributcreate_time
, aber nicht haben die Eigenschaftbirthday
. Für solche Knoten wird für die Eigenschaftbirthday
einNULL
zurückgegeben. - Knoten, die dem Label
Person
entsprechen, haben das Attributbirthday
, aber nicht das Attributcreate_time
.NULL
wird fürcreate_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
WHERE
e.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 derRETURN
-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 |
|
||||||||||||
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
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 |
---|
{"identifier":"mUZpbkdyYXBoLkFjY291bnQAeJEO","kind":"node","labels":["Account"],"properties":{"create_time":"2020-01-10T14:22:20.222Z","id":7,"is_blocked":false,"nick_name":"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, obn
birthday
verfügbar macht Property.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 in derTO_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 | {"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 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