Ringkasan kueri Spanner Graph

Dokumen ini menjelaskan cara membuat kueri grafik properti di Spanner Graph. Contoh di bagian ini menggunakan skema grafik yang Anda buat di Menyiapkan dan membuat kueri Grafik Spanner, yang diilustrasikan dalam diagram berikut:

Contoh skema Spanner Graph.

Menjalankan kueri Spanner Graph

Anda dapat menjalankan kueri Spanner Graph dengan cara berikut:

Struktur kueri Spanner Graph

Bagian ini menjelaskan setiap komponen kueri secara mendetail.

Contoh berikut mengilustrasikan struktur dasar kueri Grafik Spanner.

Contoh struktur kueri Spanner Graph.

Spanner Graph memungkinkan Anda membuat beberapa grafik di dalam database. Kueri dimulai dengan menentukan grafik target, FinGraph, menggunakan klausa GRAPH.

Pencocokan pola grafik

Pencocokan pola grafik menemukan pola tertentu dalam grafik Anda. Pola paling dasar adalah Pola elemen (pola node dan pola tepi), yang cocok dengan elemen grafik (node dan tepi). Pola elemen dapat disusun menjadi pola jalur dan pola yang lebih kompleks.

Pola node

Pola node adalah pola yang cocok dengan node dari grafik Anda. Pola ini terdiri dari sepasang tanda kurung yang cocok, yang secara opsional dapat berisi variabel pola grafik, ekspresi label, dan filter properti.

Menemukan semua node

Kueri berikut menampilkan semua node dalam grafik. Variabel n, yang disebut 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;

Hasil

Kueri menampilkan label dan id sebagai berikut:

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 label Person. 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;

Hasil

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.

Kueri berikut cocok dengan semua node dalam grafik yang memiliki label Person atau Account. Kumpulan properti yang ditampilkan oleh variabel pola grafik n adalah superset dari properti yang ditampilkan oleh node yang memiliki label Person atau Account.

GRAPH FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;
  • Dalam hasil, semua node memiliki properti id.
  • Node yang cocok dengan label Account memiliki properti create_time, tetapi tidak memiliki properti birthday. NULL ditampilkan untuk properti birthday untuk node tersebut.
  • Node yang cocok dengan label Person memiliki properti birthday, tetapi tidak memiliki properti create_time. NULL ditampilkan untuk properti create_time untuk node tersebut.

Hasil

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

Untuk informasi selengkapnya tentang aturan ekspresi label, lihat Ekspresi label.

Menemukan semua node yang cocok dengan ekspresi label dan filter properti

Kueri berikut 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;

Hasil

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

Hasil

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 disertai dengan tanda kurung siku [] dengan simbol -, ->, atau <- untuk menunjukkan arah.

Serupa dengan pola node, variabel pola grafik digunakan untuk mengikat ke elemen tepi yang cocok.

Menemukan semua tepi dengan label yang cocok

Kueri berikut menampilkan semua tepi dalam grafik yang memiliki label Owns. Variabel pola grafik e terikat dengan tepi yang cocok.

GRAPH FinGraph
MATCH -[e:Owns]->
RETURN e.id AS owner_id, e.account_id;

Hasil

owner_id id_akun
1 7
3 16
2 20

Menemukan semua tepi yang cocok dengan ekspresi label dan filter properti

Serupa dengan pola node, pola tepi dapat menggunakan ekspresi label, spesifikasi properti, dan klausa WHERE, seperti yang ditunjukkan dalam kueri berikut. Kueri menemukan semua tepi yang diberi label Owns dan memiliki properti create_time dalam periode yang ditentukan.

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;

Hasil

owner_id create_time id_akun
2 2020-01-28T01:55:09.206Z 20
3 2020-02-18T13:44:20.655Z 16

Menemukan semua tepi menggunakan pola tepi arah apa pun

Meskipun semua tepi di Spanner Graph diarahkan, Anda dapat menggunakan any direction pola tepi -[]- dalam kueri untuk mencocokkan tepi di kedua arah.

Kueri berikut menemukan semua transfer yang melibatkan akun yang diblokir.

GRAPH FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account)
WHERE account.is_blocked
RETURN transfer.order_number, transfer.amount;

Hasil

order_number jumlah
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 dengan filter label dan properti yang ditentukan, 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 mewakili 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;

Hasil

sender_id from_id to_id
2 20 7
2 20 16

Pola jalur yang dikuantifikasi

Pola yang dikuantifikasi memungkinkan pola diulang dalam rentang yang ditentukan.

Mencocokkan pola tepi yang dikuantifikasi

Kueri berikut menemukan semua akun tujuan yang melakukan satu hingga tiga transfer dari Account sumber dengan id sama dengan 7, selain akun itu sendiri.

Pola tepi yang diakhiri dengan kuantifiser {1, 3}.

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;

Hasil

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

Contoh sebelumnya menggunakan fungsi ARRAY_LENGTH untuk mengakses e group variable. Untuk mengetahui informasi selengkapnya, lihat variabel grup akses.

Beberapa baris dalam contoh hasil diulang karena mungkin ada beberapa jalur antara pasangan akun src dan dst yang sama yang cocok dengan pola.

Mencocokkan pola jalur yang dikuantifikasi

Kueri berikut menemukan jalur antara node Account dengan satu hingga dua sisi Transfers melalui akun perantara yang diblokir.

Pola jalur dalam tanda kurung dikuantifikasi dan klausa WHERE digunakan dalam tanda kurung untuk menentukan kondisi pola berulang.

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;

Hasil

src_account_id dst_account_id
7 20
7 20
20 20

Variabel grup

Variabel pola grafik yang dideklarasikan dalam pola kuantitatif dianggap sebagai variabel grup saat diakses di luar pola kuantitatif, dan terikat ke array elemen grafik yang cocok.

Anda dapat mengakses variabel grup sebagai array tempat elemen grafik dipertahankan dalam urutan kemunculan di sepanjang jalur yang cocok. Anda dapat menggabungkan variabel grup menggunakan agregasi horizontal.

Mengakses variabel grup

Pada contoh berikut, variabel e diakses sebagai berikut:

  • Variabel pola grafik yang terikat ke satu tepi dalam klausa WHERE e.amount > 100 (dalam pola yang dikuantifikasi).
  • Variabel grup yang terikat ke array elemen tepi di ARRAY_LENGTH(e) dalam pernyataan RETURN (di luar pola yang dikuantifikasi).
  • Variabel grup yang terikat ke array elemen tepi, yang digabungkan oleh SUM(e.amount) di luar pola yang diukur. 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;

Hasil

src_account_id path_length total_amount dst_account_id
7 1 300 16
7 2 600 20

Jalur Mana Pun dan Jalur Terpendek Mana Pun

Untuk membatasi jalur yang cocok di setiap grup jalur yang memiliki node sumber dan tujuan yang sama, 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 hanya satu jalur antara pasangan node Account src dan dst yang unik yang ditampilkan. Dalam contoh berikut, meskipun Anda dapat menjangkau node Account dengan {id: 16} di dua jalur yang berbeda dari node Account sumber, hasilnya hanya menyertakan satu jalur.

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;

Hasil

src_account_id dst_account_id ids_in_path
7 16 16
7 20 16,20

Pola grafik

Pola grafik terdiri dari satu atau beberapa pola jalur, yang dipisahkan oleh 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 jumlah transaksi yang melebihi 200, yang melaluinya dana ditransfer 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 di kedua pola jalur. Tindakan ini akan membuat operasi equi-join 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;

Hasil

src_account_id dst_account_id interm_account_id owner_id
20 16 7 1

Pernyataan kueri linear

Anda dapat mengaitkan beberapa pernyataan grafik secara bersamaan untuk membentuk pernyataan kueri linear. Pernyataan dijalankan dalam urutan yang sama seperti yang muncul dalam kueri.

  • Setiap pernyataan menggunakan output dari pernyataan sebelumnya sebagai input. Input kosong untuk pernyataan pertama.
  • Output pernyataan terakhir adalah hasil akhir.

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

Tabel berikut mengilustrasikan cara hasil perantara diteruskan bersama pernyataan. Hanya beberapa properti hasil perantara yang ditampilkan, untuk singkat.

Pernyataan Hasil Menengah (disingkat)
MATCH
  (src_account:Account)
    -[transfer:Transfers]->
  (dst_account:Account)
WHERE dst_account.is_blocked
src_account transfer dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}

ORDER BY transfer.amount DESC
src_account transfer dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}

LIMIT 1
src_account transfer dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}

MATCH
  (src_account:Account)
    <-[owns:Owns]-
  (owner:Person)
src_account transfer dst_account memiliki owner
{id: 7} {amount: 300.0} {id: 16, is_blocked: true} {person_id: 1, account_id: 7} {id: 1, name: Alex}

RETURN
  src_account.id AS account_id,
  owner.name AS owner_name
account_id owner_name
7 Alex

Hasil

id_akun owner_name
7 Alex

Pernyataan return

Pernyataan return menentukan apa yang akan ditampilkan dari pola yang cocok. Fungsi ini dapat mengakses variabel pola grafik, berisi ekspresi dan klausa lainnya seperti ORDER_BY, GROUP_BY. Lihat pernyataan RETURN.

Perhatikan bahwa Spanner Graph tidak mendukung elemen grafik yang ditampilkan sebagai hasil kueri. Untuk menampilkan seluruh elemen grafik, gunakan fungsi 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;

Hasil

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"}}

Membuat kueri yang lebih besar dengan kata kunci NEXT

Anda dapat merantai beberapa pernyataan kueri linear grafik menggunakan kata kunci NEXT. Input ke pernyataan kueri linear pertama kosong. Output dari setiap pernyataan kueri linear menjadi input untuk pernyataan kueri linear berikutnya.

Contoh berikut menemukan pemilik akun dengan transfer masuk terbanyak dengan mengaitkan beberapa pernyataan linear grafik secara bersamaan. Perhatikan bahwa Anda dapat menggunakan variabel yang sama, account dalam contoh ini, 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;

Hasil

id_akun owner_name num_incoming_transfers
16 Lee 3

Fungsi dan ekspresi

Anda dapat menggunakan semua fungsi GoogleSQL (fungsi agregat dan skalar), operator, dan ekspresi kondisional dalam kueri Grafik Spanner. Spanner Graph juga mendukung fungsi dan operator khusus grafik.

Fungsi dan operator bawaan

Fungsi dan operator berikut biasa digunakan di GQL:

  • PROPERTY_EXISTS(n, birthday): Menampilkan apakah n mengekspos properti birthday.
  • LABELS(n): Menampilkan label n seperti yang ditentukan dalam skema grafik.
  • PROPERTY_NAMES(n): Menampilkan nama properti n.
  • TO_JSON(n): Menampilkan n dalam format JSON. Untuk mengetahui informasi selengkapnya, lihat fungsi TO_JSON.

Kueri berikut mengilustrasikan 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;

Hasil

is_blocked_property_exists name_property_exists label akun location pengguna
false benar Orang ["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 disusun bertingkat dalam kueri lain. Daftar berikut mencantumkan aturan subkueri Spanner Graph:

  • Subkueri diapit dalam sepasang kurung kurawal {}.
  • Subkueri dapat dimulai dengan klausa GRAPH utama untuk menentukan grafik dalam cakupan. Grafik yang ditentukan tidak harus sama dengan yang digunakan dalam kueri luar.
  • Jika klausa GRAPH dihilangkan 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 kurung kurawal {} yang diawali dengan kata kunci VALUE. Kueri 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 SUM(transfer.amount) AS total_transfer
} AS total_transfer;

Hasil

nama id_akun total_transfer
Alex 7 400
Dana 20 700
Lee 16 300

Untuk mengetahui daftar ekspresi subkueri yang didukung, lihat Subkueri Grafik Spanner.

Parameter kueri

Anda dapat membuat kueri Spanner Graph dengan parameter. Untuk mengetahui informasi selengkapnya, lihat sintaksis dan pelajari cara mengkueri data dengan parameter di library klien Spanner.

Kueri berikut mengilustrasikan penggunaan parameter kueri.

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

Membuat kueri grafik dan tabel secara bersamaan

Anda dapat menggunakan kueri Grafik bersama dengan SQL untuk mengakses informasi dari Grafik dan Tabel secara bersamaan dalam satu pernyataan.

GRAPH_TABLE

Operator GRAPH_TABLE mengambil kueri grafik linear dan menampilkan hasilnya dalam format tabel yang dapat diintegrasikan dengan lancar 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 pada 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);

Kemudian, identifikasi orang yang diminati melalui pencocokan pola grafik di GRAPH_TABLE dan gabungkan hasil kueri grafik dengan tabel CreditReports untuk mengakses skor kredit.

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;

Hasil:

person_id latest_credit_score
1 700
2 800

Langkah selanjutnya

Pelajari praktik terbaik untuk menyesuaikan kueri.