Neo4j Traversal API против Cypher

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

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

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

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

Какие-нибудь мысли?

2 ответа

Решение

Главное, что следует помнить о 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 потому что дружеские ссылки могут вернуться к исходному человеку)

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

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

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

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

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

Отрывок из книги

Базовое API, Traversal Framework или Cypher?

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

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

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

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

Что такое шифр?

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

Вы можете найти больше об этом здесь.

Что такое ядро ​​API практически?

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

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

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

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

Что такое API обхода практически?

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

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

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

Согласно этому ответу:

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

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

Этот урок показывает все три в действии для выполнения той же задачи.

Другие вопросы по тегам