2017-02-04 64 views
1

Neo4j在圖中有4個人節點; 2與Movie節點有關係,與其他2沒有關係。Neo4j可選匹配不返回空

期望下面的查詢返回只有2個節點沒有關係,但它返回所有。

讓我知道在查詢中是否有任何遺漏。我是Neo4J的新手

MATCH (p:Person) 
OPTIONAL MATCH (p) -[r]- (m:Movie) 
Where type(r) = null 
Return p,type(r),m 

謝謝!

回答

0

你得到意想不到的結果的原因是由於WHERE子句的位置和含義,以及它與OPTIONAL MATCH行爲的相互作用。

WHERE只適用於前面的MATCH,OPTIONAL MATCH或WITH。在這種情況下,它並不適用於查詢的所有結果,它只適用於OPTIONAL MATCH,而且它的行爲與您期望的完全不同。

它可以幫助你隔離開來,並期待在可選的匹配和單獨WHERE:

OPTIONAL MATCH (p) -[r]- (m:Movie) 
Where type(r) = null 

這意味着:通過關係r電影m,其中r是零:由對可選匹配到。你不能有一個存在的關係,但它的類型爲空,這是不可能的,所以這個可選匹配總是失敗。

但是因爲它是一個可選匹配,所以不會刪除行,而是不匹配的元素將爲空。結果是具有以下內容的行:Person p(來自您先前的匹配),而null(類型(r)和m)。

你實際上想要的是首先執行一個可選的匹配,然後過濾出類型爲空的行。你想要一個WHERE影響查詢的所有行,而不是可選MATCH。

這就要求我們增加一個WITH子句和後移動WHERE:

MATCH (p:Person) 
OPTIONAL MATCH (p) -[r]- (m:Movie) 
WITH p, r, m 
Where type(r) = null 
Return p, type(r), m 

移動從可選匹配到與在WHERE改變它的意義,它現在將適用於所有行的查詢,並且由於它不再與可選匹配關聯,它將實際刪除不適合謂詞的行,而不是將行和設置元素保留爲空。現在

,所有的說,還有一個更簡單的查詢返回你想要的東西,而無需使用可選的比賽在所有:

MATCH (p:Person) 
WHERE NOT (p)--(:Movie) 
RETURN p 

比賽:人那裏沒有從這些關係節點:人到:電影節點。

我們可以省略返回關係類型和電影節點,因爲根據您的匹配,這些不存在。