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
謝謝!
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
謝謝!
你得到意想不到的結果的原因是由於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
比賽:人那裏沒有從這些關係節點:人到:電影節點。
我們可以省略返回關係類型和電影節點,因爲根據您的匹配,這些不存在。