Kekuatan utama model graf terletak pada kemampuannya menyimpan fakta di dalam relasi, bukan hanya menyimpan keterhubungannya. Topik ini membahas tiga keluarga fakta yang paling alami ditempatkan pada relasi, yaitu bobot, peran, dan penanda waktu, beserta kueri penyaringan yang hanya mungkin karena fakta itu ada di relasi. Contohnya memperkaya graf piket modul ini dengan relasi keakraban antar orang, membaca peran pada dataset film bawaan, dan menyaring peristiwa piket menurut rentang tanggalnya. Setelah membacanya, keterangan kapan dan bagaimana dua node terhubung dapat ditempatkan pada relasinya, dan kueri bertanggal, berkualitas hubungan, serta berjumlah interaksi dapat disusun dengan pola MATCH sederhana.
Keterangan peristiwa yang hidup pada relasi#
Relasi pada model property graph (graf berproperti) bukan sekadar garis penghubung. Relasi adalah objek data yang dapat membawa properti sendiri, sebagaimana node membawa propertinya. Properti node menyatakan keterangan milik satu entitas, sedangkan properti relasi menyatakan keterangan milik satu peristiwa keterhubungan, yaitu kapan dan bagaimana dua node terhubung. Karena satu pasang node dapat dihubungkan oleh banyak relasi, banyak peristiwa dapat tersimpan berdampingan tanpa saling menimpa.
Fakta peristiwa paling alami hidup di relasi karena relasi mewakili satu peristiwa tunggal secara utuh. Peminjaman buku di perpustakaan kelas terjadi pada satu tanggal tertentu antara satu anggota dan satu buku. Pengiriman paket bergerak pada satu waktu antara satu gudang dan satu tujuan. Kolaborasi film menghubungkan satu orang dan satu film dalam satu kedudukan tertentu. Setiap peristiwa itu satu relasi, dan seluruh keterangannya menempel pada relasi tersebut.
Tiga keluarga fakta relasi muncul berulang di banyak domain dan layak dikenali sebagai pola pemodelan.
| Keluarga fakta | Menyatakan | Contoh |
|---|---|---|
| Bobot | Seberapa kuat atau seberapa mahal hubungan | Keakraban persahabatan, jarak antar simpul jaringan |
| Peran | Bagaimana dua node terhubung | Tokoh yang diperankan aktor, kedudukan penulis pada film |
| Penanda waktu | Kapan peristiwa terjadi | Tanggal peminjaman, tanggal kirim, tanggal piket |
Bobot (weight) dan penanda waktu (timestamp) dipraktikkan pada graf piket modul ini, sedangkan peran (role) dibaca dari dataset film yang dimuat sejak modul pembuka.
Bobot: kekuatan hubungan dalam angka#
Bobot adalah properti numerik pada relasi yang menyatakan kekuatan atau besaran hubungannya. Jaringan jalan menyimpan jarak antar simpul sebagai bobot, jaringan komputer menyimpan kapasitas tautan, dan jaringan sosial menyimpan kedekatan antar orang. Nilainya juga dapat menyatakan biaya, misalnya waktu tempuh.
Graf piket diperkaya dengan relasi :SAHABAT_DEKAT antar node :Orang. Properti keakraban bertipe bilangan bulat dengan rentang 1 sampai 3 menyatakan kedekatan satu pasangan sahabat. Skrip berikut memasang tiga relasi dengan MERGE sehingga aman dijalankan berulang, kemudian membacanya kembali terurut dari keakraban tertinggi.
MERGE (a:Orang {nama: "Doni"})-[r:SAHABAT_DEKAT]->(b:Orang {nama: "Endang"})
SET r.keakraban = 3;
MERGE (a:Orang {nama: "Endang"})-[r:SAHABAT_DEKAT]->(b:Orang {nama: "Fita"})
SET r.keakraban = 2;
MERGE (a:Orang {nama: "Doni"})-[r:SAHABAT_DEKAT]->(b:Orang {nama: "Fita"})
SET r.keakraban = 1;
MATCH (a:Orang)-[r:SAHABAT_DEKAT]->(b:Orang)
RETURN a.nama AS dari, r.keakraban AS keakraban, b.nama AS ke
ORDER BY keakraban DESC, dari;dari, keakraban, ke
"Doni", 3, "Endang"
"Endang", 2, "Fita"
"Doni", 1, "Fita"Tiga relasi memuat tiga pasangan dengan tiga tingkat keakraban. Satu relasi per pasangan sudah cukup karena keakraban tidak memiliki peristiwa maupun keterhubungan sendiri, sehingga pola node antara tidak diperlukan untuknya. Arah pemasangan dipilih sekali ketika data ditulis, sedangkan pembacaannya dapat dilakukan dua arah dengan pola tanpa arah.
Peran: bagaimana dua node terhubung#
Peran menyatakan bagaimana keterhubungan itu terjadi. Dua orang yang sama dapat terhubung ke satu film dalam kedudukan berbeda, misalnya sebagai aktor, sebagai sutradara, atau sebagai penulis skenario. Perbedaan kedudukan semacam ini dinyatakan dengan tipe relasi yang berbeda, sedangkan rinciannya, yaitu nama tokoh yang diperankan, menjadi properti relasi.
Dataset film bawaan Neo4j memperagakan hal itu. Relasi :ACTED_IN dari node :Person menuju node :Movie membawa properti roles berupa list nama tokoh, sedangkan relasi :DIRECTED pada orang yang sama tidak membawa properti itu. Kueri berikut membaca dua jenis kolaborasi Tom Hanks pada dua film beserta kolom perannya.
MATCH (p:Person {name: "Tom Hanks"})-[r:ACTED_IN|DIRECTED]->(m:Movie)
WHERE m.title IN ["That Thing You Do", "The Polar Express"]
RETURN m.title AS film, type(r) AS kolaborasi, r.roles AS peran
ORDER BY film, kolaborasi;film, kolaborasi, peran
"That Thing You Do", "ACTED_IN", ["Mr. White"]
"That Thing You Do", "DIRECTED", NULL
"The Polar Express", "ACTED_IN", ["Hero Boy", "Father", "Conductor", "Hobo", "Scrooge", "Santa Claus"]Baris DIRECTED menampilkan NULL pada kolom peran karena relasi itu tidak membawa properti roles, dan keadaan demikian wajar pada model tanpa skema. Film yang sama muncul dua kali karena orang yang sama terhubung ke film itu melalui dua relasi berbeda. Nilai peran pada The Polar Express berupa enam tokoh dalam satu list, yaitu bentuk yang tepat apabila satu relasi membawa lebih dari satu nama.
Penanda waktu: kapan peristiwa terjadi#
Penanda waktu menyatakan kapan sebuah peristiwa relasi terjadi. Model piket modul ini sudah memuat penanda waktu sejak peristiwa piket dipindahkan ke relasi :MELAKSANAKAN, yaitu properti tanggal bertipe date pada setiap relasinya. Tipe date menyimpan tanggal sebagai nilai tanggal sungguhan, bukan string, sehingga dua tanggal dapat dibandingkan dan dapat disaring menurut rentangnya di dalam basis data. Ranah lain menggunakan pola yang sama, misalnya tanggal pinjam pada peminjaman buku atau tanggal kirim pada pengiriman paket.
Kueri berikut menyaring peristiwa piket pada rentang tanggal 3 sampai 5 November 2026. Perbandingan rentangnya ditulis sama seperti penyaringan angka biasa.
MATCH (o:Orang)-[r:MELAKSANAKAN]->(t:Tugas)
WHERE r.tanggal >= date("2026-11-03") AND r.tanggal <= date("2026-11-05")
RETURN o.nama AS orang, r.tanggal AS tanggal, t.nama AS tugas
ORDER BY r.tanggal, orang;orang, tanggal, tugas
"Endang", 2026-11-03, "Menyapu lantai"
"Doni", 2026-11-04, "Merapikan perpustakaan"
"Fita", 2026-11-04, "Merapikan perpustakaan"
"Endang", 2026-11-05, "Menyiram tanaman"Rentang tanggal adalah saringan pertama yang lahir dari fakta relasi. Saringan kedua menghitung jumlah interaksi per orang di dalam basis data karena setiap peristiwa sudah menjadi relasi tersendiri.
MATCH (o:Orang)-[r:MELAKSANAKAN]->(:Tugas)
RETURN o.nama AS orang, count(r) AS peristiwa
ORDER BY peristiwa DESC, orang;orang, peristiwa
"Doni", 2
"Endang", 2
"Fita", 1Hasilnya menunjukkan Doni dan Endang masing-masing memiliki dua peristiwa, sedangkan Fita satu. Penghitungan semacam ini bertumpu pada fakta yang sudah tersimpan di relasi, tanpa struktur tambahan. Bentuk kuerinya pun sama dengan penghitungan pada pola MATCH biasa.
Saringan kualitas hubungan dan bahan algoritma#
Saringan ketiga bekerja pada bobot, yaitu memilah hubungan menurut kualitasnya. Kueri berikut mencari pasangan dengan keakraban minimal 2 dan membacanya dengan pola tanpa arah, sehingga arah pemasangan relasi tidak perlu diketahui lebih dahulu.
MATCH (a:Orang)-[r:SAHABAT_DEKAT]-(b:Orang)
WHERE r.keakraban >= 2
RETURN a.nama AS dari, r.keakraban AS keakraban, b.nama AS ke
ORDER BY keakraban DESC, dari;dari, keakraban, ke
"Doni", 3, "Endang"
"Endang", 3, "Doni"
"Endang", 2, "Fita"
"Fita", 2, "Endang"Pola tanpa arah membaca setiap relasi dari dua arah, sehingga setiap pasangan yang lolos saringan muncul dua kali dalam keluaran. Tiga saringan di atas, yaitu rentang tanggal, jumlah interaksi, dan kualitas hubungan, dimungkinkan semata-mata karena keterangan itu tersimpan pada relasi :MELAKSANAKAN dan :SAHABAT_DEKAT. Apabila tanggal dan keakraban dipindahkan ke tempat lain, pola MATCH yang sama kehilangan bahan penyaringnya.
Bobot pada relasi juga menjadi bahan bagi penelusuran berbobot (weighted traversal), yaitu penelusuran yang menimbang angka pada setiap relasi yang dilaluinya. Algoritma pada pustaka Graph Data Science (GDS) membaca properti relasi sebagai bobot langkah, misalnya Dijkstra yang mencari jalur termurah menurut properti yang ditunjuk. Modul Algoritma graf dengan GDS membahas pustaka itu secara utuh, sedangkan pekerjaan pemodelannya sudah selesai di sini, yaitu memastikan angka kekuatan hubungan hidup pada relasinya.
Kesalahan umum#
Tiga kesalahan berikut sering muncul ketika fakta peristiwa tidak ditempatkan pada relasinya, dan masing-masing dapat dicegah pada saat pemodelan.
- Menempatkan peristiwa pada node ujungnya. Tanggal peminjaman yang diletakkan pada node buku tertimpa oleh peminjaman berikutnya karena satu properti hanya menampung satu nilai, sehingga riwayat peminjaman tidak dapat dihitung. Pindahkan peristiwa itu menjadi relasi antara peminjam dan buku, lengkap dengan properti waktunya.
- Menyimpan tanggal sebagai string bebas. Nilai seperti “3 November 2026” tidak dapat dibandingkan menurut rentang oleh Neo4j, sehingga penyaringan tanggal harus dilakukan di luar basis data. Gunakan tipe date dengan literal “yyyy-MM-dd” sebagaimana digunakan properti
tanggalpada relasi:MELAKSANAKAN. - Mencampur arah makna bobot. Pada keakraban, angka besar berarti lebih dekat, sedangkan algoritma berbasis biaya seperti Dijkstra membaca angka kecil sebagai langkah yang lebih murah, sehingga penelusuran yang menggunakan properti tanpa konversi menghasilkan jalur yang terbalik. Tetapkan konvensi makna angka pada setiap properti bobot dan konversikan nilainya sebelum digunakan sebagai biaya penelusuran.
Ringkasan#
- Relasi membawa properti sendiri, sehingga keterangan peristiwa keterhubungan, yaitu kapan dan bagaimana dua node terhubung, hidup secara alami pada relasinya.
- Bobot menyatakan kekuatan hubungan dalam angka, peran menyatakan bentuk keterhubungan, dan penanda waktu menyatakan kapan peristiwa terjadi.
- Saringan rentang tanggal, jumlah interaksi, dan kualitas hubungan pada graf piket dimungkinkan karena fakta itu tersimpan pada relasi
:MELAKSANAKANdan:SAHABAT_DEKAT. - Properti bobot pada relasi menjadi bahan penelusuran berbobot yang dibaca algoritma pada pustaka GDS.
Referensi#
- What is graph data modeling? — Neo4j Docs — Panduan pemodelan data Neo4j yang membahas penempatan fakta pada node, relasi, dan properti relasinya.
- Temporal values — Neo4j Docs — Tipe temporal Cypher dari DATE hingga ZONED DATETIME beserta pembuatan nilai date dari literal string.
- Dijkstra Source-Target Shortest Path — Neo4j Docs — Algoritma jalur terpendek berbobot pada pustaka GDS yang membaca bobot dari properti relasi.