Neo4j技术问询:如何查询指定节点到Stop:true节点的完整路径
解决Neo4j查询:获取到第一个Stop:true节点的路径
你的核心需求是找到从指定节点出发,直到第一个带有Stop:true属性的节点的完整路径(包含该Stop节点),原来的查询逻辑刚好搞反了,而且没有限制路径不能穿过Stop节点,所以才会返回多余的节点。
正确的Cypher查询语句
MATCH p=(a:Node{id:1})-[*]->(b:Node{Stop:True}) WHERE ALL(node IN nodes(p)[..-1] WHERE NOT node.Stop = true) RETURN p
为什么这个查询能满足需求?
- MATCH子句:明确匹配从
id=1的节点出发,到任意一个Stop:true节点的路径(这里用->表示有向关系,如果你的图是无向的,可以改成-[*]-)。 - WHERE条件:用
ALL()函数检查路径上除最后一个节点(也就是目标Stop节点)之外的所有节点,确保它们的Stop属性都不是true。这就保证了这条路径是从起点到第一个Stop节点的路径,不会包含Stop节点之后的其他节点——因为如果路径穿过了Stop节点继续延伸,那中间节点里就会包含这个Stop节点,不符合WHERE的过滤条件。
原来的查询问题出在哪?
你之前的WHERE NOT b.Stop = true是在排除所有Stop节点,这和你要包含Stop节点的需求完全相反;同时-[*]-会匹配任意长度的无向路径,所以即使你排除了Stop节点,也会返回起点到其他非Stop节点的所有路径,包括那些连接到Stop节点之后的节点的路径。
用你给出的节点链例子,这个新查询会精准返回(id:1,Stop:false)-(id:2,Stop:false)-(id:3,Stop:false)-(id:4,Stop:false)-(id:5,Stop:false)-(id:6,Stop:True)这条路径,不会包含7、8节点。
内容的提问来源于stack exchange,提问作者FARSOS BULSARA
相关产品推荐
相关产品推荐

