Neo4j - Cypher vs Gremlin sorgu dili


103

REST API kullanarak Neo4j ile geliştirmeye başlıyorum. Karmaşık sorguları gerçekleştirmek için iki seçenek olduğunu gördüm - Cypher (Neo4j'nin sorgu dili) ve Gremlin (genel amaçlı grafik sorgusu / geçiş dili).

İşte bilmek istediğim şey - Gremlin kullanılarak yapılabilen ve Cypher ile yapılamayan herhangi bir sorgu veya işlem var mı? ya da tam tersi?

Cypher bana Gremlin'den çok daha net görünüyor ve genel olarak Neo4j'deki adamlar Cypher ile gidiyor gibi görünüyor. Ama Cypher, Gremlin'e kıyasla sınırlıysa, bunu önceden bilmek isterim.


2
Cypher, tam anlamıyla açıklayıcı bir dildir. Gremlin, Neo4j Java API üzerinde süslü bir paketleyicidir ve zorunludur. Açıkçası, gremlin'de cypher'da yapamayacağınız şeyler mümkün.
Prakhar Agrawal

1
Apache Spark 3, bu konudaki görüşleri hakkında çok şey söyleyen Cypher'ı içerecek.
Walker Rowe

Yanıtlar:


80

Genel sorgulama için Cypher yeterlidir ve muhtemelen daha hızlıdır. Gremlin'in Cypher'a göre avantajı, yüksek seviye geçişe girmenizdir. Gremlin'de, tam geçiş modelini (veya kendi algoritmalarınızı) daha iyi tanımlayabilirsiniz, oysa Cypher'da motor en iyi çaprazlama çözümünü kendisi bulmaya çalışır.

Ben Cypher'ı basitliğinden dolayı kullanıyorum ve bugüne kadar Gremlin'i kullanmak zorunda olduğum herhangi bir durumla karşılaşmadım (Gremlin graphML içe / dışa aktarma işlevleriyle çalışmak dışında). Bununla birlikte, Gremlin'i kullanmam gerekse bile, bunu internette bulacağım ve bir daha asla geri dönmeyeceğim belirli bir sorgu için yapacağımı umuyorum.

Cypher'ı her zaman çok hızlı öğrenebilir (günler içinde) ve sonra (uzun vadeli) general Gremlin ile devam edebilirsiniz.


2
Neo4j.org/learn/cypher adresinde başlayan yeni bir çevrimiçi eğitim de var.
Peter Neubauer

3
Cypher'ın daha çok SQL'e benzediğini anladım, ona ne istediğinizi söylüyorsunuz ve nasıl yapılacağını çözüyor. Gremlin ile, uyması gereken kesin geçiş komutları verirsiniz.
Stewart

2
Benim için Gremlin, sorguların çoğunda Cypher'dan önemli ölçüde daha hızlıydı.
Joan

9
TinkerPop 3.x itibariyle , Gremlin hem zorunlu hem de bildirimsel özelliklere sahiptir. Bu cevapta belirtildiği gibi tam bir geçiş modeli tanımlamak için çapraz geçişlerinizi yazabilir veya aradığınız modeli basitçe tanımlamak için eşleştirme adımını kullanabilirsiniz ve Gremlin bunun için çözecektir.
stephen mallette

42

Sorgularımızda binlerce düğümü geçmemiz gerekiyor. Cypher yavaştı. Neo4j ekibi, algoritmamızı doğrudan Java API'ye göre uygulamanın 100-200 kat daha hızlı olacağını söyledi. Bunu yaptık ve kolayca 60 katını aldık. Şu an itibariyle sistemimizde güven eksikliğinden dolayı tek bir Cypher sorgusu yok. Easy Cypher sorgularının Java'da yazılması kolaydır, karmaşık sorgular gerçekleştirilmez. Sorun, sorgunuzda birden fazla koşul bulunduğunda, Cypher'da geçişleri hangi sırayla gerçekleştireceğinizi söylemenin bir yolu yoktur. Dolayısıyla, şifreli sorgunuz önce grafiğe yanlış yönde girebilir. Gremlin ile pek bir şey yapmadım, ancak Gremlin ile çok daha fazla yürütme kontrolü elde ettiğinizi hayal edebiliyorum.


"Doğrudan Java API'ye karşı" dediğinizde, Java'da gömülü Neo4j'i mi kastediyorsunuz?
Pavel

2
Bağımsız bir sunucu olarak kurulan neo4j içindeki sunucu uzantılarını kullanma.
Heinrich

12
2018'den güncelleme - neo4j'nin modern sürümlerindeki çok çeşitli yerel dizin türleri göz önüne alındığında, bu yanıt büyük ölçüde güncel değil; neo4j performans rakamlarını yayınladı
FrobberOfBits

3
"Algoritmamızı doğrudan Java API'ye uygulamak" aslında biraz yanıltıcıdır. Açıkçası, A noktasından B noktasına gitmenin en hızlı yolu, en kısa yolu kullanmaktır. Bu, ek, özel bilgilerin bilinmesini gerektirir. Düşük seviyeye gitmek her zaman bir makine planlamacısından daha iyi performans gösterir, çünkü makinenin yapamayacağı varsayımlarda bulunabileceğinizi bilirsiniz. Bununla birlikte, Cypher, saf bir şekilde uygulanan düşük seviyeli bir algoritmadan kolayca daha iyi performans gösterebilir, kullanımı çok daha az bilgi gerektirir ve uygulaması çok daha hızlıdır. Özellikle Cypher her Neo4j sürümünde daha iyi hale geldiğinden. (daha akıllı planlamacılar)
Tezra

29

Neo4j ekibinin Cypher üzerindeki çabaları gerçekten etkileyiciydi ve uzun bir yol kat etti. Neo ekibi tipik olarak insanları ona doğru iter ve Cypher olgunlaştıkça Gremlin muhtemelen daha az dikkat çekecektir. Cypher, uzun vadeli iyi bir seçimdir.

Gremlin, Groovy DSL'dir. Onu Neo4j REST uç noktası aracılığıyla kullanmak, temeldeki Neo4j Java API'sine tam ve sınırsız erişim sağlar. Bu (ve aynı kategorideki diğer komut dosyası eklentileri) düşük seviyeli güç açısından eşleştirilemez. Ayrıca Cypher'ı Gremlin eklentisinin içinden çalıştırabilirsiniz .

Her iki durumda da, her ikisini de öğrendiğiniz mantıklı bir yükseltme yolu var. Seni daha hızlı çalıştıranla giderdim. In my projelerde , ben genellikle Gremlin kullanmak ve ben hem Gremlin DSL bela matching- sekmeli sonuçları veya etkileyici deseni gerektiğinde daha sonra (Gremlin içinden veya değil) Cypher diyoruz.


20

Başlangıçta Gremlin'i kullanmaya başladım. Ancak o zamanlar REST arayüzü biraz dengesizdi, bu yüzden Cypher'a geçtim. Neo4j için çok daha iyi desteğe sahip. Bununla birlikte, Cypher ile mümkün olmayan veya Cypher'ın Gremlin ile yapabildiğiniz şekilde tam olarak optimize edemediği bazı sorgu türleri vardır.

Gremlin, Groovy üzerine inşa edilmiştir, bu nedenle onu, Neo4j'nin 'Java' kodunu yürütmesini ve REST arayüzünden HTTP isabetini almak zorunda kalmadan sunucudan çeşitli görevleri gerçekleştirmesini sağlamak için genel bir yol olarak kullanabilirsiniz. Diğerlerinin yanı sıra Gremlin, verileri değiştirmenize izin verecektir.

Bununla birlikte, tek istediğim verileri sorgulamak olduğunda, daha okunaklı ve bakımı daha kolay olduğu için Cypher ile gidiyorum. Gremlin, bir sınırlamaya ulaşıldığında yedektir.


1
Cypher, Neo4j 1.7'den itibaren sorguları güncellemek için desteğe sahiptir, bkz. Docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer

3
TinkerPop 3'te REST arayüzünün kullanımdan kaldırılacağını unutmayın. Kullanıcıların Gremlin dizilerini Gremlin Sunucusuna (temelde Rexster, yeniden adlandırılmış ve geliştirilmiş olan) göndermeleri beklenecektir.
jbmusso

10

Gremlin sorguları programlı olarak oluşturulabilir. ( Ne demek istediğimi öğrenmek için bkz. Http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects .) Bu Cypher için biraz daha zor görünüyor.


@MattLuongo: 1, neo4django hakkında bilgim yoktu, 2, her durumda geçerli değil (örneğin, dil Python değil) 3, sorguyu programlı olarak kendiniz yazarsanız veya oluşturmak için bir kitaplık kullanırsanız aynı değildir sizin için programlı olarak sorgulama. Bu bakımdan neo4django, Cypher ve Gremlin'e alternatif bir çözüm olarak düşünülebilir.
Tohotom

3
Oh, tabii ki neo4django'nun hemen uygulanabilir olmasını beklemiyorum; bu bir örnekti, tıpkı cevabınızda SQL Alchemy'nin olduğu gibi. Ancak Cypher'ı oluşturmanın daha zor olduğu doğru değil . Cypher ve Gremlin, sorgu dilleri olarak farklı yaklaşımlar benimsiyorlar, ancak
Cypher'ı

8

Cypher yalnızca basit sorgular için çalışır. Karmaşık iş mantığını grafik geçişlerinize dahil etmeye başladığınızda, engelleyici bir şekilde yavaşlar veya tamamen çalışmayı durdurur.

Neo4j açıkça onlar da alternatif bir yol genişletici (dahil APOC prosedürleri sağlamak çünkü Cypher, kesim değil bilir apoc.path.expand, apoc.path.subgraphAllvs.).

Gremlin'i öğrenmek daha zordur ama Cypher ve APOC'den daha güçlüdür. Gremlin'de aklınıza gelebilecek herhangi bir mantığı uygulayabilirsiniz.

Neo4J'nin değiştirilebilir bir Gremlin sunucusuyla birlikte gönderilmesini gerçekten diliyorum (etrafı okumaktan, durum böyleydi). Gremlin'i canlı bir Neo4J örneğine karşı çalıştırabilirsiniz, ancak bu çok fazla çemberden atlamayı içerir. Umudum, Neo4J'nin rakipleri Gremlin'e bir seçenek olarak izin verdiği için Neo4J de aynı şeyi yapacaktır.


1
neo4j dünyadaki en popüler grafik DB'dir, bence gremlin'i henüz benimsememelerinin bir nedeni olabilir.
Luk Aron

1
bu nedenlerin neler olabileceğini paylaşmadığınız için yorumunuzda herhangi bir değer göremiyorum
user1302130

4

Cypher, grafik veritabanlarını sorgulamak için bildirim temelli bir sorgu dilidir. Bildirimsel terimi önemlidir, çünkü zorunlu gibi programlama paradigmalarından farklı bir programlama yöntemidir.

Cypher ve SQL gibi bildirim temelli bir sorgu dilinde, temeldeki motora hangi verileri getirmek istediğimizi söyleriz ve verilerin nasıl alınmasını istediğimizi belirtmeyiz.

Cypher'da bir kullanıcı, MATCH cümlesindeki bir ilgi alt grafiğini tanımlar. Daha sonra temel motor, grafik veritabanındaki benzer alt grafik oluşumlarını aramak için bir model eşleştirme algoritması çalıştırır.

Gremlin hem bildirimsel hem de zorunlu özelliklerdir. Bir kullanıcının grafiğin nasıl gezileceğine dair açık talimatlar vermesi gereken bir grafik geçiş dilidir.

Bu durumda bu diller arasındaki fark, Cypher'da bir grafik veritabanındaki herhangi iki düğüm arasındaki yolları bulmak için bir Kleene yıldız operatörü kullanabilmemizdir. Gremlin'de yine de bu tür tüm yolları açıkça tanımlamamız gerekecek. Ancak, bir grafik veritabanında bu tür açık yolların birden çok oluşumunu bulmak için Gremlin'de bir tekrar operatörü kullanabiliriz. Ancak, Cypher'da açık yapılar üzerinde yineleme yapmak mümkün değildir.


3

Gremlin kullanırsanız, o zaman farklı grafik veritabanlarına geçiş yapmanıza izin verir, Grafik veritabanlarının çoğu gremlin geçişini desteklediğinden, gremlin'i seçmek iyi bir fikirdir.


2

Uzun cevap kısa: Sorgu için cypher ve geçiş için gremlin kullanın. Yanıt zamanlamasını kendiniz göreceksiniz.


bu nasıl yapılır ?
Optimus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.