2013-06-24 76 views
1

我遷移到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」的節點。

我試着用幾種替代方法重寫查詢,但似乎無法可靠地得到我想要的結果與棄用匹配!運營商。也許這只是越來越晚了,我錯過了明顯的東西? :)

任何幫助表示讚賞!

謝謝, 馬克。

回答

6

我認爲提出異常的第二個查詢是一個錯誤。

你可以做的是使用de Morgan's law改造斷言:

MATCH n 
WHERE NOT (HAS (n.name)) OR (n.name <> 'Peter') 
RETURN n 
+0

托馬斯的建議是正確的。他對錯誤也是正確的,儘管未來的Neo4j版本可能會將缺少的名稱屬性視爲null,而不是拋出異常。 –

+0

謝謝,這是值得提出這個錯誤嗎? – markglh

+1

因此,澄清它看起來像任何時候否定HAS子句並將它用在一起會導致此錯誤。 – markglh