Neo4j menyimpan node dan properti tanpa menuntut definisi skema di muka, sehingga struktur graf dapat tumbuh mengikuti data. Topik ini membahas makna sifat schema-optional, disiplin kunci alami pada data graf, serta constraint (batasan) sebagai jaring pengaman yang ditegakkan mesin basis data pada setiap penulisan. Lingkupnya mencakup constraint keunikan dengan IS UNIQUE, pembuatan yang aman dijalankan ulang dengan IF NOT EXISTS, constraint keberadaan dengan IS NOT NULL, dan inventaris skema melalui SHOW CONSTRAINTS serta SHOW INDEXES. Seluruh contoh dijalankan pada server Neo4j 2026.10 dengan data perpustakaan fiktif berisi node :Buku, :Anggota, dan :Penulis yang telah dimuat. Setelah membacanya, kunci alami setiap label dapat dilindungi constraint dan inventaris skema dapat diperiksa kapan pun.
Tanpa skema berarti tanpa migrasi tabel#
Pada basis data relasional, setiap atribut baru menuntut perubahan skema seperti ALTER TABLE beserta prosedur migrasinya. Neo4j tidak membebankan langkah tersebut. Label tidak perlu dideklarasikan lebih dahulu, dan setiap node membawa himpunan propertinya sendiri, sehingga dua node berlabel sama boleh memiliki properti yang berbeda. Sifat inilah yang disebut schema-optional, yakni mesin tidak menuntut skema di muka, dan bukan berarti desain tidak diperlukan.
Perilaku tersebut terlihat dari perubahan kecil berikut. Properti penerbit ditambahkan hanya pada node Catatan Pengelana, tanpa pernyataan migrasi apa pun.
MATCH (b:Buku {isbn: "978-0-00-000001-3"})
SET b.penerbit = "Pustaka Mitra"
RETURN b.judul AS judul, b.penerbit AS penerbitjudul, penerbit
"Catatan Pengelana", "Pustaka Mitra"Kueri pengecekan atas seluruh :Buku memperlihatkan konsekuensinya. Nilai penerbit hanya terisi pada satu node, sedangkan node lain tetap tersimpan tanpa properti tersebut.
MATCH (b:Buku)
RETURN b.judul AS judul, b.penerbit AS penerbit
ORDER BY juduljudul, penerbit
"Anak Muara", NULL
"Catatan Pengelana", "Pustaka Mitra"
"Jejak Basirah", NULL
"Peta Angin", NULL
"Rumah Pena", NULLEmpat baris menampilkan NULL pada kolom penerbit karena properti itu tidak melekat pada node terkait, tanpa satu pun pesan error. Kebebasan seperti ini mudah disalahgunakan apabila tidak disertai disiplin, misalnya node duplikat yang menumpuk atau penamaan properti yang melebar. Karena itu, graf tanpa skema pada praktiknya tetap dijalankan dengan kesepakatan penamaan yang konsisten serta kunci yang dipilih secara sadar.
Kunci alami dan constraint keunikan#
Kunci alami (natural key) adalah properti yang nilainya membedakan satu node dari node lain pada label yang sama, misalnya isbn pada :Buku dan nomorAnggota pada :Anggota. Tanpa penegakan dari mesin basis data, keunikan hanya dijaga oleh kode aplikasi, dan dua penulisan yang terjadi hampir bersamaan dapat lolos dengan nilai yang sama. Constraint menutup celah itu karena aturannya dinyatakan sekali, lalu ditegakkan mesin pada setiap penulisan data. Bentuknya adalah pernyataan CREATE CONSTRAINT yang menunjuk label dan properti yang dijaga.
Pernyataan berikut memasang constraint keunikan pada nomorAnggota, lalu menampilkan daftar constraint yang terpasang. Nama constraint diberi akhiran _m1 sebagai penanda modul agar tidak bertabrakan dengan constraint lain pada instance yang sama.
CREATE CONSTRAINT anggota_nomor_m1 IF NOT EXISTS
FOR (a:Anggota) REQUIRE a.nomorAnggota IS UNIQUE;
SHOW CONSTRAINTS YIELD name
RETURN name ORDER BY namename
"anggota_nomor_m1"
"buku_isbn_unik"Penegakan terjadi saat penulisan, bukan saat pembacaan. Pernyataan CREATE berikut mencoba menambahkan anggota dengan nomor yang sudah digunakan node Sari.
CREATE (a:Anggota {nomorAnggota: 1, nama: "Sari Salinan"})22N80: data exception - index entry conflict. Index entry conflict: Node(8) already exists with label `Anggota` and property `nomorAnggota` = 1.
22N79: data exception - property uniqueness constraint violated. Property uniqueness constraint violated: Node(8) already exists with label `Anggota` and property `nomorAnggota` = 1.Pesan error menyebut Node(8), yaitu identitas internal node pemilik nilai 1, dan penulisan ditolak sehingga graf tidak bertambah. Aturan keunikan hanya menguji node yang membawa properti yang dijaga, sehingga node :Anggota tanpa nomorAnggota tetap dapat hidup berdampingan, sebagaimana ditetapkan dokumentasi Neo4j. Kombinasi constraint keunikan dengan MERGE, pola get-or-create yang mencocokkan node berdasarkan properti kunci, menjadi paling andal apabila properti itu dilindungi. Perlakuan lengkapnya ditangani modul Fundamental Cypher.
Pembuatan constraint yang aman dijalankan ulang#
Skrip penyiapan yang dijalankan berulang membutuhkan pernyataan yang idempoten, yakni menghasilkan keadaan akhir yang sama tanpa efek tambahan. Cypher menyediakan klausa IF NOT EXISTS untuk keperluan itu. Pernyataan dengan klausa ini diperiksa terhadap dua kemungkinan, yaitu constraint dengan nama yang sama dan constraint dengan jenis serta skema yang setara meskipun namanya berbeda. Apabila salah satu ditemukan, tidak ada constraint baru yang dibuat dan tidak ada pesan error yang muncul.
Contoh berikut mencoba membuat constraint bernama buku_isbn_m1 pada skema (:Buku) isbn. Skema itu sudah dijaga constraint setara bernama buku_isbn_unik, sehingga pembuatan dilewati. Constraint dengan nama baru tersebut tidak pernah dibuat, dan daftar berikut membuktikannya.
CREATE CONSTRAINT buku_isbn_m1 IF NOT EXISTS
FOR (b:Buku) REQUIRE b.isbn IS UNIQUE;
SHOW CONSTRAINTS YIELD name
RETURN name ORDER BY namename
"anggota_nomor_m1"
"buku_isbn_unik"Tanpa IF NOT EXISTS, pernyataan yang sama ditolak meskipun yang diperiksa hanyalah kesetaraan jenis dan skema. Pesan error menyebutkan constraint pembandingnya secara eksplisit, lengkap dengan nama buku_isbn_unik.
CREATE CONSTRAINT buku_isbn_m1
FOR (b:Buku) REQUIRE b.isbn IS UNIQUE22N65: data exception - equivalent constraint already exists. An equivalent constraint already exists: 'Constraint( id=4, name='buku_isbn_unik', type='NODE PROPERTY UNIQUENESS', schema=(:Buku {isbn}), ownedIndex=3, graphTypeDependence='UNDESIGNATED' )'Klausa IF NOT EXISTS dengan demikian menjadi baku pada skrip penyiapan, sedangkan penolakan tanpa klausa itu berguna untuk memastikan skema yang diharapkan memang sudah terpasang.
Constraint keberadaan dengan IS NOT NULL#
Secara default, properti pada node bersifat opsional. Node boleh tidak membawanya, dan pembacaan atas properti yang absen menghasilkan NULL, sebagaimana kolom penerbit pada contoh awal. Constraint keberadaan (property existence constraint) membalik kebebasan itu menjadi kewajiban, yaitu setiap node berlabel tertentu wajib membawa properti yang disebut, dan penulisan yang melanggarnya ditolak. Sintaksnya menggunakan predikat IS NOT NULL, dan sifatnya menyerupai kolom NOT NULL pada basis data relasional.
Percobaan berikut mencoba mewajibkan properti judul pada seluruh node :Buku. Hasilnya ditolak pada edisi Community dengan pesan error berikut.
CREATE CONSTRAINT buku_judul_ada_m1 IF NOT EXISTS
FOR (b:Buku) REQUIRE b.judul IS NOT NULL51N27: system configuration or operation exception - not supported in this edition. Property existence constraint is not supported in community edition.
50N11: general processing exception - constraint creation failed. Unable to create 'Constraint( type='NODE PROPERTY EXISTENCE', schema=(:Buku {judul}), graphTypeDependence='INDEPENDENT' )'.Pada edisi Community, constraint keberadaan tidak didukung, dan pesan error menyebut ketidakdukungan itu secara eksplisit. Pada edisi Enterprise, pernyataan yang sama diterima, dan penulisan node :Buku tanpa judul kemudian ditolak. Penjaminan keberadaan properti pada edisi Community dengan demikian berpindah ke lapisan aplikasi atau proses pemeriksaan berkala. Constraint keunikan tetap menjadi jaring pengaman yang tersedia penuh pada kedua edisi, sehingga menjadi pilihan pertama pada penyiapan contoh ini.
Inventaris constraint dan indeks#
Neo4j menyimpan objek skema yang sudah terpasang sebagai bagian dari basis data, dan perintah SHOW CONSTRAINTS serta SHOW INDEXES menampilkannya sebagai daftar yang dapat dikueri. Keluaran default keduanya memuat banyak kolom teknis, sehingga klausa YIELD digunakan untuk memilih kolom tertentu saja. Kombinasi YIELD, RETURN, dan ORDER BY menjaga keluaran ringkas sekaligus urutan barisnya stabil.
SHOW CONSTRAINTS YIELD name, type
RETURN name, type ORDER BY namename, type
"anggota_nomor_m1", "NODE_PROPERTY_UNIQUENESS"
"buku_isbn_unik", "NODE_PROPERTY_UNIQUENESS"Tipe NODE_PROPERTY_UNIQUENESS menandai constraint keunikan pada properti node. Constraint keunikan didukung indeks rentang (range index) dengan nama yang sama, sehingga namanya tampil pula pada daftar indeks berikut.
SHOW INDEXES YIELD name, type
RETURN name, type ORDER BY namename, type
"anggota_nomor_m1", "RANGE"
"buku_isbn_unik", "RANGE"
"index_1b9dcc97", "LOOKUP"
"index_460996c0", "LOOKUP"Dua indeks LOOKUP adalah token lookup index yang dibuat secara bawaan oleh Neo4j saat basis data pertama kali dibuat, yaitu satu indeks untuk label node dan satu indeks untuk tipe relasi. Isi jaring pengaman skema dengan demikian diketahui tanpa menebaknya dari kode aplikasi.
Kesalahan umum#
Empat kesalahan berikut paling sering muncul saat topik ini dipraktikkan, beserta penyebab dan perbaikannya.
- Menganggap tanpa skema berarti bebas tanpa aturan. Node duplikat dan penamaan properti yang melebar baru terasa saat data sudah banyak, dan pembersihannya menuntut pemindaian menyeluruh. Perbaikannya adalah menetapkan kunci alami per label dan memasang constraint keunikan sejak data masih kecil.
- Menulis pernyataan constraint tanpa
IF NOT EXISTSpada skrip yang dijalankan ulang. Eksekusi kedua ditolak dengan pesanequivalent constraint already exists, sebagaimana contoh sebelumnya. Perbaikannya adalah menambahkanIF NOT EXISTSagar pernyataan bersifat idempoten. - Memasang constraint pada data yang sudah ganda. Pembuatan constraint keunikan diperiksa terhadap data yang ada, sehingga pernyataannya gagal apabila masih ada pasangan node dengan nilai kunci sama. Perbaikannya adalah mencari duplikat dengan kueri agregasi, membersihkannya, lalu menjalankan pembuatan constraint lagi.
- Menganggap semua jenis constraint tersedia pada semua edisi. Constraint keberadaan ditolak pada edisi Community dengan pesan
not supported in community edition, dan pesan ini sering dianggap kekeliruan sintaks. Perbaikannya adalah memindahkan penjaminan keberadaan properti ke lapisan aplikasi pada edisi Community.
Ringkasan#
- Neo4j bersifat schema-optional, yaitu label dan properti tidak dideklarasikan di muka sehingga graf tumbuh tanpa migrasi tabel, tetapi disiplin penamaan dan kunci tetap diperlukan.
- Constraint keunikan dengan
IS UNIQUEmenegakkan kunci alami pada setiap penulisan dan hanya menguji node yang membawa properti yang dijaga. - Klausa
IF NOT EXISTSmembuat pernyataan constraint aman dijalankan ulang karena pemeriksaannya mencakup nama maupun jenis dan skema setara, sedangkan constraint keberadaanIS NOT NULLhanya tersedia pada edisi Enterprise. - Inventaris skema diperiksa melalui
SHOW CONSTRAINTSdanSHOW INDEXES, denganYIELDuntuk memilih kolom yang ringkas.
Referensi#
- Create constraints — Neo4j
— Sintaks
CREATE CONSTRAINT, perilakuIF NOT EXISTS, jangkauan edisi untuk setiap jenis constraint, dan indeks pendukung keunikan. - List constraints — Neo4j
— Perintah
SHOW CONSTRAINTSbeserta pemilihan kolom melaluiYIELD. - List indexes — Neo4j
— Perintah
SHOW INDEXESuntuk inventaris indeks beserta penyaringan kolomnya.