2016-02-25 90 views
1

我想要一个以2个给定节点开始的查询,并且每个节点都需要最多5个相关节点(通过关系R1),然后查找这10个节点之间的shortestPath(第一个5个和第二个5个原始节点)。如何将我的Cypher查询分解为2个子查询?

我无法设法将查询分解成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分别计算后,匹配的最短路径。可以这样做吗?

谢谢!

+0

你可以pelase在伪代码中写出你想要的两个查询吗?只是为了知道您对每个查询所期望的结果 – Supamiu

回答

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最短路径。在他们之中,我们按长度分类并挑选第一个。

+0

谢谢! UNWIND取得了诀窍。我不知道这件事。交叉产品是我想要的。 –