Model property graph menyatukan empat elemen, yaitu node, label, relasi, dan properti, ke dalam satu struktur graf yang disimpan langsung oleh Neo4j. Topik ini membahas definisi mekanis keempat elemen tersebut, cara Neo4j menyimpan dan membaca graf, serta kueri Cypher kecil yang membuat dan membaca graf contoh tiga siswa. Setelah topik ini dibaca, struktur graf apa pun yang digunakan Neo4j dapat diuraikan ke dalam keempat elemen itu secara lengkap.
Empat elemen property graph#
Node adalah objek data diskret yang mewakili satu entitas, misalnya satu siswa, satu mata pelajaran, atau satu sekolah. Neo4j menyimpan setiap node sebagai satu kesatuan data yang dapat membawa properti dan dapat dihubungkan ke node lain. Label adalah penanda bernama yang menempel pada node untuk mengelompokkan node-node sejenis. Satu node boleh memikul lebih dari satu label sekaligus, dan label tidak perlu dideklarasikan terlebih dahulu.
Relasi adalah koneksi berarah antara dua node yang selalu memiliki node asal, node tujuan, dan tepat satu tipe, misalnya tipe SAHABAT dari Danu menuju Eka. Koneksi tersebut tersimpan sebagai data itu sendiri, bukan sebagai kesimpulan yang dihitung ulang ketika kueri berjalan. Properti adalah pasangan kunci dan nilai yang menempel pada node maupun relasi, misalnya properti nama pada node Siswa. Tipe nilai properti dibatasi oleh daftar bawaan Neo4j yang mencakup string, angka, boolean, list, dan beberapa tipe waktu.
Diagram berikut menampilkan graf contoh yang digunakan sepanjang topik ini. Tiga node bertanda :Siswa menyimpan properti nama, sedangkan dua relasi bertipe SAHABAT menghubungkan Danu ke Eka dan Eka ke Fitri. Keempat elemen terlihat sekaligus pada gambar tersebut, sehingga graf kecil mana pun dapat diuraikan lengkap dengan menyebut keempat elemen itu.
Cara Neo4j menyimpan dan membaca graf#
Neo4j termasuk basis data graf bawaan (native graph database) karena format penyimpanannya memang dirancang untuk graf, bukan untuk tabel atau dokumen yang diberi lapisan graf di atasnya. Setiap relasi disimpan sebagai rekaman yang menunjuk langsung ke node asal dan node tujuannya. Karena itu, melompat dari satu node ke node tetangganya menjadi operasi yang murah, dan banyak kueri keberhubungan tidak perlu menggabungkan baris-baris besar sebagaimana dilakukan join pada basis data relasional.
Pembacaan graf dilakukan dengan menuliskan pola bentuk yang dicari. Bahasa kueri Cypher menuliskan pola itu sebagaimana bentuknya pada diagram, yaitu node ditulis dalam kurung biasa dan relasi ditulis di antara tanda panah. Pola umumnya dijangkarkan pada label, misalnya (a:Siswa), sehingga pencarian dimulai dari himpunan node yang relevan dan bukan dari seluruh isi graf. Tanpa penjangkaran, mesin kueri harus memeriksa jauh lebih banyak node, dan biayanya tumbuh mengikuti ukuran graf. Setelah pola ditemukan, properti dan tipe relasi pada bagian yang cocok dapat dikembalikan sebagai baris hasil.
Membuat graf contoh dengan Cypher#
Graf contoh pada diagram sebelumnya dibuat dengan pernyataan MERGE yang berperilaku get-or-create, yaitu mencocokkan pola terlebih dahulu dan membuat pola baru hanya apabila pencocokannya kosong. Setiap pola MERGE menyebut label beserta properti yang menjadi identitas bagian itu, sehingga eksekusi berikutnya menemukan pola yang sama alih-alih membuat salinannya. Pola yang sudah ada tidak dibuat ulang, sehingga penyiapan dapat dijalankan berulang kali tanpa menimbulkan duplikat. Sifat ini disebut idempoten dan membuat MERGE tepat untuk data contoh yang digunakan bersama. Kueri berikut menyiapkan tiga node beserta dua relasinya, kemudian mengembalikan rantai yang terbentuk dengan tiga alias sebagai judul kolomnya.
MERGE (d:Siswa {nama: 'Danu'})
MERGE (e:Siswa {nama: 'Eka'})
MERGE (f:Siswa {nama: 'Fitri'})
MERGE (d)-[:SAHABAT]->(e)
MERGE (e)-[:SAHABAT]->(f)
RETURN d.nama AS node_asal, e.nama AS node_tengah, f.nama AS node_tujuan;node_asal, node_tengah, node_tujuan
"Danu", "Eka", "Fitri"Keluaran di atas menampilkan satu baris yang berisi ketiga node menurut arah rantainya. Apabila pernyataan yang sama dijalankan kembali pada basis data yang sudah memuat graf contoh, baris yang dikembalikan tetap sama dan tidak ada node maupun relasi baru yang terbentuk. Perilaku inilah yang dimaksud penyiapan yang idempoten.
Membaca pola dengan MATCH#
Pernyataan MATCH membaca graf dengan mencocokkan pola yang dituliskan. Pola (a:Siswa)-[r:SAHABAT]->(b:Siswa) berarti mencari node berlabel Siswa yang memiliki relasi bertipe SAHABAT menuju node berlabel Siswa lainnya. Tanda panah menunjuk arah pembacaan pola, sehingga relasi yang mengarah sebaliknya tidak ikut tercocokkan. Setiap jalur yang cocok mengembalikan satu baris, sehingga dua relasi pada graf contoh menghasilkan dua baris keluaran. Variabel a, r, dan b menampung setiap bagian pola yang cocok, sedangkan fungsi type() menyebut tipe relasinya, dan klausa ORDER BY di ujung kueri menjaga urutan baris keluaran tetap sama antar eksekusi.
MATCH (a:Siswa)-[r:SAHABAT]->(b:Siswa)
RETURN a.nama AS node_asal, type(r) AS tipe_relasi, b.nama AS node_tujuan
ORDER BY node_asal;node_asal, tipe_relasi, node_tujuan
"Danu", "SAHABAT", "Eka"
"Eka", "SAHABAT", "Fitri"Label dapat dibaca juga sebagai data melalui fungsi labels(). Fungsi itu mengembalikan list karena satu node memang dapat memikul lebih dari satu label sekaligus. Pada keluaran berikut, kolom nama berisi properti biasa, sedangkan kolom label berisi list yang mengumpulkan seluruh label node tersebut, sehingga perbedaan antara properti dan penanda label terlihat pada keluaran yang sama.
MATCH (s:Siswa)
RETURN s.nama AS nama, labels(s) AS label
ORDER BY nama;nama, label
"Danu", ["Siswa"]
"Eka", ["Siswa"]
"Fitri", ["Siswa"]Alasan keempat elemen membentuk satu model#
Node dan properti saja sudah membentuk struktur yang mirip dokumen, tetapi keberhubungan antar entitas belum tersimpan sebagai data. Relasi mengisi bagian itu dengan koneksi eksplisit, sehingga pertanyaan seperti sahabat dari sahabat Danu dijawab dengan pola dua lompatan tanpa perhitungan tambahan. Label memberi kategori yang membuat pola dapat dijangkarkan pada himpunan node yang relevan. Properti pada relasi melengkapi gambaran itu dengan fakta yang melekat pada koneksi itu sendiri, misalnya bobot atau tahun mulai.
Karena keempat elemen digunakan bersama, struktur data dapat mengikuti bentuk persoalannya. Graf yang digambar di papan tulis dapat dituliskan kembali sebagai pola Cypher dengan sedikit penyesuaian, dan setiap bagian pola memiliki padanan langsung pada elemen model. Tidak ada elemen yang berdiri sendiri pada penggunaan nyata, karena satu kueri biasanya memadukan beberapa elemen sekaligus. Perubahan pemodelan pun bergerak dalam kosakata yang sama, yaitu menambah node, label, relasi, atau properti. Kesesuaian itulah yang menjadikan property graph satu model utuh, dan bukan gabungan tabel fakta dengan tabel relasi yang dihitung saat kueri.
Kesalahan umum#
Beberapa kesalahan berikut sering muncul ketika model property graph baru dipraktikkan. Semuanya berakar dari kebiasaan membawa pola pikir tabel atau dokumen ke dalam graf. Setiap butir menyebut penyebabnya beserta perbaikannya.
- Menyimpan koneksi sebagai properti string. Properti bernama sahabat yang berisi teks seperti “Eka, Fitri” tidak dapat dijelajahi oleh pola MATCH, sehingga setiap pertanyaan keberhubungan harus mengurai teks terlebih dahulu. Perbaikannya, ubah setiap pasangan yang terhubung menjadi relasi tersendiri bertipe SAHABAT.
- Mengira relasi dapat dibuat tanpa arah. Setiap relasi Neo4j selalu memiliki node asal dan node tujuan, sehingga arah wajib ditentukan ketika relasi dibuat. Untuk pembacaan, arah boleh diabaikan melalui pola
-[:SAHABAT]-apabila keberhubungan yang dicari memang setara ke dua arah. - Memperlakukan label sebagaimana tabel pada basis data relasional. Label tidak mengikat bentuk node, dan satu node boleh memikul beberapa label sekaligus. Perbaikannya, gunakan label sebagai pengelompokan yang fleksibel, lalu serahkan struktur data kepada properti dan relasi.
Ringkasan#
- Node menyimpan entitas, label mengelompokkan node, relasi menyimpan koneksi berarah bertipe, dan properti menyimpan pasangan kunci-nilai pada node maupun relasi.
- Neo4j menyimpan relasi sebagai rekaman fisik, sehingga pertanyaan keberhubungan dijawab lewat penelusuran pola.
- MERGE berperilaku get-or-create, sehingga penyiapan graf contoh dapat diulang tanpa menimbulkan duplikat.
- MATCH membaca graf dengan menuliskan pola yang dicari, sedangkan
type()danlabels()menampilkan tipe relasi serta label sebagai data.
Referensi#
- Introduction — Cypher Manual, Neo4j — Mengenalkan Cypher sebagai bahasa kueri deklaratif yang memanfaatkan basis data property graph.
- Values and types — Cypher Manual, Neo4j — Menyebut tipe nilai yang boleh digunakan sebagai properti, seperti string, angka, boolean, dan list.
- MERGE — Cypher Manual, Neo4j — Menjelaskan semantik get-or-create yang menjadikan penyiapan data idempoten.