Neo4j - język zapytań Cypher vs Gremlin


102

Zaczynam programować z Neo4j przy użyciu REST API. Widziałem, że istnieją dwie opcje wykonywania złożonych zapytań - Cypher (język zapytań Neo4j) i Gremlin (język zapytań / przechodzenia do wykresów ogólnego przeznaczenia).

Oto, co chcę wiedzieć - czy jest jakieś zapytanie lub operacja, które można wykonać za pomocą Gremlin i nie można ich wykonać za pomocą Cyphera? lub odwrotnie?

Cypher wydaje mi się znacznie bardziej przejrzysty niż Gremlin i ogólnie wydaje się, że chłopaki z Neo4j idą z Cypherem. Ale - jeśli Cypher jest ograniczony w porównaniu z Gremlinem - naprawdę chciałbym to wiedzieć z góry.


1
Cypher to nieturingowy, kompletny język deklaratywny. Gremlin jest fantazyjnym opakowaniem API Neo4j Java i jest niezbędny. Oczywiście w gremlinie są rzeczy możliwe do zrobienia, których nie można wykonać w szyfrze.
Prakhar Agrawal

1
Apache Spark 3 będzie zawierał Cypher, co wiele mówi o ich opinii na ten temat.
Walker Rowe

Odpowiedzi:


77

Do ogólnych zapytań wystarczy Cypher i prawdopodobnie jest szybszy. Przewaga Gremlina nad Cypherem polega na tym, że wkraczasz w podróżowanie na wysokim poziomie. W Gremlinie możesz lepiej zdefiniować dokładny wzór przejścia (lub własne algorytmy), podczas gdy w Cypherze silnik sam próbuje znaleźć najlepsze rozwiązanie.

Osobiście używam Cyphera ze względu na jego prostotę i do tej pory nie miałem żadnych sytuacji, w których musiałbym używać Gremlin (poza pracą z funkcjami importu / eksportu Gremlin graphML). Spodziewam się jednak, że nawet gdybym musiał użyć Gremlina, zrobiłbym to dla konkretnego zapytania, które znalazłbym w sieci i nigdy więcej nie wrócił.

Zawsze możesz nauczyć się Cyphera bardzo szybko (w ciągu kilku dni), a następnie kontynuować (długoterminowy) generał Gremlin.


2
Na neo4j.org/learn/cypher zaczyna się nowy samouczek online, abyś również mógł zacząć.
Peter Neubauer

3
Zrozumiałem, że Cypher jest bardziej podobny do SQL, ponieważ mówisz mu, czego chcesz, a on sprawdza, jak to zrobić. Z Gremlinem wydajesz dokładne polecenia przejścia, których musi przestrzegać.
Stewart

2
Dla mnie Gremlin był znacznie szybszy niż Cypher w większości zapytań.
Joan,

9
Począwszy od TinkerPop 3.x , Gremlin ma zarówno właściwości imperatywne, jak i deklaratywne. Możesz napisać swoje przemierzania, aby zdefiniować dokładny wzór przejścia, jak podano w tej odpowiedzi, lub możesz użyć kroku dopasowania, aby po prostu zdefiniować wzór, którego szukasz, a Gremlin to rozwiąże.
Stephen Mallette

42

W naszych zapytaniach musimy przejść przez tysiące węzłów. Cypher był powolny. Zespół Neo4j powiedział nam, że implementacja naszego algorytmu bezpośrednio do interfejsu API języka Java byłaby 100-200 razy szybsza. Zrobiliśmy to i łatwo uzyskaliśmy z tego czynnik 60. Na chwilę obecną nie mamy w naszym systemie żadnego zapytania Cypher z powodu braku zaufania. Proste zapytania Cypher są łatwe do napisania w Javie, złożone zapytania nie będą działać. Problem polega na tym, że gdy w zapytaniu znajduje się wiele warunków, w Cypherze nie ma możliwości określenia kolejności wykonywania przemierzania. Więc twoje zapytanie szyfrujące może najpierw oszaleć na wykresie w złym kierunku. Nie zrobiłem wiele z Gremlinem, ale wyobrażam sobie, że dzięki Gremlinowi uzyskasz znacznie większą kontrolę nad wykonaniem.


Kiedy mówisz „bezpośrednio przeciwko Java API”, masz na myśli Neo4j osadzony w Javie?
Pavel,

2
Korzystanie z rozszerzeń serwera w neo4j zainstalowanych jako samodzielny serwer.
Heinrich,

12
Aktualizacja z 2018 r. - biorąc pod uwagę dużą liczbę rodzimych typów indeksów w nowoczesnych wersjach neo4j, ta odpowiedź jest zasadniczo nieaktualna; neo4j opublikował numery wydajności
FrobberOfBits

3
„Implementacja naszego algorytmu bezpośrednio w Java API” jest w rzeczywistości trochę myląca. Oczywiście najszybszym sposobem dotarcia z punktu A do punktu B jest wybranie najkrótszej ścieżki. To wymaga znajomości dodatkowych, konkretnych informacji. Zejście na niski poziom zawsze będzie lepsze od projektanta maszyn, ponieważ wiesz, że możesz założyć, że maszyna nie może. Jednak Cypher może z łatwością przewyższać naiwnie zaimplementowany algorytm niskiego poziomu, wymaga znacznie mniej wiedzy do wykorzystania i jest znacznie szybszy do wdrożenia. Zwłaszcza, że ​​Cypher staje się lepszy z każdym wydaniem Neo4j. (mądrzejsi planiści)
Tezra

29

Wysiłki zespołu Neo4j na Cypherze były naprawdę imponujące i przeszły długą drogę. Zespół Neo zazwyczaj popycha ludzi w tym kierunku, a gdy Cypher dojrzewa, Gremlin prawdopodobnie zyska mniej uwagi. Cypher to dobry wybór na dłuższą metę.

To powiedziawszy - Gremlin to Groovy DSL. Korzystanie z niego za pośrednictwem punktu końcowego Neo4j REST umożliwia pełny, nieskrępowany dostęp do podstawowego interfejsu API Neo4j Java. Tego (i innych wtyczek skryptów w tej samej kategorii) nie można dopasować pod względem mocy niskiego poziomu. Dodatkowo możesz uruchomić Cypher z poziomu wtyczki Gremlin .

Tak czy inaczej, istnieje rozsądna ścieżka ulepszania, w której nauczysz się obu. Poszedłbym z tym, który przyspiesza bieganie. W moich projektach zwykle używam Gremlin, a następnie dzwonię do Cyphera (z poziomu Gremlin lub nie), gdy potrzebuję tabelarycznych wyników lub ekspresyjnego dopasowania wzorców - oba są uciążliwe w Gremlin DSL.


20

Początkowo zacząłem używać Gremlin. Jednak w tamtym czasie interfejs REST był trochę niestabilny, więc przełączyłem się na Cypher. Ma znacznie lepsze wsparcie dla Neo4j. Jednak są pewne typy zapytań, które po prostu nie są możliwe w przypadku Cyphera lub w przypadku których Cypher nie może zoptymalizować tak, jak można to zrobić z Gremlinem.

Gremlin jest zbudowany na Groovy, więc możesz go używać jako ogólnego sposobu, aby Neo4j wykonywał kod „Java” i wykonywał różne zadania z serwera, bez konieczności pobierania trafień HTTP z interfejsu REST. Między innymi Gremlin pozwoli Ci modyfikować dane.

Jednak gdy wszystko, czego chcę, to przeszukiwać dane, korzystam z Cyphera, ponieważ jest bardziej czytelny i łatwiejszy w utrzymaniu. Gremlin jest rozwiązaniem awaryjnym po osiągnięciu ograniczenia.


1
Cypher obsługuje aktualizację zapytań od Neo4j 1.7, patrz docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer

3
Zwróć uwagę, że interfejs REST zniknie w TinkerPop 3. Użytkownicy będą musieli wysyłać ciągi znaków Gremlin do Gremlin Server (który jest w zasadzie Rexster, zmieniono jego nazwę i ulepszono).
jbmusso,

10

Zapytania Gremlin można generować programowo. (Zobacz http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects, aby wiedzieć, co mam na myśli.) Wydaje się to być nieco trudniejsze w przypadku Cyphera.


@MattLuongo: 1, nie wiedziałem o neo4django, 2, nie ma zastosowania we wszystkich przypadkach (np. Język to nie Python) 3, to nie to samo, jeśli sam piszesz zapytanie programowo lub korzystasz z biblioteki do tworzenia zapytania programowo dla Ciebie. Pod tym względem neo4django można uznać za alternatywne rozwiązanie dla Cyphera i Gremlina.
Tohotom

3
Och, oczywiście nie oczekuję, że neo4django zostanie natychmiast zastosowane; to był przykład, tak jak w Twojej odpowiedzi była SQL Alchemy. Ale to nie jest prawda, że generowanie Cypher jest bardziej trudne. Cypher i Gremlin przybierać różne podejścia jak języków zapytań, ale nie widzę w jaki sposób Cypher jest jakiś trudniejszy do wygenerowania programowo ...
Matt Luongo

8

Cypher działa tylko w przypadku prostych zapytań. Kiedy zaczynasz włączać złożoną logikę biznesową do przemierzania wykresów, staje się on zbyt wolny lub całkowicie przestaje działać.

Neo4J wyraźnie wie, że nie jest to Cypher cięcia, ponieważ zapewniają one również procedur Ap, które zawierają alternatywne ścieżki (ekspander apoc.path.expand, apoc.path.subgraphAllitp).

Gremlin jest trudniejszy do nauczenia, ale jest potężniejszy niż Cypher i APOC. W Gremlinie możesz zaimplementować dowolną logikę.

Naprawdę chciałbym, żeby Neo4J był dostarczany z przełączalnym serwerem Gremlin (z czytania, tak było). Możesz sprawić, że Gremlin będzie walczył z żywą instancją Neo4J, ale wymaga to skakania przez wiele obręczy. Mam nadzieję, że skoro konkurenci Neo4J dopuszczają Gremlin jako opcję, Neo4J pójdzie w ich ślady.


1
neo4j jest najpopularniejszym grafowym DB na świecie, myślę, że może być powód, dla którego jeszcze nie przyjęli gremlina.
Luk Aron

1
ponieważ nie
ujawniasz,

4

Cypher to deklaratywny język zapytań służący do wykonywania zapytań w grafowych bazach danych. Termin deklaratywny jest ważny, ponieważ jest innym sposobem programowania niż paradygmaty programowania, takie jak imperatyw.

W deklaratywnym języku zapytań, takim jak Cypher i SQL, mówimy bazowemu silnikowi, jakie dane chcemy pobrać, i nie określamy, w jaki sposób chcemy, aby dane były pobierane.

W Cypherze użytkownik definiuje interesujący nas pod-graf w klauzuli MATCH. Następnie bazowy silnik uruchamia algorytm dopasowywania wzorców w celu wyszukania podobnych wystąpień grafu podrzędnego w bazie danych grafów.

Gremlin jest cechą zarówno deklaratywną, jak i imperatywną. Jest to język przemierzania wykresów, w którym użytkownik musi podać wyraźne instrukcje dotyczące sposobu nawigacji po wykresie.

Różnica między tymi językami w tym przypadku polega na tym, że w Cypherze możemy użyć operatora gwiazdy Kleene, aby znaleźć ścieżki między dowolnymi dwoma podanymi węzłami w grafowej bazie danych. W Gremlinie będziemy jednak musieli jednoznacznie zdefiniować wszystkie takie ścieżki. Ale możemy użyć operatora powtórzeń w języku Gremlin, aby znaleźć wiele wystąpień takich jawnych ścieżek w bazie danych grafów. Jednak wykonywanie iteracji po jawnych strukturach nie jest możliwe w Cypherze.


3

Jeśli używasz gremlin, to pozwala na migrację do różnych baz danych grafów, Ponieważ większość baz danych grafów obsługuje przechodzenie gremlin, Dobrym pomysłem jest wybranie gremlin.


2

Długa odpowiedź krótka: użyj szyfrowania do zapytania i gremlin do przemierzania. Zobaczysz czas odpowiedzi.


jak to zrobić ?
Optimus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.