Я начинаю разрабатывать Neo4j, используя REST API. Я видел, что есть два варианта выполнения сложных запросов - Cypher (язык запросов Neo4j) и Gremlin (язык запросов / обхода графов общего назначения).
Вот что я хочу знать - есть ли какие-либо запросы или операции, которые можно выполнить с помощью Gremlin и которые нельзя выполнить с помощью Cypher? или наоборот?
Cypher мне кажется более понятным, чем Gremlin, и в целом кажется, что ребята из Neo4j выбирают Cypher. Но - если Cypher ограничен по сравнению с Gremlin - я действительно хотел бы знать это заранее.
neo4j
graph-databases
cypher
gremlin
Рубинш
источник
источник
Ответы:
Для общих запросов достаточно Cypher, и он, вероятно, быстрее. Преимущество Гремлина перед Сайфером в том, что вы переходите на высокий уровень. В Gremlin вы можете лучше определить точный шаблон обхода (или свои собственные алгоритмы), тогда как в Cypher движок сам пытается найти лучшее решение для обхода.
Я лично использую Cypher из-за его простоты, и на сегодняшний день у меня не было ситуаций, когда мне приходилось бы использовать Gremlin (кроме работы с функциями импорта / экспорта Gremlin graphML). Однако я ожидаю, что даже если мне понадобится использовать Gremlin, я сделаю это для конкретного запроса, который найду в сети и к которому больше никогда не вернусь.
Вы всегда можете выучить Cypher очень быстро (за несколько дней), а затем продолжить (более длительный) генерал Гремлин.
источник
В наших запросах мы должны пройти тысячи узлов. Сайфер был медлительным. Команда Neo4j сообщила нам, что реализация нашего алгоритма непосредственно против Java API будет в 100-200 раз быстрее. Мы сделали это и легко получили множитель 60. На данный момент у нас нет ни одного запроса Cypher в нашей системе из-за отсутствия уверенности. Запросы Easy Cypher легко написать на Java, сложные запросы не будут выполняться. Проблема в том, что когда у вас есть несколько условий в вашем запросе, Cypher не может сказать, в каком порядке выполнять обход. Таким образом, ваш шифровальный запрос может сначала зайти в график в неправильном направлении. Я мало что сделал с Гремлином, но могу представить, что с Гремлином вы получите гораздо больше контроля над исполнением.
источник
Усилия команды Neo4j над Cypher были действительно впечатляющими, и они прошли долгий путь. Команда Neo обычно подталкивает людей к этому, и по мере взросления Сайфера Гремлин, вероятно, будет уделять меньше внимания. Cypher - хороший выбор на долгий срок.
Тем не менее, Gremlin - это Groovy DSL. Использование его через конечную точку Neo4j REST обеспечивает полный, неограниченный доступ к базовому API Java Neo4j. Он (и другие подключаемые модули сценариев в той же категории) не могут быть сопоставлены с точки зрения низкоуровневой мощности. Кроме того, вы можете запускать Cypher из плагина Gremlin .
В любом случае, есть разумный путь обновления, где вы узнаете и то, и другое. Я бы выбрал тот, который заставит вас работать быстрее. В своих проектах я обычно использую Gremlin, а затем вызываю Cypher (изнутри Gremlin или нет), когда мне нужны табличные результаты или выразительное сопоставление с образцом - и то и другое является проблемой в Gremlin DSL.
источник
Сначала я начал использовать Гремлин. Однако в то время интерфейс REST был немного нестабильным, поэтому я переключился на Cypher. Он имеет гораздо лучшую поддержку Neo4j. Однако есть некоторые типы запросов, которые просто невозможны с Cypher, или которые Cypher не может оптимизировать так, как вы можете с Gremlin.
Gremlin построен на Groovy, поэтому вы можете использовать его как общий способ заставить Neo4j выполнять код Java и выполнять различные задачи с сервера без необходимости принимать HTTP-запросы из интерфейса REST. Среди прочего, Gremlin позволит вам изменять данные.
Однако, когда все, что мне нужно, это запрашивать данные, я использую Cypher, так как он более читабелен и проще в обслуживании. Гремлин - это запасной вариант, когда достигается ограничение.
источник
Запросы Gremlin могут быть сгенерированы программно. (См. Http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects, чтобы понять, что я имею в виду.) С Cypher это, похоже, немного сложнее.
источник
Cypher работает только для простых запросов. Когда вы начинаете включать сложную бизнес-логику в обход графа, она становится слишком медленной или вообще перестает работать.
Neo4J четко знает, что Cypher не режет его, потому что они также предоставляют процедуры APOC, которые включают расширитель альтернативного пути (
apoc.path.expand
,apoc.path.subgraphAll
и т. Д.).Гремлина сложнее выучить, но он более мощный, чем Сайфер и APOC. В Gremlin вы можете реализовать любую логику, какую только сможете придумать.
Я действительно хочу, чтобы Neo4J поставлялся с переключаемым сервером Gremlin (судя по чтению, раньше это было именно так). Вы можете заставить Гремлина работать против живого экземпляра Neo4J, но для этого нужно перепрыгнуть через множество препятствий. Я надеюсь, что, поскольку конкуренты Neo4J допускают использование Gremlin в качестве опции, Neo4J последует их примеру.
источник
Cypher - это декларативный язык запросов для запросов к базам данных графов. Термин декларативный важен, потому что это другой способ программирования, чем такие парадигмы программирования, как императив.
В декларативном языке запросов, таком как Cypher и SQL, мы сообщаем базовому механизму, какие данные мы хотим получить, и не указываем, как мы хотим получать эти данные.
В Cypher пользователь определяет интересующий подграф в предложении MATCH. Затем базовая машина запускает алгоритм сопоставления с образцом для поиска похожих вхождений подграфа в базе данных графов.
Gremlin имеет декларативную и императивную функции. Это язык обхода графа, где пользователь должен дать явные инструкции относительно того, как перемещаться по графу.
Разница между этими языками в данном случае заключается в том, что в Cypher мы можем использовать звездообразный оператор Клини для поиска путей между любыми двумя заданными узлами в базе данных графа. Однако в Gremlin мы должны явно определить все такие пути. Но мы можем использовать оператор повтора в Gremlin, чтобы найти несколько вхождений таких явных путей в базе данных графов. Однако выполнение итераций над явными структурами в Cypher невозможно.
источник
Если вы используете gremlin, то это позволяет вам переносить данные в другие базы данных графов. Поскольку большинство баз данных графов поддерживают обход gremlin, рекомендуется выбрать gremlin.
источник
Длинный ответ краткий: используйте cypher для запроса и gremlin для обхода. Вы сами увидите время ответа.
источник