使用节点属性过滤器查找2个节点之间的最短路径

时间:2013-04-01 21:49:11

标签: neo4j cypher

我有一个图形数据库,它由一个名为“is_in_operation”的属性的节点(公交车站)组成,如果公交车站正常运行,则设置为“真”;否则设置为“false”。

如果公交车在两个车站之间行驶,则两个节点之间会建立关系。

我想在两个节点之间找到路径最短的路径,路径中的所有节点都可以运行。

数据库中有一个示例,其中2个指定节点之间有2条路径。两个路径中的所有节点的“is_in_operation”属性都设置为“true”。当我运行以下查询时,我得到了正确的答案

START d=node(1), e=node(5) 
MATCH p = shortestPath( d-[*..15]->e ) where all (x in nodes(p) where x.is_in_operation='true')
RETURN p;

当我为最短路径中的一个中间节点设置'is_in_operation'属性为'false'并重新运行查询时,我希望它返回另一个路径。但是,我根本没有回答。

查询不正确吗?如果是这样,我该如何指定查询?

1 个答案:

答案 0 :(得分:3)

问题是shortestPath无法考虑where子句,因此您匹配最短路径,然后将其与where一起过滤。

这个怎么样 - 它可能没有shortestPath那么高效,但它应该返回一个结果,如果存在的话:

START d=node(1), e=node(5) 
MATCH p = d-[*..15]->e
where all (x in nodes(p) where x.is_in_operation='true')
RETURN p
order by len(p)
limit 1;