Saya mulai mengembangkan dengan Neo4j menggunakan REST API. Saya melihat bahwa ada dua opsi untuk melakukan kueri kompleks - Cypher (bahasa kueri Neo4j) dan Gremlin (bahasa kueri / traversal grafik tujuan umum).
Inilah yang ingin saya ketahui - adakah kueri atau operasi yang dapat dilakukan dengan menggunakan GREMLIN dan tidak dapat dilakukan dengan Cypher? atau sebaliknya?
Cypher tampaknya jauh lebih jelas bagi saya daripada GREMLIN, dan secara umum tampaknya orang-orang di Neo4j mendukung Cypher. Tetapi - jika Cypher terbatas dibandingkan dengan GREMLIN - saya benar-benar ingin mengetahuinya sebelumnya.
neo4j
graph-databases
cypher
gremlin
Rubinsh
sumber
sumber
Jawaban:
Untuk pertanyaan umum, Cypher sudah cukup dan mungkin lebih cepat. Keuntungan dari Gremlin dibandingkan Cypher adalah ketika Anda melakukan traverse tingkat tinggi. Di Gremlin, Anda dapat lebih menentukan pola traversal yang tepat (atau algoritme Anda sendiri) sedangkan di Cypher mesin mencoba menemukan solusi traversal terbaik itu sendiri.
Saya pribadi menggunakan Cypher karena kesederhanaannya dan, hingga saat ini, saya belum pernah mengalami situasi di mana saya harus menggunakan GREMLIN (kecuali bekerja dengan fungsi impor / ekspor GREMLIN graphML). Saya berharap, bagaimanapun, bahwa bahkan jika saya perlu menggunakan GREMLIN, saya akan melakukannya untuk permintaan tertentu yang akan saya temukan di internet dan tidak akan pernah kembali lagi.
Anda selalu dapat mempelajari bahasa Cypher dengan sangat cepat (dalam beberapa hari) dan kemudian melanjutkan dengan GREMLIN umum (jangka panjang).
sumber
Kami harus melintasi ribuan node dalam kueri kami. Cypher lambat. Tim Neo4j memberi tahu kami bahwa mengimplementasikan algoritme kami secara langsung pada Java API akan 100-200 kali lebih cepat. Kami melakukannya dan dengan mudah mendapatkan faktor 60 darinya. Sampai sekarang kami tidak memiliki kueri Cypher tunggal di sistem kami karena kurangnya kepercayaan. Kueri Cypher mudah mudah untuk ditulis di Java, kueri kompleks tidak akan berfungsi. Masalahnya adalah ketika Anda memiliki beberapa kondisi dalam kueri Anda, tidak ada cara di Cypher untuk mengetahui di urutan mana untuk melakukan traversal. Jadi, kueri sandi Anda mungkin menjadi liar ke grafik dengan arah yang salah terlebih dahulu. Saya belum berbuat banyak dengan GREMLIN, tapi saya bisa membayangkan Anda mendapatkan lebih banyak kendali eksekusi dengan GREMLIN.
sumber
Upaya tim Neo4j pada Cypher sangat mengesankan, dan itu berjalan jauh. Tim Neo biasanya mendorong orang ke arahnya, dan saat Cypher semakin dewasa, GREMLIN mungkin akan kurang diperhatikan. Cypher adalah pilihan jangka panjang yang bagus.
Yang mengatakan- Gremlin adalah DSL Groovy. Menggunakannya melalui titik akhir REST Neo4j memungkinkan akses penuh tanpa batas ke API Java Neo4j yang mendasarinya. Itu (dan plugin skrip lain dalam kategori yang sama) tidak dapat dicocokkan dalam hal daya tingkat rendah. Plus, Anda dapat menjalankan Cypher dari dalam plugin Gremlin .
Either way, ada jalur peningkatan yang masuk akal di mana Anda mempelajari keduanya. Saya akan memilih salah satu yang membuat Anda bangun dan berlari lebih cepat. Dalam proyek saya , saya biasanya menggunakan Gremlin dan kemudian menelepon Cypher (dari dalam GREMLIN atau bukan) ketika saya membutuhkan hasil tabel atau pencocokan pola ekspresif - keduanya menyusahkan di Gremlin DSL.
sumber
Saya awalnya mulai menggunakan GREMLIN. Namun, pada saat itu, antarmuka REST agak tidak stabil, jadi saya beralih ke Cypher. Ini memiliki dukungan yang jauh lebih baik untuk Neo4j. Namun, ada beberapa jenis pertanyaan yang tidak mungkin dilakukan dengan Cypher, atau di mana Cypher tidak dapat mengoptimalkan seperti yang Anda bisa dengan Gremlin.
Gremlin dibangun di atas Groovy, jadi Anda benar-benar dapat menggunakannya sebagai cara umum untuk membuat Neo4j menjalankan kode 'Java' dan melakukan berbagai tugas dari server, tanpa harus mengambil klik HTTP dari antarmuka REST. Antara lain, GREMLIN memungkinkan Anda mengubah data.
Namun, ketika yang saya inginkan hanyalah meminta data, saya menggunakan Cypher karena lebih mudah dibaca dan dipelihara. Gremlin adalah kemunduran ketika suatu batasan tercapai.
sumber
Kueri GREMLIN dapat dibuat secara terprogram. (Lihat http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects untuk mengetahui apa yang saya maksud.) Ini tampaknya sedikit lebih rumit dengan Cypher.
sumber
Cypher hanya berfungsi untuk kueri sederhana. Ketika Anda mulai memasukkan logika bisnis yang kompleks ke dalam grafik traversal Anda, itu menjadi sangat lambat atau berhenti bekerja sama sekali.
Neo4j jelas tahu bahwa Cypher tidak pemotongan itu, karena mereka juga menyediakan prosedur APOC yang meliputi jalur expander alternatif (
apoc.path.expand
,apoc.path.subgraphAll
, dll).GREMLIN lebih sulit dipelajari tetapi lebih kuat dari Cypher dan APOC. Anda dapat menerapkan logika apa pun yang dapat Anda pikirkan di GREMLIN.
Saya benar-benar berharap Neo4J dikirimkan dengan server GREMLIN yang dapat diubah (dari membaca sekitar, ini dulu masalahnya). Anda bisa membuat GREMLIN melawan instance Neo4J langsung, tetapi ini melibatkan lompatan melalui banyak rintangan. Harapan saya adalah karena pesaing Neo4J mengizinkan GREMLIN sebagai opsi, Neo4J akan mengikutinya.
sumber
Cypher adalah bahasa kueri deklaratif untuk membuat kueri database grafik. Istilah deklaratif penting karena merupakan cara pemrograman yang berbeda dari paradigma pemrograman seperti imperatif.
Dalam bahasa kueri deklaratif seperti Cypher dan SQL, kami memberi tahu mesin yang mendasari data apa yang ingin kami ambil dan kami tidak menentukan cara pengambilan data yang kami inginkan.
Di Cypher, pengguna mendefinisikan sub grafik yang menarik di klausa MATCH. Kemudian mesin yang mendasari menjalankan algoritma pencocokan pola untuk mencari kejadian serupa dari sub grafik dalam database grafik.
Gremlin adalah fitur deklaratif dan imperatif. Ini adalah bahasa traversal grafik di mana pengguna harus memberikan instruksi eksplisit tentang bagaimana grafik akan dinavigasi.
Perbedaan antara bahasa-bahasa ini dalam kasus ini adalah bahwa di Cypher kita dapat menggunakan operator bintang Kleene untuk menemukan jalur antara dua node yang diberikan dalam database grafik. Namun dalam GREMLIN kita harus secara eksplisit mendefinisikan semua jalur tersebut. Tapi kita bisa menggunakan operator berulang di GREMLIN untuk menemukan beberapa kejadian jalur eksplisit seperti itu dalam database grafik. Namun, melakukan iterasi pada struktur eksplisit tidak mungkin dilakukan di Cypher.
sumber
Jika Anda menggunakan gremlin, maka ini memungkinkan Anda untuk bermigrasi ke database grafik yang berbeda, Karena sebagian besar database grafik mendukung gremlin traversal, Sebaiknya pilih gremlin.
sumber
Jawaban panjang singkat: Gunakan cypher untuk kueri dan gremlin untuk traversal. Anda akan melihat sendiri waktu responsnya.
sumber