Примерно так должно работать:
MATCH p=(:Foo)-[:followedBy*]->(:Foo)
WHERE
($minAngle <= REDUCE(s=0, x IN NODES(p) | s + x.angle) <= $maxAngle) AND
($minDist <= REDUCE(t=0, y IN RELATIONSHIPS(p) | t + y.distance) <= $maxDist)
RETURN p;
Предположения:
- Все соответствующие узлы имеют метку
Foo
.
- Все соответствующие отношения имеют тип
followedBy
.
- Когда вы делаете запрос, вы передаете параметры
maxAngle
, minAngle
, maxDist
и minDist
.
Примечание: предложение MATCH
автоматически отфильтровывает совпадения, в которых будут повторно использоваться одни и те же отношения, удовлетворяя ваш запрет на "более одного раза" обхода отношений.
Предупреждение: шаблоны переменной длины (включающие в себя *
) могут вызвать ошибки нехватки памяти и / или занять очень много времени. Вы можете установить разумную верхнюю границу (например, [:followedBy*..6]
).