Повторяющийся паттерн отношений в шифре - PullRequest
2 голосов
/ 09 мая 2019

Предположим, у меня есть узлы, которые могут быть соединены набором путей, например:

(x:Class {code:'xxx'})<-[:a]-()-[:b]->()<-[:a]-()-[:b]->()<-[:a]-()-[:b]->()<-[:a]-()-[:b]->(y:Class{code:'yyy'})

Может быть переменное число <-[:a]-()-[:b]-> между x и y. Как я могу получить кратчайший путь, если он существует между x и y?

1 Ответ

2 голосов
/ 10 мая 2019

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

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

В этом случае нам нужно также включить labelFilter, чтобы указать, какой узел в интересующей нас последовательности. Или мы можем просто использовать параметр конфигурации sequence вместо фильтров меток и отношений.

MATCH (start:Class {code:'xxx'}), (end:Class{code:'yyy'})
CALL apoc.path.expandConfig(start, {endNodes:[end], sequence:'>Class, <a, *, b>', limit:1}) YIELD path
RETURN path

Мы поставляем интересующие нас конечные узлы (поскольку мы уже знаем их, мы уже сопоставили их), затем мы предоставляем последовательность чередующихся меток узлов и типов отношений (используя * в качестве отдельного элемента для узла любой метки и с использованием префикса > в качестве фильтра конечного узла, что означает, что мы хотим, чтобы пути заканчивались следующим образом: узел класса в этой позиции последовательности).

Процедуры расширителя пути используют расширение в ширину, а limit:1 означает первый путь, который мы встречаем к узлу, который является одновременно конечным узлом и который удовлетворяет шаблону последовательности (a: узел класса в этой точке в повторяющаяся последовательность) будет нашим кратчайшим путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...