Как поиск пути работает на Cypher и какие типы фильтрации могут выполняться во время расширения?

Я пытаюсь понять механику Neo4j при поиске путей. Я изучил шаблоны запросов и операторы плана выполнения в руководстве для разработчиков, но у меня все еще есть некоторые вопросы.

Пожалуйста, исправьте меня, если я ошибаюсь, но из содержимого, которое я прочитал, и из некоторых постов в блоге Neo4j, я понял, что обходы Cypher и Java обычно выполняют поиск в глубину, более точный поиск и что запросы переменной длины подходят внутрь. Я также читал, что планирование кратчайшего пути использует двусторонний поиск в ширину и поиск в глубину как запасной вариант.

Есть ли способ выполнить поиск в ширину в Neo4j, кроме этого?
Я знаю, что библиотека процедур APOC позволяет осуществлять такой поиск через расширители путей, но пока я ограничиваю свою область только языком Cypher.

Кроме того, шаблон переменной длины работает рекурсивно? А какие виды фильтрации выполняются при расширении? Я читал, что такие функции, как ALL, обычно проверяются во время расширения, но некоторые выполняются позже.

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

Простите, если эти вопросы тривиальны. Заранее спасибо.

0 ответов

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

Для рекурсивного запуска шаблона переменной длины мы можем использовать клин звезду над метками одного ребра, например:KNOWS*, или мы можем использовать оператор or в cypher, например:KNOWS|FOLLOWS* в cypher. По сути это означает (ЗНАЕТ | СЛЕДУЕТ)* в формате запроса обычного пути (RPQ). Что эквивалентно (a|b)* в синтаксисе регулярного выражения. У нас также может быть больше меток ребер, таких как (a|b|c|....)* в шифре.

Мы также можем указать длину вариабели по шаблону как ()-[:KNOWS|FOLLOWS*1..6]->() в шифре.

Однако мы не можем делать рекурсивные итерации по нескольким шаблонам, например, подграфу, который имеет узел с одним входящим ребром и по крайней мере два выходящих ребра из одного и того же узла. например шаблон, такой как этот (a)-[r]->(b)-[s]->(c), (b)-[v]->(d). Это пример конъюнктивной модели.

Фильтрация обычно выполняется в предложении WHERE на основе пар значений ключа свойства. Мы можем установить метки в шаблоне, выраженном в предложении MATCH, чтобы базовый механизм знал начальный узел. Например, как это сделано в следующем запросе

match (a:Person{имя:'Киану Ривз'})-[r]->(b) возврат * предел 5

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