Dokumen ini membandingkan OpenCypher dan Grafik Spanner dalam cara:
- Terminologi
- Model data
- Skema
- Kueri
- Mutasi
Dokumen ini mengasumsikan Anda sudah familier dengan openCypher v9.
Sebelum memulai
Menyiapkan dan membuat kueri Spanner Graph menggunakan Konsol Google Cloud.
Terminologi
openCypher | Spanner Graph |
---|---|
node | node |
hubungan | tepi |
label node | label node |
jenis hubungan | label tepi |
klausa | Spanner Graph menggunakan istilah statement untuk satu unit lengkap
eksekusi, dan clause untuk pengubah pernyataan.Misalnya, MATCH adalah pernyataan sedangkan
WHERE adalah sebuah klausa. |
keunikan hubungan openCypher tidak menampilkan hasil dengan tepi berulang dalam satu yang cocok. |
Jalur JALAN SETAPAK Ketika keunikan diinginkan di Spanner Graph, gunakan Mode TRAIL untuk menampilkan tepi unik dalam satu pencocokan.
|
Kepatuhan standar
Spanner Graph mengadopsi ISO Bahasa Kueri Graph (GQL) dan Kueri Grafik SQL/Properti (SQL/PGQ).
Model data
Spanner Graph dan openCypher mengadopsi model data grafik properti dengan beberapa perbedaan.
openCypher | Spanner Graph |
---|---|
Setiap hubungan memiliki tepat satu jenis hubungan. |
Baik node maupun edge memiliki satu atau beberapa label. |
Skema
openCypher | Spanner Graph |
---|---|
Grafik tidak memiliki skema yang telah ditetapkan sebelumnya. | Skema grafik harus secara eksplisit ditentukan dengan menggunakan
Pernyataan CREATE PROPERTY GRAPH .Label ditentukan secara statis dalam skema. Untuk memperbarui label, Anda perlu memperbarui skema. Untuk informasi selengkapnya, lihat Membuat, memperbarui, atau melepas skema Grafik Spanner. |
Kueri
Kemampuan kueri Spanner Graph mirip dengan openCypher. Perbedaan antara Spanner Graph dan openCypher dijelaskan di bagian ini.
Menentukan grafik
Di openCypher, ada satu grafik {i>default<i}, dan kueri beroperasi secara
grafik. Di Spanner Graph, Anda dapat menentukan lebih dari satu grafik dan kueri
harus diawali dengan klausa GRAPH
untuk menentukan grafik yang akan dikueri. Contoh:
GRAPH FinGraph
MATCH (p:Person)
RETURN p.name
ORDER BY p.name
LIMIT 1;
Untuk mengetahui informasi selengkapnya, lihat sintaksis kueri grafik.
Pencocokan pola grafik
Spanner Graph mendukung kemampuan pencocokan pola grafik yang mirip dengan openCypher. Perbedaannya akan dijelaskan di bagian berikut.
Keunikan hubungan dan mode TRAIL
openCypher tidak menampilkan hasil dengan tepi berulang dalam satu kecocokan; ingin
disebut keunikan hubungan di openCypher. Dalam Spanner Graph,
tepi berulang ditampilkan secara default. Ketika keunikan diinginkan, gunakan
Mode TRAIL
untuk memastikan tidak ada edge berulang dalam satu kecocokan. Sebagai
semantik mendetail dari TRAIL
dan mode jalur yang berbeda lainnya, lihat
Mode jalur.
Contoh berikut menunjukkan bagaimana hasil kueri berubah dengan mode TRAIL
:
- Kueri mode
TRAIL
openCypher dan Spanner Graph menampilkan kosong hasil karena satu-satunya jalur yang memungkinkan adalah mengulangit1
dua kali. - Secara default, kueri Spanner Graph menampilkan jalur yang valid.
openCypher | Grafik Spanner (mode TRAIL) | Grafik Spanner (mode default) | ||||
---|---|---|---|---|---|---|
MATCH (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]->(dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
GRAPH FinGraph MATCH TRAIL (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]->(dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
GRAPH FinGraph MATCH (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]-> (dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
||||
Hasil kosong. | Hasil kosong. | Hasil:
|
Menampilkan elemen grafik sebagai hasil kueri
openCypher | Spanner Graph |
---|---|
MATCH (account:Account) WHERE account.id = 16; RETURN account; |
GRAPH FinGraph MATCH (account:Account) WHERE account.id = 16; RETURN TO_JSON(account) AS account; |
Dalam Spanner Graph, hasil kueri tidak menampilkan elemen grafik. Gunakan
Fungsi TO_JSON
untuk menampilkan elemen grafik sebagai JSON.
Pencocokan pola panjang variabel dan kuantifikasi pola
Pencocokan pola panjang variabel di openCypher disebut kuantifikasi jalur di Spanner Graph. Kuantifikasi jalur menggunakan sintaksis yang berbeda, seperti yang ditunjukkan dalam contoh berikut. Untuk mengetahui informasi selengkapnya, lihat artikel Pola jalur terukur.
openCypher | Spanner Graph |
---|---|
MATCH (src:Account)-[:Transfers*1..2]->(dst:Account) WHERE src.id = 16 RETURN dst.id ORDER BY dst.id; |
GRAPH FinGraph MATCH (src:Account)-[:Transfers]->{1,2}(dst:Account) WHERE src.id = 16 RETURN dst.id ORDER BY dst.id; |
Pola panjang variabel: daftar elemen
Spanner Graph memungkinkan Anda mengakses variabel yang digunakan dalam jalur secara langsung
kuantifikasi. Dalam contoh berikut, e
di Spanner Graph sama
sebagai edges(p)
di openCypher.
openCypher | Spanner Graph |
---|---|
MATCH p=(src:Account)-[:Transfers*1..3]->(dst:Account) WHERE src.id = 16 RETURN edges(p); |
GRAPH FinGraph MATCH (src:Account) -[e:Transfers]->{1,3} (dst:Account) WHERE src.id = 16 RETURN TO_JSON(e) AS e; |
Jalur terpendek
openCypher memiliki dua fungsi bawaan untuk menemukan jalur terpendek antar {i>node<i}:
shortestPath
dan allShortestPath
.
shortestPath
menemukan satu jalur terpendek antar-node.allShortestPath
menemukan semua jalur terpendek antar-node. Ada dapat menjadi beberapa jalur dengan panjang yang sama.
Spanner Graph menggunakan sintaksis yang berbeda untuk menemukan satu jalur terpendek
antar node: ANY SHORTEST
untuk shortestPath.
allShortestPath
tidak didukung.
openCypher | Spanner Graph |
---|---|
MATCH (src:Account {id: 7}), (dst:Account {id: 20}), p = shortestPath((src)-[*1..10]->(dst)) RETURN length(p) AS path_length; |
GRAPH FinGraph MATCH ANY SHORTEST (src:Account {id: 7})-[e:Transfers]->{1, 3} (dst:Account {id: 20}) RETURN ARRAY_LENGTH(e) AS path_length; |
Pernyataan dan klausul
Tabel berikut mencantumkan klausa openCypher, dan menunjukkan apakah tetapi didukung dalam Spanner Graph.
openCypher | Spanner Graph | |
---|---|---|
MATCH | Didukung. Untuk mengetahui informasi selengkapnya, lihat pencocokan pola grafik. | |
KECOCOKAN OPSIONAL | Didukung. Untuk mengetahui informasi selengkapnya, lihat pencocokan pola grafik. | |
KEMBALI / DENGAN |
Didukung. Untuk informasi selengkapnya, lihat
Pernyataan KEMBALI dan
Pernyataan WITH.
Spanner Graph memerlukan aliasing eksplisit untuk ekspresi yang rumit. |
|
Didukung. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear; |
|
Tidak didukung. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing |
|
WHERE | Didukung. Untuk informasi selengkapnya, lihat definisi untuk pola grafik. | |
ORDER BY | Didukung. Untuk informasi selengkapnya, lihat Pernyataan ORDER BY. | |
LEWATI / LIMIT |
Didukung. Untuk informasi selengkapnya, lihat
pernyataan LEWATI dan
Pernyataan LIMIT. Spanner Graph memerlukan ekspresi yang konstan untuk offset dan batas. |
|
Didukung. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id SKIP @offsetParameter LIMIT 3; |
|
Tidak didukung. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id LIMIT VALUE { MATCH (m:Person) RETURN COUNT(*) AS count } AS count; -- Not a constant expression |
|
UNION | Didukung. Untuk informasi selengkapnya, lihat Kueri grafik gabungan. | |
UNION SEMUA | Didukung. Untuk informasi selengkapnya, lihat Kueri grafik gabungan. | |
BERSIHKAN | Didukung oleh pernyataan`FOR`. | |
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
KECOCOKAN WAJIB | Tidak didukung. | |
TELEPON[YIELD...] | Tidak didukung. | |
BUAT, HAPUS, SETEL, HAPUS, GABUNGKAN | Untuk mempelajari lebih lanjut, lihat bagian Mutasi dan Menyisipkan, memperbarui, atau menghapus data di Grafik Spanner. |
Jenis data
Spanner Graph mendukung semua jenis data GoogleSQL. Untuk selengkapnya informasi, lihat Jenis data di GoogleSQL.
Bagian berikut membandingkan jenis data openCypher dengan data Spanner Graph jenis.
Jenis struktur
openCypher | Spanner Graph |
---|---|
Node | Node |
Edge | Edge |
Jalur | Tidak didukung. |
Jenis properti
openCypher | Spanner Graph |
---|---|
INT | INT64 |
FLOAT | FLOAT64 |
STRING | STRING |
BOOLEAN | BOOL |
DAFTAR Daftar homogen dari jenis sederhana. Misalnya, Daftar INT, Daftar STRING. Anda tidak dapat menggabungkan INT dan STRING dalam satu daftar. |
ARRAY |
Jenis komposit
openCypher | Spanner Graph |
---|---|
DAFTAR | ARRAY atau JSON |
PETA | STRUCT atau JSON |
Spanner Graph tidak mendukung daftar heterogen dari berbagai jenis atau peta daftar kunci dinamis dan jenis nilai elemen heterogen. Gunakan JSON untuk kasus penggunaan ini.
Paksaan Jenis
openCypher | Spanner Graph |
---|---|
INT -> FLOAT | Didukung. |
Untuk informasi selengkapnya tentang aturan konversi jenis, lihat Aturan konversi di GoogleSQL.
Fungsi dan ekspresi
Selain fungsi dan ekspresi grafik, Spanner Graph juga mendukung semua fungsi dan ekspresi bawaan GoogleSQL.
Untuk mengetahui daftar lengkap fungsi dan ekspresi, lihat Fungsi, operator, dan kondisional GoogleSQL.
Bagian ini mencantumkan fungsi dan ekspresi openCypher beserta pada Spanner Graph.
Fungsi dan ekspresi jenis struktural
Jenis | openCypher fungsi atau ekspresi |
Grafik Spanner fungsi atau ekspresi |
|
---|---|---|---|
Node dan Edge |
exists(n.prop) | property_exists(n, properti) | |
id(menampilkan bilangan bulat) | Tidak didukung. | ||
properties | to_json |
||
kunci (nama jenis properti, tetapi bukan nilai properti) |
property_names |
||
label | label | ||
Edge | endNode | Tidak didukung. | |
startNode | Tidak didukung. | ||
jenis | label | ||
Jalur | durasi | Tidak didukung. | |
node | Tidak didukung. | ||
hubungan | Tidak didukung. | ||
Node dan Edge | referensi properti |
. | |
[] referensi properti dinamis
|
Tidak didukung. | ||
Pola Sebagai Ekspresi | ukuran(pola) | Tidak didukung. Gunakan subkueri sebagai berikut
|
Fungsi dan ekspresi jenis properti
Jenis | openCypher fungsi atau ekspresi |
Grafik Spanner fungsi atau ekspresi |
|
---|---|---|---|
Scalar | menggabung | menggabung | |
head | array_first | ||
terakhir | array_last | ||
ukuran(daftar) | array_length | ||
ukuran(string) | durasi | ||
timestamp | unix_millis(current_timestamp()) | ||
toBoolean/toFloat/toInteger | cast( |
||
Agregat | rata-rata | rata-rata | |
collect | array_agg | ||
count | count | ||
maks | maks | ||
mnt | mnt | ||
percentileCont | percentile_cont | ||
percentileDisc | percentile_disc | ||
stDev | stdev | ||
stDevP | stdev_pop | ||
jumlah | jumlah | ||
Daftar | rentang | generate_array | |
reverse | array_reverse | ||
tail | Spanner Graph tidak mendukung tail .Gunakan array_slice dan array_length
sebagai gantinya. |
||
Matematika | abs | abs | |
ceil | ceil | ||
lantai | lantai | ||
rand | rand | ||
bulat | bulat | ||
login | login | ||
e | exp(1) | ||
exp | exp | ||
log | log | ||
log10 | log10 | ||
sqrt | sqrt | ||
acos | acos | ||
Asin | Asin | ||
atangen | atangen | ||
atan2 | atan2 | ||
cos | cos | ||
cot | cot | ||
derajat | r * 90 / asin(1) | ||
pi | pi | ||
radian | d * asin(1) / 90 | ||
{i>sin<i} | {i>sin<i} | ||
cokelat muda | cokelat muda | ||
String | lagi | lagi | |
{i>ltrim<i} | {i>ltrim<i} | ||
ganti | ganti | ||
reverse | reverse | ||
panah kanan | panah kanan | ||
rtrim | rtrim | ||
bagian | bagian | ||
{i>substring<i} | substr | ||
menurunkan | lebih rendah untuk | ||
{i>tostring<i} | cast( |
||
toupper | lebih tinggi | ||
pangkas | pangkas | ||
DISTINCT | DISTINCT | DISTINCT | |
Matematika | + | + | |
- | - | ||
* | * | ||
/ | / | ||
% | MOD | ||
^ | POW | ||
Perbandingan | = | = | |
<> | <> | ||
< | < | ||
> | > | ||
<= | <= | ||
>= | >= | ||
ADALAH [BUKAN] NULL | ADALAH [BUKAN] NULL | ||
Rangkaian perbandingan
|
Grafik Spanner
tidak mendukung rantai perbandingan. Ini setara dengan
perbandingan yang digabungkan dengan AND . Contoh:
|
||
Boolean | DAN | DAN | |
ATAU | ATAU | ||
XOR |
Grafik Spanner
tidak mendukung XOR. Tulis kueri dengan <> .Contoh:
|
||
NOT | NOT | ||
String | MULAI DENGAN | starts_with | |
DIAKHIRI DENGAN | ends_with | ||
BERISI | regexp_contains | ||
+ | string_concat | ||
Daftar | + | array_concat | |
IN | array_includes | ||
[] | [] |
Ekspresi lainnya
openCypher | Spanner Graph |
---|---|
Ekspresi kasus | Didukung. |
Ada subkueri | Didukung. |
Proyeksi peta | Tidak didukung. Jenis STRUCT menyediakan fungsi yang serupa. |
Pemahaman daftar | Tidak didukung. generate_array dan array_transform mencakup sebagian besar kasus penggunaan. |
Parameter kueri
Kueri berikut menunjukkan perbedaan antara penggunaan parameter dalam openCypher dan di Spanner Graph.
openCypher | Spanner Graph | |
---|---|---|
Parameter | MATCH (n:Person) WHERE n.id = $id RETURN n.name; |
GRAPH FinGraph MATCH (n:Person) WHERE n.id = @id RETURN n.name; |
Mutasi
Spanner Graph menggunakan GoogleSQL DML untuk memutasikan tabel input node dan edge. Untuk informasi selengkapnya, lihat Menyisipkan, memperbarui, atau menghapus data Grafik Spanner.
Membuat node dan edge
openCypher | Spanner Graph | |
---|---|---|
Membuat node dan edge | CREATE (:Person {id: 100, name: 'John'}); CREATE (:Account {id: 1000, is_blocked: FALSE}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
Membuat node dan tepi dengan hasil kueri |
MATCH (a:Account {id: 1}), (oa:Account) WHERE oa <> a CREATE (a)-[:Transfers {amount: 100, create_time: timestamp()}]->(oa); |
INSERT INTO AccountTransferAccount(id, to_id, create_time, amount) SELECT a.id, oa.id, CURRENT_TIMESTAMP(), 100 FROM GRAPH_TABLE( FinGraph MATCH (a:Account {id:1000}), (oa:Account) WHERE oa <> a ); |
Di Spanner Graph, label secara statis ditetapkan sesuai dengan
Pernyataan DDL CREATE PROPERTY GRAPH
.
Mengupdate node dan edge
openCypher | Spanner Graph | |
---|---|---|
Memperbarui properti | MATCH (p:Person {id: 100}) SET p.country = 'United States'; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100; |
Untuk memperbarui label Grafik Spanner, lihat Membuat, mengupdate, atau melepas skema Grafik Spanner.
Menggabungkan node dan edge
openCypher | Spanner Graph | |
---|---|---|
Menyisipkan elemen baru atau memperbarui properti | MERGE (p:Person {id: 100, country: 'United States'}); |
INSERT OR UPDATE INTO Person (id, country) VALUES (100, 'United States'); |
Hapus node dan edge
Menghapus edge sama dengan menghapus tabel input.
openCypher | Spanner Graph | |
---|---|---|
Menghapus node dan edge | MATCH (p:Person {id:100}), (a:Account {id:1000}) DELETE (p)-[:Owns]->(a); |
DELETE PersonOwnAccount WHERE id = 100 AND account_id = 1000; |
Untuk menghapus node, diperlukan penanganan tepi yang berpotensi menjuntai. Jika DELETE CASCADE
ditentukan, DELETE
akan menghapus tepi yang terkait dari
node seperti DETACH DELETE
di openCypher. Untuk informasi selengkapnya, lihat Spanner
ringkasan skema.
openCypher | Spanner Graph | |
---|---|---|
Hapus node dan tepi terkait | DETACH DELETE (:Account {id: 1000}); |
DELETE Account WHERE id = 1000; |
Menampilkan hasil mutasi
openCypher | Spanner Graph | |
---|---|---|
Tampilkan hasil setelah penyisipan atau pembaruan | MATCH (p:Person {id: 100}) SET p.country = 'United States' RETURN p.id, p.name; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100 THEN RETURN id, name; |
Menampilkan hasil setelah penghapusan | DELETE (p:Person {id: 100}) RETURN p.country; |
DELETE FROM Person WHERE id = 100 THEN RETURN country; |