如何在路径输出中排除节点的角色

时间:2016-04-07 00:15:40

标签: neo4j cypher

我有一张图表。一些节点是角色扮演,例如一个节点Leena还有一个头像AltLeena。 Leena可以有很多化身。

    create (jacob {Desc:"Jacob",level:"start"})
        ,(leena{Desc:"Leena"})
        ,(bob{Desc:"Bob",level:"end"})
        ,(brad{Desc:"Brad"})
        ,(jacob)-[:LIKES]->(leena)
        ,(leena)-[:LIKES]->(bob)
        ,(leena)-[:LIKES]->(brad)
        ,(jacob)-[:FRIENDS]->(brad)
        ,(kyle{Desc:"Kyle",level:"start"})
        ,(rick{Desc:"Rick"})
        ,(kyle)-[:LIKES]->(leena)
        ,(kyle)-[:LIKES]->(rick)
        ,(rick)-[:LIKES]->(brad)
        ,(rick_avatar{Desc:"AltRick",Type:"Avatar"})
        ,(leena_avatar{Desc:"AltLeena",Type:"Avatar"})
        ,(bill{Desc:"Bill"})
        ,(bill_avatar{Desc:"AltBill",Type:"Avatar"})
        ,(maya{Desc:"Maya",level:"end"})
        ,(kyle)-[:LIKES]->(rick_avatar)
        ,(rick_avatar)-[:LIKES]->(brad)
        ,(jacob)-[:LIKES]->(leena_avatar)
        ,(leena_avatar)-[:LIKES]->(brad)
        ,(brad)-[:LIKES]->(bill)
        ,(brad)-[:LIKES]->(bill_avatar)
        ,(bill)-[:LIKES]->(maya)
        ,(bill_avatar)-[:LIKES]->(maya);

这看起来像 Graph

现在在CQL中,我正在尝试实现任意2个节点之间的路径,如下所示

  1. 如果起始节点和结束节点不是头像,则返回没有头像节点的路径

  2. 如果起始节点和结束节点中的任何一个是头像,则返回中间没有头像节点的路径

  3. 为了解决这个问题,我在非头像节点中引入了另外一个属性Type:'Original'并尝试了这个查询

    match p=({level:'start'})-[:LIKES*1..2]->({Type:'Original'})-[:LIKES*1..2]->({level:'end'}) return p
    

    但这仍然给我错误的结果。有解决方案吗或者我采取了错误的做法?

    由于

1 个答案:

答案 0 :(得分:0)

问题是[:LIKES * 1..2]返回了你不想要的节点,所以需要像这样过滤掉它们:

match p=(b {level: "start"})-[r*1..4]-(e {level: "end"})
where all (var in nodes(p) where not exists(var.Type) or var = b or var  = e) 
return p

(A 1..4范围获得更多结果)

我认为 var = b或var = e 将允许端点为“头像”类型节点。

var in nodes p
从路径“p”中提取节点,WHERE NOT EXISTS()检查节点中是否存在“类型”属性而不是