2016-12-10 56 views
1

我想回到所有節點一個b,其中b不是通過與關係相對開始的任何路徑一個下游。我不斷髮現自己不得不編寫一個條件,其中一個通過相對,還有一個間接的情況下直接鏈接到b的情況下,導致了這樣的事情:暗號:量化的零個以上的節點,然後-關係

//Semi-pseudo-code. 
match   (a)-[*]->(b) 
optional match dir=(a)-[:rel]->(b) 
optional match indir=(a)-[:rel]-()-[*]->(b) 
where   length(dir)=0 
and    length(indir)=0 
return   a,b 

有更簡單的方法?真的,我想是這樣的,在這裏裸量詞表示「零個或多個節點,然後-關係」:

match   (a)-[*]->(b) 
match not  (a)-[:rel]-*->(b) 
return   a,b 

注:我懷疑這可能從根本是一樣的我的最後一個問題:Cypher: Matching nodes at arbitrary depth via a strictly alternating set of relations

回答

2

我們可以使用WHERE NOT制定負的條件下,以類似的方式,以你的第二個半僞代碼:

MATCH  (a)-[*]->(b) 
WHERE NOT ((a)-[:rel]->()-[*1..]->(b)) 
RETURN a, b 

當然,這將是什麼,但有效的,所以你至少應該嘗試限制標籤和b以及它們之間的關係,例如, (a:Label1)-[:rel1|rel2*]->(b:Label2)

一個例子:

CREATE 
    (n1:N {name: "n1"}), 
    (n2:N {name: "n2"}), 
    (n3:N {name: "n3"}), 
    (n4:N {name: "n4"}), 
    (n5:N {name: "n5"}), 
    (n1)-[:x]->(n2), 
    (n3)-[:rel]->(n4), 
    (n4)-[:x]->(n5) 

enter image description here

查詢結果:

╒══════════╤══════════╕ 
│a   │b   │ 
╞══════════╪══════════╡ 
│{name: n1}│{name: n2}│ 
├──────────┼──────────┤ 
│{name: n4}│{name: n5}│ 
└──────────┴──────────┘ 

正如你所看到的,它不包括n3n5,因爲它有一個開始:rel關係。

+0

感謝您的回覆。但是,您的代碼是否仍然與直接案例相匹配?: (a) - [:rel] - >(b) 我需要排除該情況。 (或者我誤解了?) –

+0

好點 - [可變長度關係](https://neo4j.com/docs/developer-manual/current/cypher/#_variable_length_relationships)缺省爲1的「minHops」值。I fixed該查詢將在一分鐘內添加一個示例。 –

1

這應該工作:

MATCH (a)-[rs*]->(b) 
WHERE TYPE(rs[0]) <> 'rel' 
RETURN a, b; 

但是,下面的查詢應該是更高性能,因爲它過濾掉所有不需要的路徑開始它非常昂貴的可變長度路徑搜索之前。 *0..語法使得可變長度搜索對長度使用下限0(因此x也將作爲b返回)。

MATCH (a)-[r]->(x) 
WHERE TYPE(r) <> 'rel' 
MATCH (x)-[*0..]->(b) 
RETURN a, b; 
相關問題