Neo4j - мова запитів Cypher vs Gremlin


102

Я починаю розробляти Neo4j за допомогою API REST. Я побачив, що є два варіанти виконання складних запитів - Cypher (мова запитів Neo4j) та Gremlin (мова запиту / мова переходу загального призначення).

Ось, що я хочу знати - чи є запит або операція, яку можна виконати за допомогою Gremlin, і її неможливо виконати з Cypher? чи навпаки?

Cypher здається мені набагато зрозумілішим, ніж Гремль, і взагалі здається, що хлопці в Neo4j збираються з Cypher. Але - якщо Сайфер обмежений порівняно з Гремлем - я б дуже хотів це знати заздалегідь.


1
Cypher - це незмінна повна декларативна мова. Gremlin - це модна обгортка через API Neo4j Java, і це обов'язково. Зрозуміло, що в гремліні можна зробити те, що не можна в цифарі.
Прахар Агравал

1
Apache Spark 3 буде включати Cypher, який багато говорить про їх погляд на це.
Уокер Роу

Відповіді:


77

Для загального запиту Cypher достатньо і, ймовірно, швидше. Перевага Гремля перед Cypher полягає в тому, що ви потрапляєте на траверси високого рівня. У Гремлі можна краще визначити точну схему обходу (або власні алгоритми), тоді як у Cypher двигун намагається знайти найкраще рішення для подорожі.

Я особисто використовую Cypher через його простоту, і на сьогоднішній день у мене не було жодних ситуацій, коли мені довелося б користуватися Gremlin (крім роботи з функціями імпорту / експорту Gremlin graphML graphML). Я очікую, однак, що навіть якщо мені буде потрібно використовувати Gremlin, я б зробив це для конкретного запиту, який би я знайшов у мережі і більше ніколи не повернуся до нього.

Ви завжди можете навчитися Cypher по-справжньому швидко (за кілька днів), а потім продовжувати (більш тривалий) загальний Гремль.


2
На сайті neo4j.org/learn/cypher для вас також буде новий навчальний посібник, який ви можете розпочати.
Пітер Нойбауер

3
У мене було розуміння, що Cypher більше схожий на SQL, оскільки ти кажеш йому, що ти хочеш, і він визначає, як це зробити. З Гремлем ви видаєте великі перехідні команди, яким він повинен підкорятися.
Стюарт

2
Для мене в більшості запитів Gremlin виявився значно швидшим, ніж Cypher.
Джоан

9
Що стосується TinkerPop 3.x , то Gremlin має як імперативні, так і декларативні характеристики. Ви можете написати свої обходи, щоб визначити точний шаблон обходу, як зазначено у цій відповіді, або ви можете скористатися кроком відповідності, щоб просто визначити шуканий шаблон, і Gremlin вирішить для цього.
Стівен Маллет

41

У наших запитах ми повинні пройти тисячі вузлів. Сайфер був повільним. Команда Neo4j сказала нам, що реалізація нашого алгоритму безпосередньо проти Java API буде в 100-200 разів швидшою. Ми це зробили і отримали з цього коефіцієнт 60. На сьогодні у нас немає жодного запиту Cypher у нашій системі через відсутність впевненості. Easy Cypher запити легко писати на Java, складні запити не виконуватимуться. Проблема полягає в тому, що у вас є кілька умов у запиті, в Cypher немає можливості сказати, в якому порядку виконувати обхід. Таким чином, ваш запит на використання кіфарета може спершу заграти у графік у неправильному напрямку. Я не робив багато з Гремлем, але міг би уявити, що ти отримаєш набагато більше контролю над виконанням з Гремлем.


Коли ви говорите "прямо проти Java API", ви маєте на увазі Neo4j, вбудований у Java?
Павло

2
Використання розширень сервера в neo4j, встановлених як окремий сервер.
Генріх

12
Оновлення від 2018 року - зважаючи на великий діапазон типових типів індексу в сучасних версіях neo4j, ця відповідь істотно застаріла; neo4j опублікував номери виступів
FrobberOfBits

3
"реалізація нашого алгоритму безпосередньо проти Java API" насправді трохи вводить в оману. Очевидно, найшвидший спосіб дістатися з точки А до точки В - пройти найкоротший шлях. Для цього потрібно знати додаткову, конкретну, інформацію. Низький рівень завжди перевершує планувальник машин, тому що ви знаєте, що ви можете робити припущення, що машина не може. Однак Cypher може легко перевершити наївно реалізований алгоритм низького рівня, вимагає набагато менше знань для використання та набагато швидше втілити в життя. Тим більше, що Cypher стає кращим з кожним випуском Neo4j. (розумніші планувальники)
Тезра

29

Зусилля команди Neo4j щодо Cypher були дуже вражаючими, і він пройшов довгий шлях. Команда Нео, як правило, підштовхує людей до неї, і по мірі дозрівання Сайфера, Гремль, ймовірно, отримає менше уваги. Cypher - хороший довгостроковий вибір.

Це сказало - Гремль - Groovy DSL. Використання його через свою кінцеву точку Neo4j REST дозволяє забезпечити повний, безперебійний доступ до базового API Neo4j Java. Він (та інші плагіни скрипту в тій же категорії) не можуть відповідати за низьким рівнем живлення. Крім того, ви можете запустити Cypher із плагіна Gremlin .

У будь-якому випадку, є розумний шлях оновлення, де ви навчаєтесь обом. Я б пішов з тим, хто тебе встає і працює швидше. У своїх проектах , як правило, я використовую Gremlin, а потім дзвоню в Cypher (зсередини Gremlin чи ні), коли мені потрібні табличні результати або виразне узгодження шаблону - і те, і інше - біль у Gremlin DSL.


20

Я спочатку почав користуватися Gremlin. Однак на той час інтерфейс REST був трохи нестабільний, тому я перейшов на Cypher. Він має набагато кращу підтримку Neo4j. Однак існують деякі типи запитів, які просто неможливі з Cypher, або коли Cypher не може повністю оптимізувати, як можна з Gremlin.

Gremlin побудований над Groovy, тому ви можете фактично використовувати його як загальний спосіб змусити Neo4j виконувати код Java та виконувати різні завдання з сервера, не потребуючи звернення HTTP з інтерфейсу REST. Серед іншого, Gremlin дозволить вам змінювати дані.

Однак, коли все, що я хочу, - це запитувати дані, я переходжу з Cypher, оскільки він легше читається і простіший в обслуговуванні. Гремль - це резервний запас, коли буде досягнуто обмеження.


1
Cypher має підтримку оновлення запитів станом на Neo4j 1.7, див. Docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Пітер Нойбауер

3
Зауважте, що інтерфейс REST відключатиметься в TinkerPop 3. Очікується, що користувачі будуть надсилати рядки Gremlin на сервер Gremlin (який в основному Rexster, перейменований і вдосконалений).
jbmusso

10

Гремлівські запити можна генерувати програмно. (Див. Http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects, щоб знати, що я маю на увазі.) Це, здається, трохи складніше з Cypher.


@MattLuongo: 1, я не знав про neo4django, 2, він не застосовується у всіх випадках (наприклад, мова не є Python) 3, це не те саме, якщо запит ви пишете програмно самостійно або використовуєте бібліотеку для створення запит програмно для вас. У цьому відношенні neo4django можна вважати альтернативним рішенням для Cypher and Gremlin.
Тохотом

3
О, звичайно, не очікую, що neo4django буде негайно застосований; це був приклад, як саме у вашій відповіді була алхімія SQL. Але це не так , що генерування Cypher є більш важким. Cypher і Gremlin використовують різні підходи як мови запитів, але я не бачу, як Cypher важче програмно генерувати ...
Matt Luongo

8

Cypher працює лише для простих запитів. Коли ви починаєте включати складну бізнес-логіку у свій графік, вона стає непомірно повільною або взагалі перестає працювати.

Neo4j чітко знає , що Сайфера не розрізаючи його, оскільки вони також забезпечують процедури АПБО які включають в себе альтернативний шляхи (розширювач apoc.path.expand, apoc.path.subgraphAllі т.д.).

У Гремлі важче вчитися, але він потужніший за Cypher та APOC. У Гремлі ви можете реалізувати будь-яку логіку, про яку ви думаєте.

Мені дуже хочеться, щоб Neo4J постачався з перетворювальним гремлівським сервером (з читання навколо, це було раніше). Ви можете змусити Гремля працювати проти живого екземпляра Neo4J, але це включає стрибки через безліч обручів. Я сподіваюсь, що оскільки конкуренти Neo4J дозволяють Gremlin в якості опції, Neo4J буде слідувати цьому.


1
нео4j - це найпопулярніший БД графіків у світі, я думаю, що може бути причина, чому вони ще не прийняли гремлін.
Лук Арон

1
оскільки ви не поділяєтесь, якими можуть бути ці причини, я не бачу ніякого значення у вашому коментарі
user1302130

4

Cypher - це заявна мова запитів для запитів баз даних графіків. Термін декларативний важливий, оскільки це інший спосіб програмування, ніж програмування парадигм, як імператив.

У мові декларативних запитів, як Cypher та SQL, ми повідомляємо основній системі, які дані ми хочемо отримати, і не вказуємо, як ми хочемо отримувати дані.

У Cypher користувач визначає під графік, що цікавить пункт MATCH. Потім базовий двигун запускає алгоритм відповідності шаблону для пошуку схожих випадків під графіку в базі даних графіків.

Гремль має як декларативні, так і імперативні риси. Це мова переходу графіків, де користувач повинен дати чіткі вказівки щодо того, як графік повинен переходити.

Різниця між цими мовами в цьому випадку полягає в тому, що в Cypher ми можемо використовувати оператор зірки Kleene для пошуку шляхів між будь-якими двома заданими вузлами в базі даних графіків. Однак у Гремлі нам доведеться чітко визначити всі такі шляхи. Але ми можемо використовувати оператор повторення в Гремлі, щоб знайти кілька випадків таких явних шляхів у графічній базі даних. Однак робити ітерації над явними структурами в Cypher неможливо.


3

Якщо ви використовуєте gremlin, то це дозволяє вам перенести на різні бази даних графіків, оскільки більшість баз даних графіків підтримує обхід гремліну, його найкраще вибрати грамлін.


2

Коротка відповідь: Використовуйте цифер для запиту, а гремлін - для обходу. Ви побачите терміни відповіді самі.


як це зробити?
Оптимус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.