2013-11-15 88 views
2

我正在使用Neo4j 2.0.0-M06。只要學習Cypher並閱讀文檔。在我看來,這個查詢是可行的,但我應該很幸運...使用標籤和屬性創建唯一標識

我正在將推文導入到mysql數據庫,然後從那裏將它們導入到neo4j。如果推特已經存在於Neo4j數據庫中,則應該更新它。

我的查詢:

MATCH (y:Tweet:Socialmedia) WHERE 
HAS (y.tweet_id) AND y.tweet_id = '123' 
CREATE UNIQUE (n:Tweet:Socialmedia { 
body : 'This is a tweet', tweet_id : '123', tweet_userid : '321', tweet_username : 'example' 
}) 

Neo4j的說:This pattern is not supported for CREATE UNIQUE

數據庫是與匹配的標籤節點現在還是空的,所以有沒有鳴叫什麼那麼在Neo4j的數據庫。

什麼是正確的查詢?

+0

我是否正確理解Neo4j在單個節點上不允許CREATE UNIQUE,僅在創建關係時才允許? – 1915

+0

不久,MERGE將取代所有情況下的CREATE UNIQUE。 :) CREATE UNIQUE是目前唯一可以建立唯一關係的方法,但絕對使用MERGE來表示節點。 –

回答

5

您想爲此查詢使用MERGE以及唯一約束。

CREATE CONSTRAINT on (t:Tweet) ASSERT t.tweet_id IS UNIQUE; 

MERGE (t:Tweet {tweet_id:'123'}) 
ON CREATE 
SET t:SocialMedia, 
    t.body = 'This is a tweet', 
    t.tweet_userid = '321', 
    t.tweet_username = 'example'; 

這將使用索引的ID來查找鳴叫,如果存在鳴叫什麼也不做,否則會設置這些屬性。

+0

謝謝我的朋友! – 1915

+0

很好的回答!也幫助了我。 – Aaron

0

我想指出的是一個可以使用的

  1. 的組合創建約束,然後正常
  2. CREATE(不唯一)

這是例,其中一個期望一個獨特的節點,並且如果該節點意外存在,則希望引發異常。 (比創建它之前查找節點便宜得多)。

另請注意,MERGE似乎需要比CREATE更多的CPU週期。 (即使拋出異常,它也需要更多的CPU週期)

覆蓋CREATE CONSTRAINT,CREATE和MERGE的替代方案(儘管承認這不是本文的主要目的)。