排除基于关系参数的关系

时间:2013-03-11 09:28:28

标签: neo4j cypher

我有一个neo4j cypher遍历问题。

设置: 我有一个查询从节点“a”开始,并给我所有路径的关系“FOO”。所有这些“FOO”关系都具有参数“BAR”。参数“BAR”可以具有2(或更多)值“1”和“2”。现在我想排除包含一个或多个FOO.BAR =“2”关系的所有路径。

查询:START a = node(x)MATCH a- [rh:FOO *] - > b RETURN rh; rh给了我所有可能的路径,但我不知道如何添加关于关系的标准。

我在控制台中创建了一个场景(http://console.neo4j.org/?id=219eub


    create 
    (a  {name:"A"}),
    (b {name:"B"}),
    (c  {name:"C"}),
    (d  {name:"D"}),
    b-[:FOO{BAR:'1'}]->a,
    d-[:FOO{BAR:'1'}]->a,
    c-[:FOO{BAR:'2'}]->b,
    d-[:FOO{BAR:'1'}]->c

    START n=node(4) 
    MATCH n-[rh:FOO*]-b 
    RETURN rh;

这给了我 查询结果


    +---------------------------------------------------------------------------+
    | n.name | rh                                                      | b.name |
    +---------------------------------------------------------------------------+
    | "D"    | [:FOO[2] {BAR:"1"}]                                     | "A"    |
    | "D"    | [:FOO[3] {BAR:"1"}]                                     | "C"    |
    | "D"    | [:FOO[3] {BAR:"1"},:FOO[1] {BAR:"2"}]                   | "B"    |
    | "D"    | [:FOO[3] {BAR:"1"},:FOO[1] {BAR:"2"},:FOO[0] {BAR:"1"}] | "A"    |
    +---------------------------------------------------------------------------+

但我只想要


    +---------------------------------------------------------------------------+
    | n.name | rh                                                      | b.name |
    +---------------------------------------------------------------------------+
    | "D"    | [:FOO[2] {BAR:"1"}]                                     | "A"    |
    | "D"    | [:FOO[3] {BAR:"1"}]                                     | "C"    |
    +---------------------------------------------------------------------------+

1 个答案:

答案 0 :(得分:1)

由于rh是一个集合,您可以应用predicate functions

START n=node(4) 
MATCH n-[rh:FOO*]->b 
WHERE not any(r in rh where r.BAR="2") 
RETURN rh;