Как уже упоминалось в комментариях, процедуры расширения пути из процедур 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: узел класса в этой точке в повторяющаяся последовательность) будет нашим кратчайшим путем.