2017-02-07 64 views
2

我無法返回與特定屬性沒有關係的節點。爲什麼Neo4j無功能在我的查詢中工作?

下面就來建立圖的情況下,查詢:

create ({Name:'Foo1'})-[:T]->({Name:'Bar'})<-[:T{Inactive:true}]-({Name:'Foo2'})<-[:T]-({Name:'Foo3'}) 

我們指定期望的結果更多: 我想所有以某種方式連接到「酒吧」的節點。所以從上面的查詢創建的圖表我希望得到Foo1和Foo3。

我有那些不使用下列查詢「無效」財產有關係麻煩節點:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID** 
optional match (foo)-[r]->() where r in rs 
with foo, collect(distinct r) as relationships 
where none(rel in relationships where rel.Inactive = true) 
return foo 

現在,您可能會注意到查詢與第二位的盛會where子句。它是解決不同問題的一部分,所以請不要專注於該部分,除非它是我的問題的一部分。我感興趣的是查詢無法返回任何內容的原因。看來none()函數的謂詞無法正常工作。特別是因爲與任何()更換無()將只返回foo2的預期,像這樣:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID** 
optional match (foo)-[r]->() where r in rs 
with foo, collect(distinct r) as relationships 
where any(rel in relationships where rel.Inactive = true) 
return foo 

所以,再一次,問題是爲什麼使用無()功能ISN查詢什麼都不回來。首先,我認爲它可能與某些沒有「非活動」屬性但docs的關係有關,它們告訴您缺少的屬性評估爲false(因爲它爲空)。至少,這是我的解釋,當然可能是錯的。

我對這個問題的解決方案並不感興趣,因爲我已經編寫了另一個返回Foo1和Foo3的查詢。 我想知道爲什麼查詢的問題不起作用。

回答

1

這是工作與Null特異性:

WITH [ null, false ] as values 
RETURN none(value in values where value = true) 

// return Null 

with true as val where not (null = true) 
return val 

// returns nothing 

[]

所以,你需要檢查null

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID** 
optional match (foo)-[r]->() where r in rs 
with foo, collect(distinct r) as relationships 
with foo, none(rel in relationships where rel.Inactive = true) as logic 
      where logic is null or logic = true 
return foo 

或者,您可以檢查是否Inactive是否存在:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID** 
optional match (foo)-[r]->() where r in rs 
with foo, collect(distinct r) as relationships 
where none(rel in relationships where exists(rel.Inactive) and rel.Inactive = true) 
return foo 
相關問題