Это может сработать для вас:
MATCH p=(s:Server)-[:AFFINITY*..4]-(:Server)
WHERE
s.name = 'XYZ' AND
ALL(i IN RANGE(0, LENGTH(p)-1) WHERE
NONE(j IN RANGE(i+1, LENGTH(p)) WHERE NODES(p)[i] = NODES(p)[j]))
RETURN NODES(p)
Кроме того, если допустимо сделать шаблон отношения -[:AFFINITY*..4]-
направленным (путем размещения стрелки на одном конце), тогда запрос должен быть еще быстрее .
[ОБНОВЛЕНИЕ]
Основываясь на ваших комментариях, ниже я предполагаю, что шаблон отношения изменен на направленный и используется уменьшенная верхняя граница 3. Чтобы получить результат, более близкий к ваши исходные результаты:
MATCH p=(s1:Server)-[:AFFINITY*..3]->(s2:Server)
WHERE
s1.name = 'XYZ' AND
(LENGTH(p) = 3 OR NOT (s2)-[:AFFINITY]->(:Server)) AND
ALL(i IN RANGE(0, LENGTH(p)-1) WHERE
NONE(j IN RANGE(i+1, LENGTH(p)) WHERE NODES(p)[i] = NODES(p)[j]))
RETURN NODES(p)
Этот запрос возвращает результаты для самых длинных путей, которые не превышают границы.