API-интерфейс Neo4j Traversal API против Cypher

Когда я должен выбрать структуру обхода Neo4js над Cypher?

Например, для запроса friend-of-a friend я бы написал запрос Cypher следующим образом:

MATCH (p:Person {pid:'56'})-[:FRIEND*2..2]->(fof) 
WHERE NOT (p)-[:FRIEND]->(fof) 
RETURN fof.pid

И для соответствующей реализации Traversal потребуются два обхода для friends_at_depth_1 и friends_at_depth_2 (или вызов основного API для получения отношений) и найти разницу этих двух наборов, используя простые конструкторы java, вне описания обхода. Исправьте меня, если Im неправильно здесь.

Любые мысли?

Ответ 1

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

В вашем запросе я немного пересмотрю его:

MATCH (p:Person {pid:'56'})-[:FRIEND*2..2]->(fof) 
WHERE NOT (p)-[:FRIEND]->(fof) AND
      p <> fof
RETURN fof.pid

(я добавил, что p<>fof, потому что ссылки друзей могут вернуться к оригинальному человеку)

Чтобы сделать это в трейвере, вам не нужно будет иметь два траверса, только один. Вы пройдете только отношения FRIEND, остановитесь на глубине 2 и скопируйте набор результатов.

Теперь я попытаюсь утверждать, что вы должны почти всегда использовать Cypher и никогда не использовать API обхода, если у вас нет особых обстоятельств. Вот мои причины:

  • Декларативный запрос очень мощный, поскольку он освобождает вас от размышлений о том, как. Все, что вам нужно знать, это то, что вы хотите. Это означает, что вы тратите больше времени на то, что должен делать ваш код, и меньше времени на детали реализации.
  • Оператор запросов cypher становится все лучше (версия 2.2 будет иметь планировщик на основе затрат), и, конечно же, они приложили много усилий, чтобы убедиться, что cypher использует все доступные индексы. Возможно, что для многих запросов cypher лучше выполнит поиск ваших данных, чем ваш обход, если вы не очень осторожны в кодировании обхода.
  • Cypher - это намного меньше кода, чем написание собственного обхода, что часто требует, чтобы вы реализовали определенные классы для выполнения специализированных условий остановки и т.д.
  • В настоящее время cypher может работать во встроенных базах данных или на сервере. Если вы хотите запустить обход, вы не можете отправить его удаленно на сервер, который будет выполнен; возможно, в лучшем случае вы могли бы написать расширение сервера, которое проходило обход. Поэтому я думаю, что cypher сейчас более гибкий.

Итак, когда вы должны использовать обход? Два ключевых случая, о которых я знаю (другие могут предложить другие)

  • Иногда вам нужно выполнить сложную пользовательскую операцию java-кода во всем, что вы проходите. В этом случае вы используете траверс как "функцию посетителя", а иногда обходы более удобны в использовании, чем cypher, в зависимости от характера java, который вы используете на узлах.
  • Иногда ваши требования к производительности настолько интенсивны, что вам нужно провести трассировку графика, потому что есть какой-то аспект структуры графа, который вы можете использовать в траверсе, чтобы заставить его идти быстрее, чем Cypher не может воспользоваться. Это происходит, но переход к этому обычно обычно не является хорошей идеей.

Ответ 2

Выдержка из книги

Core API, Traversal Framework или Cypher?

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

Структура Traversal Framework более тесно связана с Core API (потому что она позволяет разработчику объявлять информационные цели) и менее подробный, и в результате запрос, написанный с использованием ракурса Traversal, обычно требует меньше усилий для разработчиков чем эквивалент, написанный с использованием Core API. Потому что это универсальный однако Рамочная система трасс имеет тенденцию к незначительному снижению чем хорошо написанный запрос Core API.

Если мы окажемся в необычной ситуации кодирования с помощью Core API или Traversal (И, таким образом, избегая Сайфера и его возможностей), потому что мы работая над краевым случаем, где нам нужно тонко разработать алгоритм, который не может быть эффективно выражается с использованием сопоставления шаблонов Cyphers. Выбор между Core API и Framework Traversal Framework - вопрос о том, является ли более высокая абстракция/ более низкое сцепление Ракурса обхода является достаточным, или близкое к нему отношение, металл/более высокая связь Core API фактически необходима для реализации алгоритм правильно и в соответствии с нашими требованиями к производительности.

Ссылка: Графические базы данных, новые возможности для подключенных данных, p161

Что такое cypher?

Определение идет в doc разработчика следующим образом: cypher - это декларативный язык, основанный на SQL, для визуального описания паттернов в графиках с использованием синтаксиса ascii-art.

Подробнее об этом можно узнать .

Что такое базовый API?

Я нашел эту страницу, имеющую следующее предложение:

Помимо объектно-ориентированного API для базы данных графа, работающего с объектами Node, Relationship и Path, он также предлагает высоко настраиваемые высокоскоростные реализации обхода и графического алгоритма.

Таким образом, практически говорящий основной API имеет дело с базовыми объектами, такими как Node, Relationship, который принадлежит org.neo4j.graphdb package.

Подробнее о в руководстве разработчика.

Что такое транзакционный API?

Transactional API добавляет больше интерфейсов к базовому API, чтобы помочь нам удобно выполнять обход, вместо того чтобы писать всю логику обхода с нуля. Эти интерфейсы содержатся в пакете org.neo4j.graphdb.traversal.

Вы можете найти в руководство разработчика.

Отношение между всеми тремя

В соответствии с этим ответом:

API Traversal построен на Core API, а Cypher построен на API Traversal; Итак, все, что вы можете сделать в Cypher, можно сделать с другими 2.

Тот же пример выполняется со всеми тремя

В этом учебнике показаны все три действия для выполнения одной задачи.