穿越到第n级

时间:2014-04-14 21:36:43

标签: collections 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 :(得分:0)

ok - 所以您要查找的基本查询是: match(m) - [* 0..2] - (n)其中m.name =&#39; Joe&#39;返回m,n

但是,我似乎无法获得一个参数来代替&#39; 2&#39; - 另外,当我尝试为链接做参考时,例如r:* 0..2 - 它真的不是那样的。在玩完它之后 - 这里是我最接近的地方:

匹配p =(m) - [has_a_position_of | is_occupied_by | manage | managed_by * 0..4] - (n:Person)其中m.name =&#39; Joe&#39;和长度(p)&lt; = {depth}返回distinct n

其中{depth}是请求最大深度的参数,0..4是您的最大允许深度&#39;和has_a_position_of | is_occupied_by | manage | managed_by是数据库中的关系类型。我现在无法找到一种方法让它对任何关系都是通用的,而且表现相当邋 - - 我会啄它 - 但是其他人可能会帮助改进它。