2017-05-29 114 views
0

我有这个下面的类型,我得到使用该查询图的关系:获取节点

MATCH (p:Person)-[:REPORTS_TO *]->(c:Person) WHERE p.name="F" 
WITH COLLECT (c) + p AS all 
UNWIND all as p MATCH (p)-[:REPORTS_TO]-(c) 
RETURN p,c; 

enter image description here

用例:

1.我想找到一个节点在节点F上有什么级别? 实施例:

Node `D`, `E` are direct child of `F`, hence they are at level 1 

    Node `A,B,C` are childs of `D` (which is child of `F`) hence level 2 

    Node `X` is child of `A' (which is at level 2), hence level 3 

and so onnnnn.... 

我试图通过引入一个可变i解决这个和在每次迭代增加它(,但它并没有奏效)。

MATCH (p:Person)-[:REPORTS_TO *]->(c:Person) WHERE p.name="F" 
WITH COLLECT (c) + p AS all ,i:int=0 
UNWIND all as p MATCH (p)-[:REPORTS_TO]->(c) 
RETURN p,c, i=i+1; 

2.鉴于两个节点之间找到关系,然后

e.g Find relation between F and X?

预计answer = 3 (as it is at level 3)

我应该如何着手解决这些用例?

注意:来自Neo4j服务器的图形响应不一定需要,Json响应也会很好。

回答

2

UC1使用Pathlength(p)功能

MATCH p=(root:Person)-[:REPORTS_TO *]->(child:Person) 
WHERE root.name="F" 
RETURN nodes(p)[-2], nodes(p)[-1],length(p) 

这将找到根节点的所有路径,并返回对倒数第二个和最后一个节点+级别你想要的。

节点(P) - 节点上路径p列表

[-2] - 从列表的末尾第二节点

UC2:使用shortestPath功能:

MATCH (p1:Person),(p2:Person) 
WHERE p1.name = '..' AND p2.name = '...' 
MATCH p=shortestPath((p2)-[:REPORTS_TO*]->(p2)) 
RETURN length(p) 
+0

非常感谢解决'用例1',但如何进行'用例2' –

+0

@PrakashPandey添加答案uc2 –