2013-03-11 113 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