按shortestPath排序,不包括断开连接的节点

时间:2019-05-30 14:11:11

标签: neo4j cypher

我正在尝试在我的社交图中实施“查找朋友”功能,并使其尽可能对用户友好,因此我想以最短路径对查询结果进行排序(这样一来, “朋友圈”将首先显示。但是,如果您正在寻找的人与您当前的网络完全脱节,那么您仍应与之没有任何关系的结果(即没有最短的路径)。

我当前的查询是(如果用户输入了“帐单”)

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个,则忽略最短路径”?

1 个答案:

答案 0 :(得分:1)

您需要对节点之间的路径使用OPTIONAL MATCH:

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