Если все отношения или узлы должны придерживаться одного и того же предиката, это легко.Вам понадобится переменная для пути, и вам нужно будет использовать all()
(или none()
) в предложении WHERE, чтобы применить предикат для всех отношений или узлов в вашем пути:
MATCH p = (n:Node {name: 'n1'})-[*..2]->()
WHERE all(rel in relationships(p) WHERE type(rel) = 'r1')
RETURN p
Тем не менее, когда все, что вам нужно, - это чтобы все отношения в пути var-length были одного типа (или типов, если вы хотите несколько), лучше всего это сделать в самом шаблоне:
MATCH p = (n:Node {name: 'n1'})-[:r1*..2]->()
RETURN p
Для более сложных случаев, таких как множественные типы отношений (где порядок этих типов имеет значение в пути) или повторяющиеся последовательности типов или меток узлов в пути, тогда требуются альтернативные подходы. расширители пути APOC может помочь.
РЕДАКТИРОВАТЬ
Вы упомянули в комментариях, что ваш случай имеет дело с последовательностями отношений различной длины.Хотя расширители пути APOC могут помочь, есть несколько ограничений:
В настоящее время расширители пути работают с метками узлов и типами отношений, но не со свойствами, поэтому, если ваши расширения зависят от предикатовв свойствах расширители пути не смогут обработать это для вас во время расширения, что должно быть сделано путем фильтрации результатов расширителя пути после.
Существуют ограничения дляподдержка последовательности отношений для расширителей пути.Мы можем определять последовательности любой длины и принимать несколько типов отношений на каждом шаге в последовательности, но в настоящее время мы не поддерживаем расходящиеся последовательности ((r1, затем r2, затем r3) или (r2, затем r5, затем r6)).
Если мы хотим сделать трехшаговую последовательность r1 (входящий), r2 (исходящий), затем r3 или r4 (с r3 в любом направлении и r4 исходящим), повторяя последовательность вверх3 раза мы могли бы сделать это следующим образом:
MATCH (n:Node {name: 'n1'})
CALL apoc.path.expandConfig(n, {relationshipFilter:'<r1, r2>, r3 | r4>', minLevel:1, maxLevel:9) YIELD path
RETURN path
Обратите внимание, что мы можем предоставить разные направления для каждого отношения в фильтре или полностью исключить стрелку, если нам не важно направление.
Фильтрация меток более сложна, но я пока не вижу необходимости в этом в примерах.