2014-02-24 39 views
2

我想創建一個獨特的節點,如果它不存在,並將它連接到另一個節點,如果沒有關係。使用合併/創建唯一

在這個例子中,我想獲取或創建2001年的Year節點。如果已有2001節點,我想從日曆創建關係[:YEAR](如果它不存在),如果存在沒有2001節點,我想創建節點和關係。數據庫中有一個標籤Calendar的單個節點。

CREATE UNIQUE (calendar:Calendar)-[:YEAR]->(year:Year {number: 2001 }) RETURN year; 

MERGE (calendar:Calendar)-[:YEAR]->(year:Year {number: 2001 }) RETURN year; 

當我嘗試,我得到「未知錯誤」

是什麼似乎工作就是用這些

MERGE (calendar:Calendar) CREATE UNIQUE (calendar)-[:YEAR]->(year:Year { number:2001}) RETURN year; 

MERGE (calendar:Calendar) MERGE (calendar)-[:YEAR]->(year:Year { number:2001}) RETURN year; 

是什麼最後的兩個查詢之間的區別一個查詢,爲什麼第一個工作不起作用?

回答

1

有時Neo4j的瀏覽器面具異常和錯誤爲「未知錯誤」。嘗試在neo4j-shell中運行查詢以查看真正的問題。 (我認爲最近的Neo4j瀏覽器的版本,可以讓你看到更多的錯誤,您正在使用哪個的Neo4j的版本?)

因爲CREATE UNIQUE需要一些約束標識開始從至少一個標識符必須首先查詢失敗(是'this'/ matter/individual)。你可以做

MATCH (calendar:Calendar) 
CREATE UNIQUE calendar-[:YEAR]->(year:Year {number:2001}) 
RETURN year 

我不知道爲什麼第二個查詢失敗,它本身沒有錯。它不會做你想要的,但是,MERGE匹配或創建整個模式。如果存在(:Calendar)-[:YEAR]->(:Year{number:2001}),它將匹配並返回它,如果它不存在,則創建整個模式,包括新的日曆節點。由於查詢可能會產生重複,在這種情況下,「未知錯誤」是否可以掩蓋模式唯一性約束的一些問題?

第三個查詢首先綁定日曆節點,這意味着create unique子句具有綁定標識符,並且可以正常工作。

第四個查詢同樣會分別獲取或創建兩個模式,這意味着不會創建重複的日曆節點。

你是否考慮過對日曆進行建模?這與你的問題無關,但我認爲這可能是我的做法。

(:Calendar)-[:2014]->({data:"some year data"})-[:02]->({data:"some month data"})-[:25]->({data:"some day data"}) 
+0

webadmin控制檯顯示錯誤消息。從第二個查詢中,我得到「SyntaxException:不知何故,Cypher無法從您的查詢中構建有效的執行計劃。「不管怎樣,正如你所說的那樣,這個查詢不好,我認爲其他日曆模型不適合我,我把幾天,幾年和幾個月的時間和事件聯繫起來,看看哪些事件發生時,我認爲當前的模型更好爲了這。 – user3115696

0

對於第一部分,您希望使用下面提到的創建唯一方法。否則它會拋出錯誤。

MATCH (calendar:Calendar) 
CREATE UNIQUE (calendar)-[:YEAR]->(year:Year {number: 2001 }) 
RETURN year; 

現在第二查詢你不需要使用CREATE獨一無二的,因爲合併時都匹配的作業,並創建UNIQUE在一起。

MERGE (calendar:Calendar)-[:YEAR]->(year:Year { number:2001}) RETURN year; 

以上將創建不存在的任何節點,關係和標籤,並且同時重用已存在的內容。

Cypher支架上合併的詳細信息:here