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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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