我遷移到Neo4j的1.9和更新CYPHER查詢根據deprecations遷移指南,具體包括:的Neo4j 1.9 Cypher支架與問題「有」條款
的! Cypher表達式中的屬性運算符,如node.property! = 「值」已被棄用,請使用has(node.property)AND node.property =「value」來代替。
的問題是,在組合使用HAS子句不的時候,我不能得到預期的結果。例如:
當狀態屬性存在並設置爲 「DONE」 以外的東西:
AND not(n.status! = "DONE")
判斷爲真(預期)
AND not(has(n.status) AND n.status = "DONE")
判斷爲假???
當狀態屬性不存在
AND not(n.status! = "DONE")
判斷爲假
AND not(has(n.status) AND n.status = "DONE")
拋出異常,因爲節點不存在,想必HAS應該阻止這個?就好像將支票包在而不是可以防止HAS支票被執行。
這可以通過使用live query examples on the neo4j docs website以下查詢被複制:
MATCH n
WHERE NOT (n.name! = 'Peter')
RETURN n
這將返回所有(3)節點無論是誰沒有名字或名字不是「彼得」。這是我想要重現的結果,但不使用現在棄用的「!」運營商。
MATCH n
WHERE NOT (HAS (n.name) AND n.name = 'Peter')
RETURN n
拋出節點未找到異常,因爲一個節點沒有name屬性。 :/
MATCH n
WHERE (HAS (n.name) AND n.name = 'Peter')
RETURN n
正確返回名爲「Peter」的節點。
我試着用幾種替代方法重寫查詢,但似乎無法可靠地得到我想要的結果與棄用匹配!運營商。也許這只是越來越晚了,我錯過了明顯的東西? :)
任何幫助表示讚賞!
謝謝, 馬克。
托馬斯的建議是正確的。他對錯誤也是正確的,儘管未來的Neo4j版本可能會將缺少的名稱屬性視爲null,而不是拋出異常。 –
謝謝,這是值得提出這個錯誤嗎? – markglh
因此,澄清它看起來像任何時候否定HAS子句並將它用在一起會導致此錯誤。 – markglh