Dokumen ini menjelaskan skema Spanner Graph dan memberikan contoh untuk mengilustrasikan konsep utama. Untuk mempelajari Spanner Graph lebih lanjut, lihat ringkasan Spanner Graph.
Model data grafik properti
Dengan grafik properti, Anda dapat membuat model data yang terhubung. Model ini merepresentasikan informasi sebagai jaringan node dan tepi. Node melambangkan entitas dalam lanskap data Anda, seperti "pelanggan", "produk", atau "lokasi". Edge menunjukkan koneksi antara node tersebut, yang menangkap hubungan seperti "dibeli", "mengikuti", atau "berada di".
Node dan edge dapat menyertakan informasi berikut:
- Label, yang mengklasifikasikan node dan edge ke dalam set, misalnya, Kota.
- Properti, yang merupakan pasangan nilai kunci, misalnya, populasi.
Contoh pada Gambar 1 menunjukkan cara mendesain grafik untuk membuat model aktivitas keuangan. Grafik ini mencakup jenis entitas berikut yang dimodelkan sebagai node:
- Orang: Mewakili individu yang terlibat dalam transaksi keuangan.
- Akun: Mewakili rekening bank yang digunakan untuk transaksi.
Entitas ini terhubung oleh berbagai jenis hubungan, yang diwakili oleh tepi terarah berikut:
- Memiliki: Seseorang memiliki satu atau beberapa akun.
- Transfer: Uang dipindahkan dari satu akun ke akun lain.
Setiap tepi terarah menunjukkan hubungan satu arah, yang mengalir dari node sumber
ke node tujuan. Misalnya, tepi Transfers
menghubungkan Account
sumber
ke Account
tujuan, yang menunjukkan aliran uang.
Gambar 1. Contoh grafik dengan beberapa node dan tepi terarah.
Node dan edge dapat berisi informasi tambahan dalam bentuk properti. Setiap properti memiliki nama dan nilai.
- Node Person memiliki properti berikut:
name
(STRING
)id
(INT64
)
- Tepi Transfers memiliki properti berikut:
amount
(FLOAT64)
Tepi terarah dan tidak terarah
Contoh grafik menggunakan edge terarah, yang menunjukkan arah tertentu dalam hubungan antara entity. Namun, beberapa hubungan, seperti hubungan "teman" di jaringan sosial, tidak terarah, dan mewakili koneksi timbal balik tanpa asal atau endpoint yang berbeda. Dalam hal ini, Anda dapat membuat model tepi tidak terarah sebagai dua tepi terarah, satu tepi di setiap arah.
Desain skema Spanner Graph
Spanner Graph memungkinkan Anda membuat grafik dari tabel menggunakan pernyataan CREATE PROPERTY GRAPH. Tabel yang digunakan untuk membuat grafik disebut tabel input. Pendekatan ini didasarkan pada SQL/PGQ (Kueri Grafik Properti), yang merupakan bagian dari Standar SQL:2023.
Menentukan node dalam grafik properti
Untuk menentukan node, Anda menambahkan definisi node dalam klausa NODE TABLES. Bentuk definisi node yang paling sederhana hanya berisi nama tabel input. Baris dari tabel input dipetakan ke node grafik.
Dalam contoh berikut, Anda menggunakan klausa NODE TABLES untuk menentukan node Account
dalam grafik properti FinGraph
. Definisi node berisi
tabel input Account
.
-- First, create an Account table.
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
-- Next, use the Account table as input table of Account node definition.
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Account
);
Label dan properti default
Secara default, semua node menggunakan nama tabel input sebagai labelnya, dan semua kolom dari tabel input ditampilkan sebagai properti node.
Pada contoh sebelumnya,
- Setiap node akun memiliki label
Account
. - Setiap node akun memiliki properti
[id, create_time]
yang dibuat dari kolom tabelAccount
.
Kunci Elemen
Definisi node juga menentukan kunci elemen, yang mengidentifikasi node grafik secara unik.
- Secara default, kunci elemen adalah kunci utama tabel input.
- Kunci elemen dapat ditentukan secara eksplisit oleh klausa
KEY
. - Kolom dengan batasan keunikan
UNIQUE INDEX
dapat digunakan sebagai kunci elemen.
Contoh berikut menentukan node Account
dan node Person
.
- Node
Account
menggunakan kunci utama tabelAccount
sebagai kunci elemennya secara default. - Di sisi lain, node
Person
secara eksplisit menentukanid
sebagai kunci elemen dengan klausaKEY
.
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id),
Account
);
Memetakan baris dalam tabel input ke node dalam grafik
- Setiap baris dengan kunci elemen non-null dipetakan ke node unik dalam grafik, yang diidentifikasi oleh kunci elemen.
- Baris dengan kunci elemen null akan diabaikan.
Menentukan tepi di grafik properti
Untuk menentukan tepi, tambahkan definisi tepi ke dalam klausa EDGE TABLES. Bentuk definisi tepi yang paling sederhana hanya berisi nama tabel input. Baris dari tabel input dipetakan ke tepi grafik.
Label dan properti default tepi ditentukan dengan cara yang sama seperti node.
Kunci elemen setiap tepi ditentukan dengan cara yang sama seperti node.
Referensi node sumber dan tujuan
Dalam contoh berikut, Anda membuat grafik properti FinGraph
dengan
hal berikut:
- Node
Person
danAccount
- Tepi
PersonOwnAccount
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE TABLE PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
INTERLEAVE IN PARENT Person;
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person,
Account
)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
);
Definisi tepi harus menentukan referensi node sumber dan tujuan, menggunakan
klausa SOURCE KEY
, DESTINATION KEY
, dan REFERENCES
. Contoh
berikut menggunakan definisi tepi PersonOwnAccount
untuk mengilustrasikan
konsep ini:
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
)
Setiap tepi PersonOwnAccount
menghubungkan Person
(sumber) ke node Account
(tujuan).
- Node
SOURCE
tepi adalah nodePerson
yangid
-nya sama denganid
tepi. - Node
DESTINATION
dari tepi adalah nodeAccount
yangid
-nya sama dengan tepiaccount_id
.
Selain itu, hal berikut berlaku untuk tepi PersonOwnAccount
:
- Kunci elemen adalah kunci utama tabel
PersonOwnAccount
, yaitu(id, account_id)
. - Setiap tepi memiliki kumpulan properti yang sama dengan kolom dari
tabel
PersonOwnAccount
. - Setiap tepi memiliki label
PersonOwnAccount
default.
Memetakan baris dalam tabel input tepi ke tepi dalam grafik
- Setiap baris dalam tabel input tepi, yang kunci elemennya bukan null, biasanya dipetakan ke tepi unik dalam grafik Anda.
- Baris mungkin sesuai dengan nol atau lebih dari satu tepi dalam grafik, misalnya, saat referensi node sumber cocok dengan nol atau lebih node dalam tabel node sumber.
- Tabel input yang sama dapat digunakan dalam definisi node atau edge yang berbeda untuk membuat kumpulan node atau edge yang berbeda. Untuk informasi selengkapnya, lihat Menggabungkan tabel input node dan tepi.
Menyesuaikan label dan properti
Anda dapat menggunakan klausa LABEL dan PROPERTIES untuk menyesuaikan label dan properti.
Dalam contoh berikut, ada dua node yang ditentukan, Person
dan
Account
.
- Node
Person
expose
propertiaddress
melalui labelCustomer
. Propertiaddress
ditentukan oleh ekspresiCONCAT(city, ", ", country),
yang merujuk ke kolomcity
dancountry
dari tabel inputPerson
. - Untuk
Account
, nodeAccount
mengekspos propertiid
dancreate_time
melalui labelAccount
. Person
danAccount
memiliki labelEntity
dengan properti [id, name
].- Untuk
Person
, propertiid
danname
berasal dari kolom tabel input. - Untuk
Account
, propertiname
merujuk ke kolomnick_name
dari tabel input.
- Untuk
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
birthday TIMESTAMP,
country STRING(MAX),
city STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING(MAX),
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
LABEL Customer
PROPERTIES (CONCAT(city, ", ", country) AS address)
LABEL Entity PROPERTIES (id, name),
Account KEY (id)
LABEL Account PROPERTIES (id, create_time)
LABEL Entity PROPERTIES (id, nick_name AS name)
);
Konsistensi Label dan Properti
Dalam grafik, label dan properti diidentifikasi secara unik berdasarkan namanya. Label dan properti dengan nama yang sama dapat muncul dalam beberapa definisi node atau tepi. Namun, label dan properti dengan nama yang sama harus mengikuti aturan berikut:
- Properti dengan nama yang sama harus memiliki jenis nilai yang sama.
- Label dengan nama yang sama harus mengekspos daftar properti yang sama.
Pada contoh sebelumnya, label Entity
ditentukan di node Person
dan
Account
. Dalam kedua definisi, keduanya memiliki kumpulan nama properti yang sama [id
, name
] dengan jenis nilai yang identik.
Dependensi antara grafik dan objek skema lainnya
Grafik yang dibuat oleh CREATE PROPERTY GRAPH
memiliki dependensi pada objek skema
lain seperti tabel input definisi node dan edge, serta kolom
tabel yang dirujuk oleh properti. Jika perubahan skema akan merusak salah satu dependensi ini, perubahan tersebut tidak diizinkan.
Pernyataan berikut membuat dependensi dari FinGraph
ke tabel Account
dan kolom id
, create_time
.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account PROPERTIES (id, create_time)
);
Berikut adalah contoh perubahan skema yang tidak diizinkan untuk Anda lakukan:
- Hapus tabel
Account
, kecuali jika Anda terlebih dahulu menghapus definisi nodeAccount
. Untuk mengetahui informasi selengkapnya, lihat Menghapus node atau definisi tepi yang ada. - Hapus kolom
create_time
dari tabelAccount
, kecuali jika Anda terlebih dahulu menghapus properticreate_time
dari definisi nodeAccount
. Untuk mengetahui informasi selengkapnya, lihat Memperbarui definisi node atau edge yang ada.
Namun, Anda dapat melakukan perubahan skema berikut:
- Ubah tabel
Account
dan skema kolomid
dancreate_time
selama skema tersebut diizinkan oleh persyaratan skema lainnya. Untuk mengetahui informasi selengkapnya, lihat Melakukan update skema.