Я пытаюсь внедрить функцию «найти своих друзей» в своем социальном графе, и, чтобы сделать ее максимально удобной для пользователя, я хочу упорядочить результаты моего запроса по кратчайшему пути (так, чтобы кто-то уже в вашем «круге друзей друзья" появится первым). Тем не менее, результаты, с которыми у вас еще нет никаких отношений (т. е. нет кратчайшего пути к ним), все же должны быть включены, если человек, которого вы ищете, полностью отключен от вашей текущей сети.
Мой текущий запрос (если пользователь ввел «Счет»):
MATCH (u:User), (me:User), path=shortestPath((me)-[:WORKED_ON]-(u))
WHERE u.first_name =~ '(?i)Bill.*'
OR u.last_name =~ '(?i)Bill.*' AND
me.user_id='someuserid1234'
RETURN u, path
ORDER BY LENGTH(path) ASC
Это выполняет «упорядочение по кратчайшему пути», но исключает из результата любые несвязанные узлы.
Есть ли способ сказать «упорядочить по кратчайшему пути, если пути нет, и в этом случае, возможно, используйте длину пути 20»? Или, может быть, «упорядочить по кратчайшему пути, но если результатов меньше X, игнорировать кратчайший путь»?





Вам нужно использовать ДОПОЛНИТЕЛЬНОЕ СОВПАДЕНИЕ для пути между узлами:
MATCH (u:User), (me:User)
WHERE u.first_name =~ '(?i)Bill.*'
OR u.last_name =~ '(?i)Bill.*' AND
me.user_id='someuserid1234'
OPTIONAL MATCH path=shortestPath((me)-[:WORKED_ON*]-(u))
RETURN u, coalesce(LENGTH(path), 20) as distance
ORDER BY distance ASC