Dokumen ini membandingkan openCypher dan Spanner Graph dengan cara berikut:
- Terminologi
- Model data
- Skema
- Kueri
- Mutasi
Dokumen ini mengasumsikan bahwa Anda sudah memahami openCypher v9.
Sebelum memulai
Menyiapkan dan mengkueri 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 unit eksekusi lengkap, dan clause untuk pengubah pada pernyataan.Misalnya, MATCH adalah pernyataan, sedangkan
WHERE adalah klausa. |
keunikan hubungan openCypher tidak menampilkan hasil dengan tepi berulang dalam satu pencocokan. |
Jalur TRAIL Jika keunikan diinginkan di Spanner Graph, gunakan mode TRAIL untuk menampilkan tepi unik dalam satu kecocokan.
|
Kepatuhan terhadap standar
Spanner Graph mengadopsi standar Graph Query Language (GQL) dan SQL/Property Graph Queries (SQL/PGQ) ISO.
Model data
Spanner Graph dan openCypher mengadopsi model data grafik properti dengan beberapa perbedaan.
openCypher | Spanner Graph |
---|---|
Setiap hubungan memiliki tepat satu jenis hubungan. |
Node dan edge memiliki satu atau beberapa label. |
Skema
openCypher | Spanner Graph |
---|---|
Grafik tidak memiliki skema yang telah ditetapkan sebelumnya. | Skema grafik harus ditentukan secara eksplisit menggunakan
pernyataan CREATE PROPERTY GRAPH .Label ditentukan secara statis dalam skema. Untuk memperbarui label, Anda harus memperbarui skema. Untuk informasi selengkapnya, lihat Membuat, memperbarui, atau menghapus skema Spanner Graph. |
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 default, dan kueri beroperasi pada grafik
default. Di Spanner Graph, Anda dapat menentukan lebih dari satu grafik dan kueri
harus dimulai 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 informasi selengkapnya, lihat sintaksis kueri grafik.
Pencocokan pola grafik
Spanner Graph mendukung kemampuan pencocokan pola grafik yang mirip dengan openCypher. Perbedaannya dijelaskan di bagian berikut.
Keunikan hubungan dan mode TRAIL
openCypher tidak menampilkan hasil dengan tepi berulang dalam satu kecocokan; hal ini
disebut keunikan hubungan di openCypher. Di Spanner Graph,
sisi berulang ditampilkan secara default. Jika keunikan diinginkan, gunakan
mode TRAIL
untuk memastikan tidak ada edge berulang dalam satu kecocokan. Untuk
semantik mendetail tentang TRAIL
dan mode jalur lain yang berbeda, lihat
Mode jalur.
Contoh berikut menunjukkan bagaimana hasil kueri berubah dengan mode TRAIL
:
- Kueri mode
TRAIL
openCypher dan Spanner Graph menampilkan hasil kosong karena satu-satunya jalur yang mungkin adalah mengulangit1
dua kali. - Secara default, kueri Spanner Graph menampilkan jalur yang valid.
openCypher | Spanner Graph (mode TRAIL) | Spanner Graph (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; |
Di Spanner Graph, hasil kueri tidak menampilkan elemen grafik. Gunakan fungsi TO_JSON
untuk menampilkan elemen grafik sebagai JSON.
Pencocokan pola dan kuantisasi pola dengan panjang variabel
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 Pola jalur kuantitatif.
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 kuantifikasi
jalur secara langsung. Dalam contoh berikut, e
di Spanner Graph sama dengan
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 di antara node:
shortestPath
dan allShortestPath
.
shortestPath
menemukan satu jalur terpendek di antara node.allShortestPath
menemukan semua jalur terpendek antar-node. Dapat ada beberapa jalur dengan panjang yang sama.
Spanner Graph menggunakan sintaksis yang berbeda untuk menemukan satu jalur terpendek
di antara node: ANY SHORTEST
untuk shortestPath.
Fungsi allShortestPath
tidak didukung di Spanner Graph.
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 klausa
Tabel berikut mencantumkan klausa openCypher, dan menunjukkan apakah klausa tersebut didukung atau tidak di Spanner Graph.
openCypher | Spanner Graph | |
---|---|---|
MATCH |
Didukung. Untuk informasi selengkapnya, lihat pencocokan pola grafik. | |
OPTIONAL MATCH |
Didukung. Untuk informasi selengkapnya, lihat pencocokan pola grafik. | |
RETURN / WITH |
Didukung. Untuk informasi selengkapnya, lihat
pernyataan RETURN dan
pernyataan WITH .
Spanner Graph memerlukan alias 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 mengetahui informasi selengkapnya, lihat definisi untuk pola grafik. | |
ORDER BY |
Didukung. Untuk mengetahui informasi selengkapnya, lihat
pernyataan ORDER BY . |
|
SKIP / LIMIT |
Didukung. Untuk informasi selengkapnya, lihat
pernyataan SKIP dan
pernyataan LIMIT .Spanner Graph memerlukan ekspresi 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 mengetahui informasi selengkapnya, lihat Kueri grafik komposit. | |
UNION ALL |
Didukung. Untuk mengetahui informasi selengkapnya, lihat Kueri grafik komposit. | |
UNWIND |
Didukung oleh pernyataan FOR . |
|
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
MANDATORY MATCH |
Tidak didukung. | |
CALL[YIELD...] |
Tidak didukung. | |
CREATE , DELETE , SET ,
REMOVE , MERGE |
Untuk mempelajari lebih lanjut, lihat bagian Mutasi dan Menyisipkan, memperbarui, atau menghapus data di Spanner Graph. |
Jenis data
Spanner Graph mendukung semua jenis data GoogleSQL. Untuk informasi selengkapnya, lihat Jenis data di GoogleSQL.
Bagian berikut membandingkan jenis data openCypher dengan jenis data Spanner Graph.
Jenis struktural
openCypher | Spanner Graph |
---|---|
Node | Node |
Edge | Edge |
Jalur | Tidak didukung. |
Jenis properti
openCypher | Spanner Graph |
---|---|
INT |
INT64 |
FLOAT |
FLOAT64 |
STRING |
STRING |
BOOLEAN |
BOOL |
LIST 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 |
---|---|
LIST |
ARRAY atau JSON |
MAP |
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.
Konversi Jenis
openCypher | Spanner Graph |
---|---|
INT -> FLOAT |
Didukung. |
Untuk mengetahui 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.
Bagian ini mencantumkan fungsi dan ekspresi openCypher serta yang setara di Spanner Graph.
Fungsi dan ekspresi jenis struktural
Jenis | Fungsi atau ekspresi openCypher |
Fungsi atau ekspresi Spanner Graph |
|
---|---|---|---|
Node dan Edge |
exists(n.prop) |
PROPERTY_EXISTS(n, prop) |
|
id (menampilkan bilangan bulat) |
Tidak didukung. | ||
properties |
TO_JSON |
||
keys (nama jenis properti, tetapi bukan nilai properti) |
PROPERTY_NAMES |
||
labels |
LABELS |
||
Edge | endNode |
Tidak didukung. | |
startNode |
Tidak didukung. | ||
type |
LABELS |
||
Jalur | length |
Tidak didukung. | |
nodes |
Tidak didukung. | ||
relationships |
Tidak didukung. | ||
Node dan Edge | .
|
. |
|
[]
|
Tidak didukung. | ||
Pola Sebagai Ekspresi | size(pattern) |
Tidak didukung. Gunakan subkueri sebagai berikut
|
Fungsi dan ekspresi jenis properti
Jenis | Fungsi atau ekspresi openCypher |
Fungsi atau ekspresi Spanner Graph |
|
---|---|---|---|
Scalar | coalesce |
COALESCE |
|
head |
ARRAY_FIRST |
||
last |
ARRAY_LAST |
||
size(list) |
ARRAY_LENGTH |
||
size(string) |
LENGTH |
||
timestamp |
UNIX_MILLIS(CURRENT_TIMESTAMP()) |
||
toBoolean /toFloat /toInteger |
CAST(expr AS type) |
||
Agregat | avg |
AVG |
|
collect |
ARRAY_AGG |
||
count
| COUNT |
||
max |
MAX |
||
min |
MIN |
||
percentileCont |
PERCENTILE_CONT |
||
percentileDisc |
PERCENTILE_DISC |
||
stDev |
STDDEV |
||
stDevP |
Tidak didukung. | ||
sum |
SUM |
||
Daftar | range |
GENERATE_ARRAY |
|
reverse |
ARRAY_REVERSE |
||
tail |
Spanner Graph tidak mendukung tail .Gunakan ARRAY_SLICE dan ARRAY_LENGTH
sebagai gantinya. |
||
Matematika | abs |
ABS |
|
ceil |
CEIL |
||
floor |
FLOOR |
||
rand |
RAND |
||
round |
ROUND |
||
sign |
SIGN |
||
e |
EXP(1) |
||
exp |
EXP |
||
log |
LOG |
||
log10 |
LOG10 |
||
sqrt |
SQRT |
||
acos |
ACOS |
||
asin |
ASIN |
||
atan |
ATAN |
||
atan2 |
ATAN2 |
||
cos |
COS |
||
cot |
COT |
||
degrees |
r * 90 / ASIN(1) |
||
pi |
ACOS(-1) |
||
radians |
d * ASIN(1) / 90 |
||
sin |
SIN |
||
tan |
TAN |
||
String | left |
LEFT |
|
ltrim |
LTRIM |
||
replace |
REPLACE |
||
reverse |
REVERSE |
||
right |
RIGHT |
||
rtrim |
RTRIM |
||
split |
SPLIT |
||
substring |
SUBSTR |
||
tolower |
LOWER |
||
tostring |
CAST(expr AS STRING) |
||
toupper |
UPPER |
||
trim |
TRIM |
||
DISTINCT | DISTINCT |
DISTINCT |
|
Matematika | + |
+ |
|
- |
- |
||
* |
* |
||
/ |
/ |
||
% |
MOD |
||
^ |
POW |
||
Perbandingan | = |
= |
|
<> |
<> |
||
< |
< |
||
> |
> |
||
<= |
<= |
||
>= |
>= |
||
IS [NOT] NULL |
IS [NOT] NULL |
||
Rantai perbandingan
|
Spanner Graph
tidak mendukung rantai perbandingan. Hal ini setara dengan perbandingan yang digabungkan dengan AND . Contoh:
|
||
Boolean | AND |
AND |
|
OR |
OR |
||
XOR |
Spanner Graph
tidak mendukung XOR . Tulis kueri dengan <> .Contoh:
|
||
NOT |
NOT |
||
String | STARTS WITH |
STARTS_WITH |
|
ENDS WITH |
ENDS_WITH |
||
CONTAINS |
REGEXP_CONTAINS |
||
+ |
CONCAT |
||
Daftar | + |
ARRAY_CONCAT |
|
IN |
ARRAY_INCLUDES |
||
[] |
[] |
Ekspresi lainnya
openCypher | Spanner Graph |
---|---|
Ekspresi kasus | Didukung. |
Subkueri ada | 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 di 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 DML GoogleSQL untuk memutasi tabel input node dan edge. Untuk informasi selengkapnya, lihat Menyisipkan, memperbarui, atau menghapus data Spanner Graph.
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 edge 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 ditetapkan secara statis sesuai dengan
pernyataan DDL CREATE PROPERTY GRAPH
.
Memperbarui 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 Spanner Graph, lihat Membuat, memperbarui, atau menghapus skema Spanner Graph.
Menggabungkan node dan edge
openCypher | Spanner Graph | |
---|---|---|
Memasukkan elemen baru atau memperbarui properti | MERGE (p:Person {id: 100, country: 'United States'}); |
INSERT OR UPDATE INTO Person (id, country) VALUES (100, 'United States'); |
Menghapus node dan edge
Menghapus tepi sama dengan menghapus tabel input.
openCypher | Spanner Graph | |
---|---|---|
Menghapus node dan tepi | MATCH (p:Person {id:100}), (a:Account {id:1000}) DELETE (p)-[:Owns]->(a); |
DELETE PersonOwnAccount WHERE id = 100 AND account_id = 1000; |
Menghapus node memerlukan penanganan potensi edge yang menggantung. Jika DELETE CASCADE
ditentukan, DELETE
akan menghapus tepi node terkait seperti DETACH DELETE
di openCypher. Untuk mengetahui informasi selengkapnya, lihat ringkasan skema
Spanner.
openCypher | Spanner Graph | |
---|---|---|
Menghapus node dan tepi terkait | DETACH DELETE (:Account {id: 1000}); |
DELETE Account WHERE id = 1000; |
Menampilkan hasil mutasi
openCypher | Spanner Graph | |
---|---|---|
Menampilkan 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; |