Cypher:带约束的最短路径

时间:2013-07-13 16:13:30

标签: java neo4j cypher graph-databases

我想执行如下所示的最短路径查询:

START source=node:myIndex(name="<src>"), destination=node:myIndex(name = "<dst>")                                                                               
MATCH p = shortestPath(source-[:REL1*..5]-destination),
          source-[sourceRel:REL1]-m, 
          destination-[destRel:REL1]-k
WHERE sourceRel.a=<someValue> and destRel.a=<someOtherValue>                                                                                                      
RETURN NODES(p);

我希望得到<src><dst>之间的最短路径,其约束条件是属性a与src的第一个关系具有特定值和dst分别到下一个节点。

但是,neo4j只返回它找到的任何最短路径,而不考虑我的约束。 我究竟做错了什么?在最短路径查询的最短路径的第一个“跳”上指定约束的正确方法是什么?

编辑:我正在使用Neo4j 1.8.2。

2 个答案:

答案 0 :(得分:2)

从2.0.0-M03开始,没有很好的方法将约束引入shortestPath。他们正在研究一种能够做到这一点的新语法,但它仍处于设计阶段。为了做到这一点,你需要采用效率较低的路线,不使用shortestPath,按长度排序并获得与你所有约束相匹配的最短路径。

答案 1 :(得分:0)

现在知道我想要做什么是不可能在当前的Neo4j版本中(感谢Wes),我使用一种解决方法来实现这一目标。 首先,我为src和destination节点获取与约束匹配的下一个节点:

START n=node:myIndex(name="<nodename>")                             
MATCH n<-[rel:REL1]-m
WHERE rel.a=<somevalue>
RETURN m

像这样,我有src和dst的“下一个”节点的两个节点ID。 我现在使用计算这两个节点ID之间的最短路径并预先添加原始源并附加原始目标节点以获取完整路径。 它需要3个查询而不是1个,但可能不像Wes建议的那样昂贵。