2016-03-27 52 views
1

我剛剛進入Graph數據庫並需要建議。Neo4j使用關係中的屬性建模建議

對於這個例子,我有一個'Person'節點和一個'Project'節點,兩者之間有兩個關係。這兩個關係:

  • 指定日期,這是預計完成日期
  • 一名通過驗證的日期,這是實際完成日期

無論是從人到項目中。

具體指使用關係屬性來保存事件的「日期值」。他們有什麼缺點,或者更好的方式在圖表中進行建模?

一個簡單的模擬了低於: enter image description here

回答

3

這是比較容易保持在Unix紀元時間戳(存儲爲長整數)形式的日期,而不是作爲儒略曆日期。 Neo4j沒有內置的日期/時間格式。

時間戳,可用於在日期上執行計算,以查找諸如計劃後的多少天是基於當前日期的項目。

Cypher中的timestamp()函數提供了一種獲取neo4j中當前Unix時間的方法。

Neo4J中的每個關係在內部佔用34字節的數據,不包括關係的實際內容。將計劃完成和驗證完成都作爲單一關係中的屬性而不是將它們存儲爲兩個關係可能更有效。

關係不需要同時具有預定日期和驗證日期(NoSQL的優點)。您可以稍後使用SET關鍵字添加驗證日期。

只是給你一個例子。

使用以下Cypher語句創建。

Create (p:Person {name:'Bill'})-[r:Works_On {scheduledcompletion: 1461801600}]->(pro:Project {name:'Jabberwakie'}) 

使用以下Cypher語句將驗證日期設置爲當前時間。

Match (p:Person {name:'Bill'})-[r:Works_On]->(pro:Project {name:'Jabberwakie'}) set r.verifiedcompletion=timestamp() 

使用下面的Cypher語句來執行某種計算的,在這種情況下返回一個布爾值,如果項目進度落後與否。

Match (p:Person {name:'Bill'})-[r:Works_On]->(pro:Project {name:'Jabberwakie'}) return case when r.scheduledcompletion > r.verifiedcompletion then true else false end as behindschedule 
+0

我真的很感謝徹底的解釋,謝謝。也會研究你也建議的日期格式。 –

+0

不客氣。我希望它可以幫助:) – Anomaly211

0

想想也是的情況下,預計存儲完成日期與實際日期成品在節點項目,如果這個屬性關係到整個項目,是關係到它所有的人一樣。

這將幫助您避免重複數據,並且使查詢項目的屬性工作更快,因爲您無需查找關係。如果你的模型被設計爲具有不同的實際日期和完成不同的人,除了在關係中存儲數據集,在整個項目中存儲項目節點組合信息仍然是有意義的。因爲它會使模型更清晰,並且更快地執行某些查詢。

+0

對不起,我沒有給出完整的解釋,但是這個模型會有幾個人執行同一個項目,每個人都有自己的預定和驗證日期。這就是爲什麼我試圖把數據放在關係中。這就是說你會以不同的方式做到這一點? –