2014-10-02 104 views
1

一個完全Neo4j的小白在這裏說,添加新用戶的Neo4j

我想創建一個圖形來存儲一組用戶,普通用戶如下:

CREATE 
(node_1 {FullName:"Peter Parker",FirstName:"peter",FamilyName:"parker"}), 
(node_2 {Address:"Newyork",CountryCode:"US"}), 
(node_3 {Location:"Hidden"}), 
(node_4 {phoneNumber:11111}), 
(node_5 {InternetEmailAddress:"[email protected]") 

現在問題是,

  1. 每次我執行這個我添加5個節點。 我知道我需要使用唯一的密鑰,但我看到的所有示例都可以爲特定節點使用唯一密鑰。那麼如何確保用戶不會被添加(如果它已經存在)(我可以使用電子郵件地址作爲唯一鍵)。
  2. 如果發生某些更改,如何更新節點。例如,一個星期後,我要更新圖表包含以下,而不是前一個。(無重複)

    CREATE(node_1 {FullName:"Peter Parker",FirstName:"peter",FamilyName:"parker"}),(node_2 {Address:"Newyork",CountryCode:"US"}),(node_3 {Location:"public"}),(node_4 {phoneNumber:11111}),(node_5 {InternetEmailAddress:"[email protected]"),(node_6 {status:"Jailed"}) 
    

(注:新的更新改變位置「公衆」,並增加了新的節點彼得

回答

2

看着你有負載的節點。

一些你已經建模爲節點的數據大概性質對方的回答表明,一些人可能正確地建模爲節點和一個可能會形成或關係的一部分。

公共/隱藏位置可以以三種方式之一建模,作爲Person上的屬性,作爲Person和Location之間的屬性或作爲關係類型。要理解,首先你需要有一個關係。

你此刻的地址是另外一個節點,我認爲這是正確的,但可能你希望兩個節點,有關這樣的事情:

(s:State)-[:IN_COUNTRY]-(c:Country) 

因人而異,並明確一個以美國爲中心的模式,但你可以很容易地擴展它。

現在你可以用LIVES_IN關係創建彼得:

CREATE (p:Person{fullName:"Peter Parker"}), (s:State{name:"New York"}), (c:Country{code:"US"}), 
(p)-[:LIVES_IN]->(s), (s)-[:IN_COUNTRY]->(c) 

對於速度,你最好還是造型兩個關係可能是LIVES_IN_PUBLIC和LIVES_IN_HIDDEN這意味着執行你上面要那麼更新你得刪除一個並創建另一個。但是,如果速度不是本質的,那麼在關係上使用屬性也是很常見的。

CREATE (p:Person{fullName:"Peter Parker"}), (s:State{name:"New York"}), (c:Country{code:"US"}), 
(p)-[:LIVES_IN{public:false}]->(s), (s)-[:IN_COUNTRY]->(c) 

所以你完全Q &答:

CREATE (p:Person {fullName:"Peter Parker",firstName:"peter",familyName:"parker", phoneNumber:1111, internetEmailAddress:"[email protected]"}), 
(s:State {name:"New York"}), (c:Country {code:"US"}), 
(p)-[:LIVES_IN{public:false}]->(s), (s)-[:IN_COUNTRY]-(c) 

MATCH (p:Person {internetEmailAddress:"[email protected]"})-[li:LIVES_IN]->() 
SET li.public = true, p.status = "jailed" 

當添加其他人你可能不希望重建國家和國家,而是要配合他們,並可能Merge他們,但我們將堅持創建。

MATCH (s:State{name:"New York"}) 
CREATE (p:Person{name:"John Smith", internetEmailAddress:"[email protected]"})-[:LIVES_IN{public:false}]->(s) 

約翰史密斯現在居住在美國,因爲您可以通過州節點關注關係。

論文完整。

+0

這是一位很棒的設計伴侶,Ty。 – nafas 2014-10-03 10:26:21

0

我覺得你modeli在這裏不正確地處理你的數據 - 你將這個人的每個屬性設置爲一個單獨的節點,這不是一個好主意。這些節點之間沒有任何關聯,所以在這種數據模式下,稍後您將無法分辨Peter Parker的地址。你也沒有使用節點標籤,我認爲這可能真的幫助這裏。

有關更新節點的答案的快速問題是,您必須MATCH它們,然後使用SET來修改屬性。所以,如果你有一個人,你可能會這樣做:

MATCH (p:Person { FullName: "Peter Parker" }) 
SET p.Address = "123 Fake Street" 
RETURN p; 

但請注意,我正在假設您的數據的結構。我帶你去提供相同的數據,這可能是它創造一個更好的方式:

CREATE (node_1:Person {FullName:"Peter Parker", 
         FirstName:"peter", 
         FamilyName:"parker", 
         Address:"Newyork",CountryCode:"US", 
         Location:"Hidden", 
         phoneNumber:11111, 
         InternetEmailAddress:"[email protected]"}); 

這個建議不同的是,我把所有的屬性到單個節點(而不是一個屬性每個節點),我正在將Person標籤應用到該節點。

如果你像這樣構造數據,那麼我提供的更新查詢就可以工作。結構化數據就像你擁有它,不可能更新彼得帕克的地址,因爲你的node_1node_2之間沒有關係

+0

我同意,但也許國家/國家可以用來作爲圖表可以/可以/應該如何運作的例子? – JohnMark13 2014-10-02 15:44:47

+0

是的,有一些可能的闡述,但我不想過度設計答案。核心問題(如何進行更新)非常簡單,圖形結構當然可以做更多的事情。如果OP想要提出另一個問題,我們可以跟進,但我不想用圖形建模的論文來回答「我該如何更新」問題。 :) – FrobberOfBits 2014-10-02 16:58:36

+0

我同意你們兩個,我很習慣sql結構,它的技巧很難適應圖形。 ty – nafas 2014-10-03 10:28:04