遍历graphdb到n度

时间:2014-05-14 19:54:38

标签: neo4j cypher traversal

我不知所措。

场景:从Joe获得2的深度(#'代表' Person'。字母代表'位置')

    0              E
    |              |
    1              B 
 /  |  \         / | \
2  JOE  3       C  A  D
   /|\            /|\
  0 0 0          F G H
 /\ | |         /\ | | 
0 0 0 0        I J K L

Catch是,一个人被绑在一个位置上。职位彼此之间存在关系,但一个人与另一个人没有关系。所以它类似于:

Joe<-[:occupied_by]-(PositionA)-[:authority_held_by]->
(PositionB)-[:occupied_by]->Sam

此查询:

Match (:Identity {value:"1234"})-[:IDENTIFIES]->(posStart:Position)
-[:IS_OCCUPIED_BY]->(perStart:Person) 
Optional Match p=(perStart)<-[:IS_OCCUPIED_BY]-(posStart)
-[r:AUTHORITY_HELD_BY*..1]-(posEnd:Position)-[:IS_OCCUPIED_BY]->
(perEnd:Person) Return p

确实得到了我需要的东西,但总是将第一列作为它开始的原始节点(perStart)返回。我希望以前两列始终表示起始节点和第二列表示结束节点的方式返回它。

PositionA, PositionB  (and we can infer this means A-[:authority_held_by]->B

如果我们有双向关系,例如A - [:authority_held_by] - &gt; B和B - [:manage] - &gt; A 我不会介意第一列或第二列中的内容,因为我们可以让第三列代表关系

PositionB, PositionA, [:manages]

但我们正试图远离双向关系

最终我想要的是:

PositionA, PositionB   (inferring, A-[:A_H_B]->B)
PositionB, PositionE   (inferring, B-[:A_H_B]->E)
PositionF, PositionA   (inferring, F-[:A_H_B]->A)
PositionG, PositionA   (inferring, G-[:A_H_B]->A)

这可能与密码有关,还是我必须做一些黑魔法? :)

我希望我能够彻底解释并理解......提前谢谢你们!

1 个答案:

答案 0 :(得分:1)

将用 -

替换Return p
RETURN nodes(p)[0] AS START, LAST(nodes(p)) as last 

工作?