Halaman ini menjelaskan cara menggunakan jalur grafik di Spanner Graph.
Dalam database grafik, jenis data jalur grafik merepresentasikan urutan node yang diselingi dengan edge dan menunjukkan hubungan antara node dan edge ini. Untuk mempelajari lebih lanjut jenis data jalur, lihat Jenis jalur grafik.
Dengan Spanner Graph Language (GQL), Anda dapat membuat jalur grafik dan melakukan kueri padanya. Contoh dalam dokumen ini menggunakan skema Spanner Graph yang sama seperti yang ada di halaman Menyiapkan dan membuat kueri Spanner Graph.
Membangun jalur grafik
Anda dapat membuat jalur grafik dengan membuat variabel jalur dalam pola grafik atau dengan fungsi PATH.
Sebaiknya buat jalur grafik menggunakan variabel jalur. Format untuk membuat variabel jalur adalah:
MATCH p = PATH_PATTERN
Untuk mengetahui informasi selengkapnya, lihat Pola grafik.
Contoh
Dalam contoh berikut, kueri menemukan pola transfer uang antar-akun dalam FinGraph.
GRAPH FinGraph
MATCH p = (src:Account {id: 16})-[t:Transfers]->{2}(dst:Account {id: 7})
RETURN TO_JSON(p) AS full_path;
Hasil
| full_path |
|---|
| [{"identifier": ..., "properties": {"id": 16, ...}, ...}, {"identifier": ..., "properties": {"amount": 300.0, ...}, ...}, ...] |
Hasilnya menunjukkan bahwa kueri menemukan pola Account -> Transfers -> Account
dalam database.
Membuat kueri jalur grafik
Anda dapat menggunakan fungsi khusus jalur berikut untuk membuat kueri jalur grafik. Untuk informasi umum selengkapnya tentang kueri Spanner Graph, lihat Ringkasan kueri.
EDGES
Fungsi EDGES menampilkan semua tepi dalam jalur grafik. Untuk semantik
yang mendetail, lihat EDGES.
Contoh
Kueri ini menemukan jalur antara dua akun yang melewati akun tengah.
Fungsi ini menampilkan jumlah tepi Transfers kedua dalam jalur yang mungkin
berada di antara src dan mid atau di antara mid dan dst.
GRAPH FinGraph
MATCH p = (src:Account {id: 7})-[t1:Transfers]->{1,3}(mid:Account)-[t2:Transfers]->
{1,3}(dst:Account {id: 16})
LET second_edge = EDGES(p)[1]
RETURN DISTINCT src.id AS src, dst.id AS dst, second_edge.amount AS second_edge_amount;
Hasil
| src | dst | second_edge_amount |
|---|---|---|
| 7 | 16 | 300 |
NODES
Fungsi NODES menampilkan semua node dalam jalur grafik. Untuk semantik
yang mendetail, lihat NODES.
Contoh
Kueri ini menemukan jalur grafik dari dua transfer, lalu menampilkan daftar JSON yang merepresentasikan jalur tersebut.
GRAPH FinGraph
MATCH p = (src:Account)-[t:Transfers]->{2}(dst:Account)
RETURN TO_JSON(NODES(p)) AS nodes;
Hasil
| node |
|---|
| [{"identifier": "...", "properties": {"id": 16}, ...}, {"identifier": "...", "properties": {"id": 20, ...}, ...] |
| ... |
PATH_FIRST
Fungsi PATH_FIRST menemukan node pertama dalam jalur grafik. Untuk semantik
yang mendetail, lihat PATH_FIRST.
Contoh
Kueri ini menemukan node pertama dalam jalur grafik dua transfer. Fungsi ini menampilkan
label node Account dan nama panggilan akun.
GRAPH FinGraph
MATCH p = -[:Transfers]->{1,3}(dst:Account{id: 7})
RETURN DISTINCT PATH_FIRST(p).id AS can_reach_target;
Hasil
| can_reach_target |
|---|
| 7 |
| 16 |
| 20 |
PATH_LAST
Fungsi PATH_LAST menemukan node terakhir dalam jalur grafik. Untuk semantik
yang mendetail, lihat PATH_LAST.
Contoh
Kueri ini menemukan node terakhir dalam jalur grafik dua transfer. Fungsi ini menampilkan
label node Account dan nama panggilan akun.
GRAPH FinGraph
MATCH p =(start:Account{id: 7})-[:Transfers]->{1,3}
RETURN DISTINCT PATH_LAST(p).id as can_reach_target;
Hasil
| can_reach_target |
|---|
| 7 |
| 16 |
| 20 |
PATH_LENGTH
Fungsi PATH_LENGTH menemukan jumlah tepi dalam jalur grafik. Untuk
semantik mendetail, lihat PATH_LENGTH.
Contoh
Kueri ini menemukan jumlah tepi dalam jalur grafik yang berisi satu hingga tiga transfer.
GRAPH FinGraph
MATCH p = (src:Account)-[e:Transfers]->{1,3}(dst:Account)
RETURN PATH_LENGTH(p) AS num_transfers, COUNT(*) AS num_paths;
Hasil
| num_transfers | num_paths |
|---|---|
| 1 | 5 |
| 2 | 7 |
| 3 | 11 |
IS_ACYCLIC
Fungsi IS_ACYCLIC memeriksa apakah jalur grafik memiliki node yang berulang. Metode ini menampilkan
TRUE jika pengulangan ditemukan, atau menampilkan FALSE. Untuk semantik
yang mendetail, lihat IS_ACYCLIC.
Contoh
Kueri ini memeriksa apakah jalur grafik ini memiliki node yang berulang.
GRAPH FinGraph
MATCH p = (src:Account)-[t:Transfers]->{2}(dst:Account)
RETURN IS_ACYCLIC(p) AS is_acyclic_path,
ARRAY_TRANSFORM(NODES(p), n->n.id) AS account_ids;
Hasil
| is_acyclic_path | account_ids |
|---|---|
| TRUE | 16.20.7 |
| TRUE | 20,7,16 |
| TRUE | 20,7,16 |
| FALSE | 16,20,16 |
| TRUE | 7,16,20 |
| TRUE | 7,16,20 |
| FALSE | 20,16,20 |
IS_TRAIL
Fungsi IS_TRAIL memeriksa apakah jalur grafik memiliki tepi yang berulang. Metode ini menampilkan
TRUE jika pengulangan ditemukan, atau menampilkan FALSE. Untuk semantik
yang mendetail, lihat IS_TRAIL.
Contoh
Kueri ini memeriksa apakah jalur grafik ini memiliki tepi yang berulang.
GRAPH FinGraph
MATCH p = (src:Account)-[t:Transfers]->{3}(dst:Account)
WHERE src.id < dst.id
RETURN IS_TRAIL(p) AS is_trail_path,
ARRAY_TRANSFORM(t, t->t.id) AS transfer_ids
Hasil
| is_trail_path | transfer_ids |
|---|---|
| FALSE | 16,20,16 |
| TRUE | 7,16,20 |
| TRUE | 7,16,20 |
Mode jalur
Di Spanner Graph, perilaku defaultnya adalah menampilkan semua jalur, termasuk jalur dengan node dan edge yang berulang. Anda dapat menggunakan mode jalur berikut untuk menyertakan atau mengecualikan jalur yang memiliki node dan tepi berulang. Untuk semantik mendetail, lihat dokumentasi Mode jalur.
WALK
Mode jalur WALK menampilkan semua jalur, termasuk jalur dengan node dan tepi yang berulang. WALK adalah mode jalur default.
Contoh
Kueri berikut menunjukkan penggunaan mode jalur WALK pada
pola jalur yang dikuantifikasi.
Jalur pertama dalam hasil memiliki tepi yang berulang.
GRAPH FinGraph
MATCH p = WALK (src:Account)-[t:Transfers]->{3}(dst:Account)
WHERE src.id < dst.id
RETURN ARRAY_TRANSFORM(t, t->t.id) AS transfer_ids
Hasil
| transfer_ids |
|---|
| 16,20,16 |
| 7,16,20 |
| 7,16,20 |
ACYCLIC
Mode jalur ACYCLIC memfilter jalur yang memiliki node berulang.
Contoh
Kueri berikut menunjukkan penggunaan mode jalur ACYCLIC pada
pola jalur yang dikuantifikasi.
Jalur dengan node src dan dst yang sama akan difilter.
GRAPH FinGraph
MATCH p = ACYCLIC (src:Account)-[t:Transfers]->{2}(dst:Account)
RETURN ARRAY_TRANSFORM(NODES(p), n->n.id) AS account_ids
Hasil
| account_ids |
|---|
| 16.20.7 |
| 20,7,16 |
| 20,7,16 |
| 7,16,20 |
| 7,16,20 |
TRAIL
Mode jalur TRAIL memfilter jalur yang memiliki tepi berulang.
Contoh
Kueri berikut menunjukkan penggunaan mode jalur TRAIL pada
pola jalur yang dikuantifikasi.
Jalur dengan tepi berulang akan difilter.
GRAPH FinGraph
MATCH p = TRAIL (src:Account)-[t:Transfers]->{3}(dst:Account)
WHERE src.id < dst.id
RETURN ARRAY_TRANSFORM(t, t->t.id) AS transfer_ids
Hasil
| transfer_ids |
|---|
| 7,16,20 |
| 7,16,20 |
Awalan penelusuran jalur
Anda dapat menggunakan awalan penelusuran jalur untuk membatasi pola jalur agar menampilkan jalur terpendek dari setiap partisi data. Untuk semantik mendetail, lihat Awalan penelusuran jalur.
ANY SHORTEST
Awalan penelusuran jalur ANY SHORTEST menampilkan jalur terpendek (jalur dengan
jumlah tepi paling sedikit) yang cocok dengan pola dari setiap partisi data. Jika
ada lebih dari satu jalur terpendek per partisi, akan menampilkan salah satunya.
Contoh
Kueri berikut cocok dengan jalur apa pun di antara setiap pasangan [a, b].
GRAPH FinGraph
MATCH p = ANY SHORTEST (a:Account {is_blocked:true})-[t:Transfers]->{1,4}(b:Account)
LET total_amount = SUM(t.amount)
RETURN a.id AS account1_id, total_amount, b.id AS account2_id;
Hasil
| account1_id | total_amount | account2_id |
|---|---|---|
| 16 | 500 | 16 |
| 16 | 800 | 7 |
| 16 | 300 | 20 |
Aturan konversi
Untuk mengetahui informasi selengkapnya, lihat aturan konversi GRAPH_PATH.
Contoh kasus penggunaan
Dalam contoh kasus penggunaan berikut, Anda menemukan semua akun telah dirutekan melalui satu hingga tiga akun, dari ID akun 20.
GRAPH FinGraph
MATCH p = (start:Account {id: 20})-[:Transfers]->{1,3}(dst:Account)
RETURN DISTINCT dst.id AS dst;
Hasil
| dst |
|---|
| 7 |
| 16 |
| 20 |
Namun, kueri yang menampilkan ID akun 20 mungkin merupakan kueri yang terlalu luas
karena dimulai dengan ID akun 20. Untuk menampilkan hasil yang lebih spesifik, Anda dapat menerapkan kueri untuk menampilkan hanya jalur grafik asiklik tanpa ada node yang berulang.
Untuk melakukannya, Anda dapat:
- Gunakan
MATCH p = ACYCLIC <path_pattern>; atau - Menerapkan filter
IS_ACYCLIC(p)dalam kueri
Kueri berikut menggunakan MATCH p = ACYCLIC PATH_PATTERN:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})-[:Transfers]->{1,3}(dst:Account)
RETURN DISTINCT dst.id AS dst;
Hasil
| dst |
|---|
| 7 |
| 16 |
Jika ingin mengetahui akun pertama yang digunakan untuk mentransfer uang, Anda dapat menjalankan kueri berikut:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})(-[:Transfers]->
(nexts:Account)){1,3}(dst:Account)
RETURN dst.id AS dst, ARRAY_AGG(DISTINCT nexts[0].id) AS unique_starts;
Kueri ini tidak konvensional karena memperkenalkan variabel baru di dalam
jalur yang dikuantifikasi menggunakan nexts untuk mendapatkan hasilnya. Dengan variabel jalur, Anda dapat
menyederhanakan kueri:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id AS dst, ARRAY_AGG(DISTINCT NODES(p)[OFFSET(1)].id) AS unique_starts;
Menggunakan NODES(p) akan menampilkan semua node di sepanjang jalur. Karena akun node pertama ditentukan sebagai start, akun berikutnya (pada offset pertama) adalah akun pertama yang digunakan untuk mentransfer uang.
Hasil
| dst | unique_starts |
|---|---|
| 7 | 16, 7 |
Jalur lebih berguna jika ada beberapa jalur yang dikuantifikasi. Anda dapat menambahkan batasan bahwa jalur yang ditemukan dari start harus melewati ID akun 7:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})-[:Transfers]->
{1,3}(mid:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id AS dst,
ARRAY_AGG(DISTINCT NODES(p)[OFFSET(1)].id) AS unique_starts;
Meskipun pernyataan MATCH berubah, kueri lainnya tidak perlu
berubah. Tanpa menggunakan variabel jalur, ada kasus di mana Spanner tidak dapat mengetahui secara statis jalur terkuantifikasi mana yang akan diperiksa.
Dengan menggunakan variabel jalur, Anda bisa mendapatkan jumlah semua transfer:
GRAPH FinGraph
MATCH p = ACYCLIC (start:Account {id: 20})-[:Transfers]->
{1,3}(mid:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
LET all_transfers = EDGES(p)
LET transfer_amounts = SUM(all_transfers.amount)
RETURN dst.id AS dst,
ARRAY_AGG(DISTINCT NODES(p)[OFFSET(1)].id) AS participating_neighbor_nodes, transfer_amounts;
Hasil
| dst | participating_neighbor_nodes | transfer_amounts |
|---|---|---|
| 16 | 7 | 600 |
| 16 | 7 | 800 |