Neo4j - Bahasa kueri Cypher vs Gremlin

102

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.

Rubinsh
sumber
1
Cypher adalah bahasa deklaratif lengkap non-turing. Gremlin adalah pembungkus mewah di atas Neo4j Java API dan sangat penting. Jelas, ada hal-hal yang mungkin dilakukan di gremlin yang tidak bisa Anda lakukan di cypher.
Prakhar Agrawal
1
Apache Spark 3 akan menyertakan Cypher, yang mengatakan banyak hal tentang pandangan mereka tentang itu.
Walker Rowe

Jawaban:

77

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).

ulkas
sumber
2
Ada tutorial online baru yang dimulai di neo4j.org/learn/cypher untuk Anda juga memulai.
Peter Neubauer
3
Saya memiliki pemahaman bahwa Cypher lebih mirip SQL, di mana Anda mengatakan apa yang Anda inginkan, dan cara melakukannya. Dengan GREMLIN, Anda mengeluarkan perintah traversal yang tepat, yang harus dipatuhi.
Stewart
2
Bagi saya, GREMLIN secara signifikan lebih cepat daripada Cypher dalam banyak pertanyaan.
Joan
9
Pada TinkerPop 3.x , GREMLIN memiliki karakteristik imperatif dan deklaratif. Anda dapat menulis traversal Anda untuk menentukan pola traversal yang tepat seperti yang dinyatakan dalam jawaban ini atau Anda dapat menggunakan langkah pencocokan untuk menentukan pola yang Anda cari dan GREMLIN akan menyelesaikannya.
stephen mallette
41

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.

Heinrich
sumber
Saat Anda mengatakan "langsung terhadap Java API", maksud Anda Neo4j tertanam di Java?
Pavel
2
Menggunakan ekstensi server dalam neo4j dipasang sebagai server mandiri.
Heinrich
12
Pembaruan dari 2018 - mengingat berbagai jenis indeks asli dalam versi modern neo4j, jawaban ini secara substansial sudah ketinggalan zaman; neo4j telah menerbitkan angka kinerja
FrobberOfBits
3
"menerapkan algoritme kami secara langsung pada Java API" sebenarnya agak menyesatkan. Jelas, cara tercepat untuk pergi dari titik A ke titik B adalah dengan mengambil jalur terpendek. Itu membutuhkan pengetahuan tambahan, spesifik, informasi. Menuju level rendah akan selalu mengungguli perencana mesin, karena Anda tahu bahwa Anda dapat membuat asumsi yang tidak bisa dilakukan oleh mesin. Namun, Cypher dapat dengan mudah mengungguli algoritme tingkat rendah yang diimplementasikan secara naif, memerlukan lebih sedikit pengetahuan untuk digunakan, dan jauh lebih cepat untuk diterapkan. Terutama karena Cypher menjadi lebih baik dengan setiap rilis Neo4j. (perencana yang lebih cerdas)
Tezra
29

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.

Matt Luongo
sumber
20

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.

Louis-Philippe Huberdeau
sumber
1
Cypher memiliki dukungan untuk memperbarui kueri pada Neo4j 1.7, lihat docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer
3
Perhatikan bahwa antarmuka REST akan ditiadakan di TinkerPop 3. Pengguna diharapkan mengirim string GREMLIN ke GREMLIN Server (yang pada dasarnya adalah Rexster, diganti namanya dan ditingkatkan).
jbmusso
10

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.

Tohotom
sumber
@MattLuongo: 1, saya tidak tahu tentang neo4django, 2, ini tidak berlaku di semua kasus (misalnya bahasanya bukan Python) 3, tidak sama jika Anda menulis kueri secara terprogram sendiri atau Anda menggunakan perpustakaan untuk membuat query secara terprogram untuk Anda. Dalam hal ini neo4django dapat dianggap sebagai solusi alternatif untuk Cypher dan GREMLIN.
Tohotom
3
Oh, tentu saja saya tidak berharap neo4django dapat langsung diterapkan; itu adalah contoh, seperti SQL Alchemy dalam jawaban Anda. Tapi tidak benar bahwa menghasilkan Cypher lebih sulit. Cypher dan Gremlin mengambil pendekatan yang berbeda sebagai bahasa kueri, tetapi saya tidak melihat bagaimana Cypher lebih sulit untuk dibuat secara terprogram ...
Matt Luongo
8

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.

pengguna1302130
sumber
1
neo4j menjadi DB grafik paling populer di dunia, saya pikir mungkin ada alasan mengapa mereka belum mengadopsi gremlin.
Luk Aron
1
karena Anda tidak membagikan apa alasannya, saya tidak melihat nilai apa pun dalam komentar Anda
pengguna1302130
4

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.

Chandan Sharma
sumber
3

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.

Singaravelan
sumber
2

Jawaban panjang singkat: Gunakan cypher untuk kueri dan gremlin untuk traversal. Anda akan melihat sendiri waktu responsnya.

Sagar Sarin
sumber
bagaimana cara melakukannya ?
Optimus