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.
neo4j
graph-databases
cypher
gremlin
Rubinsh
źródło
źródło
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.subgraphAll
itp).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.
źródło
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.
źródło
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.
źródło
Długa odpowiedź krótka: użyj szyfrowania do zapytania i gremlin do przemierzania. Zobaczysz czas odpowiedzi.
źródło