Neo4J:如何在allShortestPaths中排除自引用节点?
解决allShortestPaths中排除自引用节点的问题
你这是被自环关系(节点指向自己的CONNECTED_TO关系)干扰了最短路径的结果对吧?别担心,只需要给路径加上节点唯一性的约束就能轻松解决这个问题。
修改后的查询语句
MATCH (n:Person{email:'sam@gmail.com'}), (k:Person{email:'joseph@gmail.com'}), paths=allShortestPaths((n)-[r:CONNECTED_TO*..2]->(k)) WHERE length(paths)=2 AND all(node in nodes(paths) | single(dupNode in nodes(paths) where dupNode = node)) WITH collect(paths) as path UNWIND path as p RETURN nodes(p) as nodes, rels(p) as relations
关键说明
- 节点唯一性约束:
all(node in nodes(paths) | single(dupNode in nodes(paths) where dupNode = node))这个条件会检查路径里的每个节点在整条路径中只出现一次,既能排除sam->sam这类自环情况,也能杜绝其他可能的循环路径。 - 如果你觉得上面的约束写法偏长,也可以用更简洁的等价表达式:
size(nodes(paths)) = size(DISTINCT nodes(paths)),两者效果完全一致。
为什么不直接在关系上过滤自环?因为哪怕你过滤了单个自环关系,更长路径里可能出现sam->a->sam->joseph这类循环(虽然你现在限制了长度为2不会出现,但节点唯一性约束能从根源上解决所有重复节点的问题,适用性更广)。
内容的提问来源于stack exchange,提问作者idrisjafer
相关产品推荐
相关产品推荐

