Neo4j - язык запросов Cypher vs Gremlin

102

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

Вот что я хочу знать - есть ли какие-либо запросы или операции, которые можно выполнить с помощью Gremlin и которые нельзя выполнить с помощью Cypher? или наоборот?

Cypher мне кажется более понятным, чем Gremlin, и в целом кажется, что ребята из Neo4j выбирают Cypher. Но - если Cypher ограничен по сравнению с Gremlin - я действительно хотел бы знать это заранее.

Рубинш
источник
1
Cypher - это не полный декларативный язык по Тьюрингу. Gremlin - это модная оболочка над Java API Neo4j, и она обязательна. Ясно, что в gremlin есть вещи, которые нельзя делать в cypher.
Prakhar Agrawal
1
Apache Spark 3 будет включать Cypher, что многое говорит об их взглядах на это.
Уокер Роу

Ответы:

77

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

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

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

ulkas
источник
2
На neo4j.org/learn/cypher есть новое онлайн-руководство, которое вы также можете начать.
Питер Нойбауэр
3
У меня было понимание, что Cypher больше похож на SQL в том смысле, что вы говорите ему, что хотите, и он выясняет, как это сделать. С Gremlin вы даете точные команды обхода, которым он должен подчиняться.
Стюарт
2
Для меня Gremlin оказался значительно быстрее, чем Cypher в большинстве запросов.
Joan
9
Начиная с TinkerPop 3.x , Gremlin имеет как императивные, так и декларативные характеристики. Вы можете написать свои обходы, чтобы определить точный шаблон обхода, как указано в этом ответе, или вы можете использовать этап сопоставления, чтобы просто определить шаблон, который вы ищете, и Gremlin решит это.
Стивен Маллетт
42

В наших запросах мы должны пройти тысячи узлов. Сайфер был медлительным. Команда 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. (более умные планировщики)
Tezra
29

Усилия команды Neo4j над Cypher были действительно впечатляющими, и они прошли долгий путь. Команда Neo обычно подталкивает людей к этому, и по мере взросления Сайфера Гремлин, вероятно, будет уделять меньше внимания. Cypher - хороший выбор на долгий срок.

Тем не менее, Gremlin - это Groovy DSL. Использование его через конечную точку Neo4j REST обеспечивает полный, неограниченный доступ к базовому API Java Neo4j. Он (и другие подключаемые модули сценариев в той же категории) не могут быть сопоставлены с точки зрения низкоуровневой мощности. Кроме того, вы можете запускать Cypher из плагина Gremlin .

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

Мэтт Луонго
источник
20

Сначала я начал использовать Гремлин. Однако в то время интерфейс REST был немного нестабильным, поэтому я переключился на Cypher. Он имеет гораздо лучшую поддержку Neo4j. Однако есть некоторые типы запросов, которые просто невозможны с Cypher, или которые Cypher не может оптимизировать так, как вы можете с Gremlin.

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

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

Луи-Филипп Юбердо
источник
1
Cypher поддерживает обновление запросов начиная с
Питер Нойбауэр,
3
Обратите внимание, что интерфейс REST будет удален в TinkerPop 3. Ожидается, что пользователи будут отправлять строки Gremlin на сервер Gremlin (который по сути является Rexster, переименованным и улучшенным).
jbmusso
10

Запросы Gremlin могут быть сгенерированы программно. (См. Http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects, чтобы понять, что я имею в виду.) С Cypher это, похоже, немного сложнее.

Tohotom
источник
@MattLuongo: 1, я не знал о neo4django, 2, он применим не во всех случаях (например, язык не Python) 3, это не то же самое, если вы сами пишете запрос программно или используете библиотеку для создания запросить программно для вас. В этом отношении neo4django можно рассматривать как альтернативу Cypher и Gremlin.
Tohotom
3
О, конечно, я не ожидаю, что neo4django будет немедленно применен; это был пример, такой же, как SQL Alchemy в вашем ответе. Но это не так , что генерирование Cypher является более трудным. Cypher и Gremlin используют разные подходы в качестве языков запросов, но я не понимаю, почему Cypher сложнее сгенерировать программно ...
Мэтт Луонго
8

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

Neo4J четко знает, что Cypher не режет его, потому что они также предоставляют процедуры APOC, которые включают расширитель альтернативного пути ( apoc.path.expand, apoc.path.subgraphAllи т. Д.).

Гремлина сложнее выучить, но он более мощный, чем Сайфер и APOC. В Gremlin вы можете реализовать любую логику, какую только сможете придумать.

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

user1302130
источник
1
neo4j - самая популярная графическая БД в мире, и я думаю, что может быть причина, по которой они еще не приняли гремлин.
Luk Aron
1
так как вы не рассказываете, какие могут быть эти причины, я не вижу смысла в вашем комментарии
user1302130
4

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

В декларативном языке запросов, таком как Cypher и SQL, мы сообщаем базовому механизму, какие данные мы хотим получить, и не указываем, как мы хотим получать эти данные.

В Cypher пользователь определяет интересующий подграф в предложении MATCH. Затем базовая машина запускает алгоритм сопоставления с образцом для поиска похожих вхождений подграфа в базе данных графов.

Gremlin имеет декларативную и императивную функции. Это язык обхода графа, где пользователь должен дать явные инструкции относительно того, как перемещаться по графу.

Разница между этими языками в данном случае заключается в том, что в Cypher мы можем использовать звездообразный оператор Клини для поиска путей между любыми двумя заданными узлами в базе данных графа. Однако в Gremlin мы должны явно определить все такие пути. Но мы можем использовать оператор повтора в Gremlin, чтобы найти несколько вхождений таких явных путей в базе данных графов. Однако выполнение итераций над явными структурами в Cypher невозможно.

Чандан Шарма
источник
3

Если вы используете gremlin, то это позволяет вам переносить данные в другие базы данных графов. Поскольку большинство баз данных графов поддерживают обход gremlin, рекомендуется выбрать gremlin.

Singaravelan
источник
2

Длинный ответ краткий: используйте cypher для запроса и gremlin для обхода. Вы сами увидите время ответа.

Сагар Сарин
источник
как это сделать ?
Optimus