Cypher:带约束的最短路径



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

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.0-M03开始,没有任何好的方法可以向shortestPath引入约束。他们正在研究一种新的语法来做到这一点,但它仍处于设计阶段。为了做到这一点,您需要采取不使用shortestPath的效率较低的路线,按长度排序,并获得符合所有约束的最短路线。

现在知道我想做什么在当前的Neo4j版本中是不可能的(感谢Wes),我使用了一个变通方法来实现这一点。首先,我获得了src和目的地节点的下一个匹配约束的节点:

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

像这样,我有src和dst的"next"节点的两个节点ID。我现在使用计算这两个节点ID之间的最短路径,并在原始源之前附加原始目标节点以获得完整路径。它需要3个查询而不是一个,但可能没有Wes建议的方法那么昂贵。

最新更新