Referensi Spanner Graph untuk pengguna openCypher

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 mengulangi t1 dua kali.
  • Secara default, kueri Spanner Graph menampilkan jalur yang valid.

Contoh grafik

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:
src_id dst_id
16 20

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 Jalur

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 .
property reference
.
[]
dynamic property reference
MATCH (n)
RETURN n[n.name]

Tidak didukung.
Pola Sebagai Ekspresi size(pattern) Tidak didukung. Gunakan subkueri sebagai berikut
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

Fungsi dan ekspresi jenis properti

Jenis Fungsi atau ekspresi openCypher
Fungsi atau ekspresi
Spanner Graph
Skalar 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
a < b < c

Spanner Graph tidak mendukung rantai perbandingan. Hal ini setara dengan perbandingan yang digabungkan dengan AND.
Contoh:

      a < b AND b < C
      

Boolean AND AND
OR OR
XOR
Spanner Graph tidak mendukung XOR. Tulis kueri dengan <>.

Contoh:
      boolean_1 <> boolean_2
      

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

MATCH (p:Person {id: 100}), (a:Account {id: 1000}) CREATE (p)-[:Owns {create_time: timestamp()}]->(a);
INSERT INTO
Person (id, name)
VALUES (100, "John");

INSERT INTO Account (id, is_blocked) VALUES (1000, FALSE);
INSERT INTO PersonOwnAccount (id, account_id, create_time) VALUES (100, 1000, CURRENT_TIMESTAMP());
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;

Langkah selanjutnya