如何将Cypher查询分解为2个子查询?

时间:2016-02-25 08:54:58

标签: neo4j cypher

我希望有一个以2个给定节点开头的查询,并且每个节点最多需要5个相关节点(按关系R1),然后查找这10个节点之间的最短路径(5个节点中的5个节点和5个节点之间的最短节点)第二个原始节点。)

我无法逃脱"打破"我的查询分为2个部分,每个部分计算5个节点,然后匹配两个部分的路径。

到目前为止,我的查询是:

MATCH (n1:MyNode {node_id:12345})-[:R1]-(r1:RelatedNode)
WITH r1 LIMIT 5
MATCH (n2:MyNode {node_id:98765})-[:R1]-(r2:RelatedNode)
WITH r1,r2 LIMIT 5
MATCH p=shortestPath( (r1)-[*1..10]-(r2) )
RETURN p

问题是第二个子查询与第​​一个子查询没有真正分离,仍然继续r1,这使得LIMIT出错。

我想运行第一部分,然后运行第二部分(仅使用r2),然后在分别计算r1r2后,匹配最短路径。可以这样做吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

不确定我是否正确理解您的要求。我假设你想找到n1n2的前五个邻居之间的最短路径。

我猜你必须将有限的结果作为集合传递,然后UNWIND将其传递出去:

MATCH (n1:MyNode {node_id:12345})-[:R1]-(r1:RelatedNode)
WITH r1 LIMIT 5
WITH collect(r1) as startNodes
MATCH (n2:MyNode {node_id:98765})-[:R1]-(r2:RelatedNode)
WITH r2, startNodes LIMIT 5
WITH collect(r2) as endNodes, startNodes
UNWIND startNodes as s UNWIND endNodes as e
MATCH p=shortestPath( (s)-[*1..10]-(e) )
RETURN p, length(p) ORDER BY length(p) ASC LIMIT 1

请注意,这两个UNWIND基本上会创建一个交叉产品。所以你计算了5 * 5 = 25条最短路径。其中我们按长度排序并选择第一个。