Dokumen ini memberikan ringkasan penggunaan bahasa kueri grafik dengan Spanner Graph, termasuk sintaksisnya untuk pencocokan pola grafik, dan menunjukkan cara menjalankan kueri terhadap grafik Anda. Dengan Spanner Graph, Anda dapat menjalankan kueri untuk menemukan pola, menelusuri hubungan, dan mendapatkan insight dari data grafik properti Anda.
Contoh dalam dokumen ini menggunakan skema grafik yang Anda buat di bagian Menyiapkan dan membuat kueri Spanner Graph. Skema ini diilustrasikan dalam diagram berikut:
Menjalankan kueri Spanner Graph
Anda dapat menggunakan konsol Google Cloud , Google Cloud CLI, library klien, REST API, atau RPC API untuk menjalankan kueri Spanner Graph.
Konsol Google Cloud
Langkah-langkah berikut menunjukkan cara menjalankan kueri di konsol
Google Cloud . Langkah-langkah ini mengasumsikan bahwa Anda memiliki instance bernama test-instance yang berisi database bernama example-db. Untuk mengetahui informasi
cara membuat instance dengan database, lihat
Menyiapkan dan membuat kueri Spanner Graph.
Di konsol Google Cloud , buka halaman Spanner Instances.
Klik instance bernama
test-instance.Di bagian Databases, klik database bernama
example-db.Buka Spanner Studio, lalu klik Tab baru atau gunakan tab editor.
Masukkan kueri ke editor kueri.
Klik Run.
gcloud CLI
Untuk mengirimkan kueri menggunakan alat command line gcloud CLI, lakukan hal berikut:
Jika belum diinstal, instal gcloud CLI.
Di gcloud CLI, jalankan perintah berikut:
Untuk mengetahui informasi selengkapnya, lihat Panduan memulai Spanner CLI.
REST API
Untuk mengirimkan kueri menggunakan REST API, gunakan salah satu perintah berikut:
Untuk mengetahui informasi selengkapnya, lihat Mengueri data menggunakan REST API dan Mulai menggunakan Spanner menggunakan REST.
RPC API
Untuk mengirimkan kueri menggunakan RPC API, gunakan salah satu perintah berikut:
Library klien
Untuk mempelajari lebih lanjut cara menjalankan kueri dengan library klien Spanner, lihat artikel berikut:
- Membuat kueri menggunakan library klien C++ Spanner
- Membuat kueri menggunakan library klien Spanner C#
- Membuat kueri menggunakan library klien Spanner Go
- Membuat kueri menggunakan library klien Java Spanner
- Membuat kueri menggunakan library klien Spanner Node.js
- Membuat kueri menggunakan library klien Spanner PHP
- Membuat kueri menggunakan library klien Spanner Python
- Membuat kueri menggunakan library klien Spanner Ruby
Untuk mengetahui informasi selengkapnya tentang library klien Spanner, lihat Ringkasan library klien Spanner.
Memvisualisasikan hasil kueri Spanner Graph
Anda dapat melihat representasi visual hasil kueri Spanner Graph di Spanner Studio di Google Cloud konsol. Visualisasi kueri memungkinkan Anda melihat cara elemen yang ditampilkan (node dan tepi) terhubung. Hal ini dapat mengungkapkan pola, dependensi, dan anomali yang sulit dilihat saat Anda melihat hasil dalam tabel. Untuk melihat visualisasi kueri, kueri harus menampilkan node lengkap dalam format JSON. Jika tidak, Anda hanya dapat melihat hasil kueri dalam format tabel. Untuk mengetahui informasi selengkapnya, lihat Menggunakan visualisasi kueri Spanner Graph.
Struktur kueri Spanner Graph
Kueri Spanner Graph terdiri dari beberapa komponen, seperti nama grafik properti, pola node dan edge, serta pengukur. Anda menggunakan komponen ini untuk membuat kueri yang menemukan pola tertentu dalam grafik Anda. Setiap komponen dijelaskan di bagian Pencocokan pola grafik dalam dokumen ini.
Kueri dalam Gambar 2 menunjukkan struktur dasar kueri Spanner Graph. Kueri dimulai dengan menentukan grafik
target, FinGraph, menggunakan klausa GRAPH. Klausul MATCH kemudian menentukan
pola yang akan ditelusuri. Dalam hal ini, node Person terhubung ke node Account melalui edge Owns. Klausul RETURN menentukan properti
node yang cocok yang akan ditampilkan.
Pencocokan pola grafik
Pencocokan pola grafik menemukan pola tertentu dalam grafik Anda. Pola yang paling dasar adalah pola elemen, seperti pola node yang cocok dengan node dan pola tepi yang cocok dengan tepi.
Pola node
Pola node cocok dengan node dalam grafik Anda. Pola ini berisi tanda kurung yang cocok, yang secara opsional dapat mencakup variabel pola grafik, ekspresi label, dan filter properti.
Menemukan semua node
Kueri berikut menampilkan semua node dalam grafik. Variabel n, variabel pola
grafik, terikat ke node yang cocok. Dalam hal ini, pola node
cocok dengan semua node dalam grafik.
GRAPH FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;
Kueri ini menampilkan label dan id:
| label | id |
|---|---|
| Akun | 7 |
| Akun | 16 |
| Akun | 20 |
| Orang | 1 |
| Orang | 2 |
| Orang | 3 |
Menemukan semua node dengan label tertentu
Kueri berikut cocok dengan semua node dalam grafik yang memiliki Person
label.
Kueri menampilkan properti label dan id, name dari
node yang cocok.
GRAPH FinGraph
MATCH (p:Person)
RETURN LABELS(p) AS label, p.id, p.name;
Kueri ini menampilkan properti berikut dari node yang cocok:
| label | id | nama |
|---|---|---|
| Orang | 1 | Alex |
| Orang | 2 | Dana |
| Orang | 3 | Lee |
Menemukan semua node yang cocok dengan ekspresi label
Anda dapat membuat
ekspresi label
dengan satu atau beberapa operator logis. Misalnya, kueri berikut mencocokkan semua
node dalam grafik yang memiliki label Person atau Account. Variabel pola
grafik n mengekspos semua
properti
dari node dengan label Person atau Account.
GRAPH FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;
Dalam hasil kueri berikut:
- Semua node memiliki properti
id. - Node yang cocok dengan label
Accountmemiliki properticreate_time, tetapi tidak memiliki propertibirthday. PropertibirthdayadalahNULLuntuk node ini. - Node yang cocok dengan label
Personmemiliki propertibirthday, tetapi tidak memiliki properticreate_time. Properticreate_timeadalahNULLuntuk node ini.
| label | id | ulang tahun | create_time |
|---|---|---|---|
| Akun | 7 | NULL | 2020-01-10T14:22:20.222Z |
| Akun | 16 | NULL | 2020-01-28T01:55:09.206Z |
| Akun | 20 | NULL | 2020-02-18T13:44:20.655Z |
| Orang | 1 | 1991-12-21T08:00:00Z | NULL |
| Orang | 2 | 1980-10-31T08:00:00Z | NULL |
| Orang | 3 | 1986-12-07T08:00:00Z | NULL |
Menemukan semua node yang cocok dengan ekspresi label dan filter properti
Kueri ini cocok dengan semua node dalam grafik yang memiliki label Person dan properti id sama dengan 1.
GRAPH FinGraph
MATCH (p:Person {id: 1})
RETURN LABELS(p) AS label, p.id, p.name, p.birthday;
Berikut hasil kuerinya:
| label | id | nama | ulang tahun |
|---|---|---|---|
| Orang | 1 | Alex | 1991-12-21T08:00:00Z |
Anda dapat menggunakan klausa WHERE untuk membentuk kondisi pemfilteran yang lebih kompleks pada
label dan properti.
Kueri berikut menggunakan klausa WHERE untuk membentuk kondisi pemfilteran yang lebih kompleks pada properti. Ini cocok dengan semua node dalam grafik yang memiliki
label Person, dan properti birthday berada sebelum 1990-01-10.
GRAPH FinGraph
MATCH (p:Person WHERE p.birthday < '1990-01-10')
RETURN LABELS(p) AS label, p.name, p.birthday;
Berikut hasil kuerinya:
| label | nama | ulang tahun |
|---|---|---|
| Orang | Dana | 1980-10-31T08:00:00Z |
| Orang | Lee | 1986-12-07T08:00:00Z |
Pola tepi
Pola tepi cocok dengan tepi atau hubungan antar-node. Pola tepi diapit dalam tanda kurung siku ([]) dan menyertakan simbol seperti -, ->, atau <- untuk menunjukkan arah. Pola tepi dapat secara opsional menyertakan variabel pola grafik untuk diikat ke tepi yang cocok.
Menemukan semua tepi dengan label yang cocok
Kueri ini menampilkan semua tepi dalam grafik dengan label Transfers. Kueri
mengikat variabel pola grafik e ke tepi yang cocok.
GRAPH FinGraph
MATCH -[e:Transfers]->
RETURN e.Id as src_account, e.order_number
Berikut hasil kuerinya:
| src_account | order_number |
|---|---|
| 7 | 304330008004315 |
| 7 | 304120005529714 |
| 16 | 103650009791820 |
| 20 | 304120005529714 |
| 20 | 302290001255747 |
Menemukan semua tepi yang cocok dengan ekspresi label dan filter properti
Pola edge kueri ini menggunakan ekspresi label dan filter properti untuk menemukan semua edge yang diberi label Transfers yang cocok dengan order_number tertentu.
GRAPH FinGraph
MATCH -[e:Transfers {order_number: "304120005529714"}]->
RETURN e.Id AS src_account, e.order_number
Berikut hasil kuerinya:
| src_account | order_number |
|---|---|
| 7 | 304120005529714 |
| 20 | 304120005529714 |
Menemukan semua tepi menggunakan pola tepi arah mana pun
Anda dapat menggunakan pola sisi any direction (-[]-) dalam kueri untuk mencocokkan sisi
di kedua arah. Kueri berikut menemukan semua transfer dengan akun yang diblokir.
GRAPH FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account {is_blocked:true})
RETURN transfer.order_number, transfer.amount;
Berikut hasil kuerinya:
| order_number | amount |
|---|---|
| 304330008004315 | 300 |
| 304120005529714 | 100 |
| 103650009791820 | 300 |
| 302290001255747 | 200 |
Pola jalur
Pola jalur dibuat dari pola node dan tepi yang bergantian.
Menemukan semua jalur dari node tertentu menggunakan pola jalur
Kueri berikut menemukan semua transfer ke akun yang dimulai dari akun
yang dimiliki oleh Person dengan id sama dengan 2.
Setiap hasil yang cocok merepresentasikan jalur dari Person {id: 2} melalui
Account yang terhubung menggunakan tepi Owns, ke Account lain menggunakan
tepi Transfers.
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;
Berikut hasil kuerinya:
| sender_id | from_id | to_id |
|---|---|---|
| 2 | 20 | 7 |
| 2 | 20 | 16 |
Pola jalur yang dikuantifikasi
Pola terkuantifikasi mengulang pola dalam rentang yang ditentukan.
Mencocokkan pola tepi yang dikuantifikasi
Untuk menemukan jalur dengan panjang variabel, Anda dapat menerapkan pengukur ke pola
tepi. Kueri berikut menunjukkan hal ini dengan menemukan akun tujuan
yang berjarak satu hingga tiga transfer dari Account sumber dengan id
7.
Kueri menerapkan pengukur {1, 3} ke pola tepi
-[e:Transfers]->. Hal ini menginstruksikan kueri untuk mencocokkan jalur yang mengulangi pola tepi
Transfers satu, dua, atau tiga kali. Klausul WHERE digunakan untuk
mengecualikan akun sumber dari hasil. Fungsi ARRAY_LENGTH digunakan
untuk mengakses e group variable. Untuk mengetahui informasi selengkapnya,
lihat variabel grup akses.
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;
Berikut hasil kuerinya:
| 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 |
Beberapa baris dalam hasil diulang. Hal ini karena beberapa jalur yang cocok dengan pola dapat ada di antara node sumber dan tujuan yang sama, dan kueri menampilkan semuanya.
Mencocokkan pola jalur yang dikuantifikasi
Kueri berikut menemukan jalur antara node Account dengan satu hingga dua
tepi Transfers melalui akun perantara yang diblokir.
Pola jalur dalam tanda kurung dikuantifikasi, dan klausa WHERE-nya menentukan kondisi untuk pola berulang.
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;
Berikut hasil kuerinya:
| src_account_id | dst_account_id |
|---|---|
| 7 | 20 |
| 7 | 20 |
| 20 | 20 |
Variabel grup
Variabel pola grafik yang dideklarasikan dalam pola terkuantifikasi menjadi variabel grup saat diakses di luar pola tersebut. Kemudian, mengikat ke array elemen grafik yang cocok.
Anda dapat mengakses variabel grup sebagai array. Elemen grafiknya dipertahankan dalam urutan kemunculannya di sepanjang jalur yang cocok. Anda dapat menggabungkan variabel kelompok menggunakan agregasi horizontal.
Variabel grup akses
Dalam contoh berikut, variabel e diakses sebagai berikut:
- Variabel pola grafik yang terikat ke satu tepi dalam klausa
WHEREe.amount > 100saat berada dalam pola yang dikuantifikasi. - Variabel grup yang terikat ke array elemen tepi di
ARRAY_LENGTH(e)dalam pernyataanRETURNsaat berada di luar pola terkuantifikasi. - Variabel grup yang terikat ke array elemen tepi, yang diagregasi oleh
SUM(e.amount)di luar pola terkuantifikasi. Ini adalah contoh agregasi horizontal.
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;
Berikut hasil kuerinya:
| src_account_id | path_length | total_amount | dst_account_id |
|---|---|---|---|
| 7 | 1 | 300 | 16 |
| 7 | 2 | 600 | 20 |
Awalan penelusuran jalur
Untuk membatasi jalur yang cocok dalam grup yang berbagi node sumber dan tujuan, Anda dapat menggunakan awalan penelusuran jalur ANY atau ANY SHORTEST.
Anda hanya dapat menerapkan awalan ini sebelum seluruh pola jalur, dan Anda tidak dapat
menerapkannya di dalam tanda kurung.
Mencocokkan menggunakan ANY
Kueri berikut menemukan semua akun unik yang dapat dijangkau yang berjarak satu atau dua
Transfers dari node Account tertentu.
Awalan penelusuran jalur ANY memastikan bahwa kueri hanya menampilkan satu jalur
di antara pasangan unik node src dan dst Account. Dalam contoh berikut, meskipun Anda dapat mencapai node Account dengan {id: 16} dalam dua jalur berbeda dari node Account sumber, kueri hanya menampilkan satu jalur.
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;
Berikut hasil kuerinya:
| src_account_id | dst_account_id | ids_in_path |
|---|---|---|
| 7 | 16 | 7,16 |
| 7 | 20 | 7,16,20 |
Pola grafik
Pola grafik terdiri dari satu atau beberapa pola jalur, yang dipisahkan dengan koma (,).
Pola grafik dapat berisi klausa WHERE, yang memungkinkan Anda mengakses semua variabel pola grafik dalam pola jalur untuk membentuk kondisi pemfilteran. Setiap pola jalur menghasilkan kumpulan jalur.
Mencocokkan menggunakan pola grafik
Kueri berikut mengidentifikasi akun perantara dan pemiliknya yang terlibat dalam transaksi dengan jumlah lebih dari 200, yang digunakan untuk mentransfer dana dari akun sumber ke akun yang diblokir.
Pola jalur berikut membentuk pola grafik:
- Pola pertama menemukan jalur tempat transfer terjadi dari satu akun ke akun yang diblokir menggunakan akun perantara.
- Pola kedua menemukan jalur dari akun ke pemiliknya.
Variabel interm berfungsi sebagai link umum antara dua pola jalur, yang
memerlukan interm untuk mereferensikan node elemen yang sama dalam kedua pola jalur. Hal ini
membuat operasi penggabungan yang sama berdasarkan variabel interm.
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;
Berikut hasil kuerinya:
| src_account_id | dst_account_id | interm_account_id | owner_id |
|---|---|---|---|
| 20 | 16 | 7 | 1 |
Pernyataan kueri linear
Anda dapat merangkai beberapa pernyataan grafik untuk membentuk pernyataan kueri linear. Pernyataan dieksekusi dalam urutan yang sama seperti yang muncul dalam kueri.
Setiap pernyataan mengambil output dari pernyataan sebelumnya sebagai input. Input kosong untuk pernyataan pertama.
Output pernyataan terakhir adalah hasil akhir.
Misalnya, Anda dapat menggunakan pernyataan kueri linear untuk menemukan transfer maksimum ke akun yang diblokir. Kueri berikut menemukan akun dan pemiliknya dengan transfer keluar terbesar ke akun yang diblokir.
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;
Tabel berikut menggambarkan proses ini dengan menunjukkan hasil sementara yang diteruskan di antara setiap pernyataan. Untuk mempersingkat, hanya beberapa properti yang ditampilkan.
| Pernyataan | Hasil sementara (singkatan) | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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
|
|
Berikut hasil kuerinya:
| account_id | owner_name |
|---|---|
7 |
Alex |
Pernyataan pengembalian
Pernyataan RETURN
menentukan apa yang akan ditampilkan dari pola yang cocok. Kueri ini dapat mengakses
variabel pola grafik dan menyertakan ekspresi serta klausa lainnya, seperti
ORDER BY dan GROUP BY.
Spanner Graph tidak mendukung menampilkan elemen grafik sebagai hasil kueri. Untuk
menampilkan seluruh elemen grafik, gunakan
fungsi TO_JSON
atau
fungsi SAFE_TO_JSON.
Dari kedua fungsi ini, sebaiknya Anda menggunakan SAFE_TO_JSON.
Menampilkan elemen grafik sebagai JSON
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;
Berikut hasil kuerinya:
| n |
|---|
{"identifier":"mUZpbkdyYXBoLkFjY291bnQAeJEO","kind":"node","labels":["Account"],"properties":{"create_time":"2020-01-10T14:22:20.222Z","id":7,"is_blocked":false,"nick_name":"Vacation
Fund"}} |
Menyusun kueri yang lebih besar dengan kata kunci NEXT
Anda dapat menggabungkan beberapa pernyataan kueri linear grafik menggunakan kata kunci NEXT.
Pernyataan pertama menerima input kosong, dan output setiap pernyataan berikutnya menjadi input untuk pernyataan berikutnya.
Contoh berikut menemukan pemilik akun dengan transfer masuk terbanyak
dengan menggabungkan beberapa pernyataan linear grafik. Anda dapat menggunakan variabel yang sama, misalnya, account, untuk merujuk ke elemen grafik yang sama di beberapa pernyataan linear.
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;
Berikut hasil kuerinya:
| account_id | owner_name | num_incoming_transfers |
|---|---|---|
16 |
Lee |
3 |
Fungsi dan ekspresi
Anda dapat menggunakan semua fungsi GoogleSQL (baik fungsi agregat maupun skalar), operator, dan ekspresi bersyarat dalam kueri Spanner Graph. Spanner Graph juga mendukung fungsi dan operator khusus grafik.
Fungsi dan operator bawaan
Fungsi dan operator berikut digunakan di GQL:
PROPERTY_EXISTS(n, birthday): Menampilkan apakahnmemiliki propertibirthday.LABELS(n): Menampilkan labelnseperti yang ditentukan dalam skema grafik.PROPERTY_NAMES(n): Menampilkan nama propertin.TO_JSON(n): Menampilkanndalam format JSON. Untuk mengetahui informasi selengkapnya, lihat fungsiTO_JSON.
predikat PROPERTY_EXISTS, fungsi LABELS, dan fungsi TO_JSON, serta fungsi bawaan lainnya seperti ARRAY_AGG dan 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;
Berikut hasil kuerinya:
| is_blocked_property_exists | name_property_exists | labels | akun | lokasi | pengguna |
|---|---|---|---|---|---|
false |
true |
Person |
["Vacation Fund"] |
Adelaide, Australia |
{"identifier":"mUZpbkdyYXBoLlBlcnNvbgB4kQI=","kind":"node","labels":["Person"],"properties":{"birthday":"1991-12-21T08:00:00Z","city":"Adelaide","country":"Australia","id":1,"name":"Alex"}} |
Subkueri
Subkueri adalah kueri yang bersarang dalam kueri lain. Daftar berikut mencantumkan aturan subkueri Spanner Graph:
- Subkueri diapit dalam sepasang kurung kurawal
{}. - Subkueri dapat dimulai dengan klausa
GRAPHdi bagian awal untuk menentukan grafik dalam cakupan. Grafik yang ditentukan tidak harus sama dengan grafik yang digunakan dalam kueri luar. - Jika klausa
GRAPHdihilangkan dalam subkueri, hal berikut akan terjadi:- Grafik dalam cakupan disimpulkan dari konteks kueri luar terdekat.
- Subkueri harus dimulai dari pernyataan pencocokan pola grafik
dengan
MATCH.
- Variabel pola grafik yang dideklarasikan di luar cakupan subkueri tidak dapat dideklarasikan lagi di dalam subkueri, tetapi dapat dirujuk dalam ekspresi atau fungsi di dalam subkueri.
Menggunakan subkueri untuk menemukan jumlah total transfer dari setiap akun
Kueri berikut mengilustrasikan penggunaan subkueri VALUE. Subkueri
disertakan dalam tanda kurung {} yang diawali dengan kata kunci VALUE. Kueri ini menampilkan jumlah total transfer yang dimulai dari akun.
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;
Berikut hasil kuerinya:
| nama | account_id | num_transfers |
|---|---|---|
Alex |
7 |
2 |
Dana |
20 |
2 |
Lee |
16 |
1 |
Untuk mengetahui daftar ekspresi subkueri yang didukung, lihat Subkueri Grafik Spanner.
Menggunakan subkueri untuk menemukan akun yang dimiliki oleh setiap orang
Kueri berikut menggunakan pernyataan CALL dengan subkueri inline. Pernyataan MATCH
(p:Person) membuat tabel dengan satu kolom bernama p.
Setiap baris dalam tabel ini berisi node Person. Pernyataan CALL (p)
menjalankan subkueri tertutup untuk setiap baris dalam tabel kerja ini. Subkueri
menemukan akun yang dimiliki oleh setiap orang yang cocok p. Beberapa akun untuk orang yang sama diurutkan berdasarkan ID akun.
Contoh ini mendeklarasikan variabel node cakupan luar p dari klausa MATCH
(p:Person). Pernyataan CALL (p) merujuk ke variabel ini. Deklarasi
ini memungkinkan Anda mendeklarasikan ulang atau mendeklarasikan beberapa kali variabel node dalam pola
jalur subkueri. Hal ini memastikan bahwa variabel node p dalam dan luar
terikat ke node Person yang sama dalam grafik. Jika pernyataan CALL
tidak mendeklarasikan variabel node p, subkueri memperlakukan variabel
p yang dideklarasikan ulang sebagai variabel baru. Variabel baru ini independen dari variabel
cakupan luar, dan subkueri tidak menyatakan-ganda variabel ini karena
variabel ini menampilkan hasil yang berbeda. Untuk mengetahui informasi selengkapnya, lihat pernyataan
CALL.
GRAPH FinGraph
MATCH (p:Person)
CALL (p) {
MATCH (p)-[:Owns]->(a:Account)
RETURN a.Id AS account_Id
ORDER BY account_Id
}
RETURN p.name AS person_name, account_Id
ORDER BY person_name, account_Id;
Hasil
| person_name | account_Id |
|---|---|
| Alex | 7 |
| Dana | 20 |
| Lee | 16 |
Parameter kueri
Anda dapat membuat kueri Spanner Graph dengan parameter. Untuk mengetahui informasi selengkapnya, lihat sintaksis dan pelajari cara mengueri data dengan parameter di library klien Spanner.
Kueri berikut mengilustrasikan penggunaan parameter kueri.
GRAPH FinGraph
MATCH (person:Person {id: @id})
RETURN person.name;
Menggabungkan kueri grafik dan tabel
Anda dapat menggunakan kueri Grafik bersama dengan SQL untuk mengakses informasi dari Grafik dan Tabel secara bersamaan dalam satu pernyataan.
Operator GRAPH_TABLE mengambil kueri grafik linear dan menampilkan hasilnya dalam
bentuk tabel yang dapat diintegrasikan ke dalam kueri SQL. Interoperabilitas ini memungkinkan Anda memperkaya hasil kueri grafik dengan konten non-grafik dan sebaliknya.
Misalnya, Anda dapat membuat tabel CreditReports dan menyisipkan beberapa laporan kredit, seperti yang ditunjukkan dalam contoh berikut:
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);
Selanjutnya, Anda dapat mengidentifikasi orang tertentu melalui pencocokan pola grafik di
GRAPH_TABLE dan menggabungkan hasil kueri grafik dengan tabel CreditReports untuk
mengambil skor kredit.
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;
Berikut hasil kuerinya:
| person_id | latest_credit_score |
|---|---|
1 |
700 |
2 |
800 |
Langkah berikutnya
Pelajari praktik terbaik untuk menyesuaikan kueri.