2013-03-11 58 views
1

我有一个neo4j密码遍历问题。根据关系参数排除关系

设置: 我有一个查询,在节点“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

由于rh是收集你可以申请predicate functions

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

解决了,pff,我觉得这样的noob。当你看到sollution它是sooo deuh ;-)我必须承认,谓词函数和使用/嵌套WHERE是一些习惯(我不是)。谢谢Stefan,你让我的一天。 – steven 2013-03-11 12:38:08

+1

最大的区别在于'rh'是一个可变长度路径中的集合,与正常匹配的单个关系相比。 – 2013-03-11 13:59:12

+0

用'WHERE rh.BAR = 1'而不是上面的过滤器过滤有什么区别? – ulkas 2013-03-12 08:31:18