我有一個對象,我需要保留對它所做的所有更改的歷史記錄。我將如何使用neo4j來實現這個?如何使用neo4j實施修訂?
10
A
回答
10
與RDBMS一樣,它將取決於您的域和數據查詢要求。
您的應用程序是否需要定期訪問所有版本的對象,或者通常只適用於最新版本,而舊版本可以通過當前版本提供?一個例子可能是維基百科上的頁面。作爲爲例,假設我們有一個頁面,這是對版本3.然後我們就可以模擬這種如下:
(pages)-[:PAGE]->(V3)-[:PREV]->(V2)-[:PREV]->(V1)
^ ^
| |
category current
node version of page
在這裏,只有當前版本可以看出,以形成主體結構的一部分,但你可能希望允許所有版本構成該結構的一部分。在這種情況下,你可以使用關係屬性來表示版本,並擁有所有頁面版本從類別節點鏈接:只需在指定版本
(V1)
^
|
[:PAGE(v=1)]
|
(pages)-[:PAGE(v=2)]->(V2)
|
[:PAGE(v=3)]
|
v
(V3)
在這裏,你可以立即瀏覽頁面的特定版本你有興趣。
第三種選擇可能是您希望所有舊版本與主結構完全分離。爲此,您可以使用多個類別節點,一個用於(current_pages)
,另一個用於(old_pages)
。由於每個頁面都被新版本取代,因此它與前一個類別取消關聯,而與後一個關聯。這將形成更多的「歸檔」類型的系統,其中舊版本甚至可以移入單獨的數據庫實例中。
所以你有這三個選擇,再加上我沒有想到的更多! Neo4j可以讓你在這種設計方面有很大的靈活性,絕對沒有「正確的」答案。但是,如果這些都不能激發你的興趣,請發佈一些關於你的域名的更多信息,這樣你的答案可以更加適合你的需求。
乾杯, 的NiGe
1
你也可以從另一個方面來解決:
(pages)-[:VERSION]->(V1)-[:VERSION]->(V2)-[:VERSION]->(V3)
^ ^
| |
category current
node version of page
優勢:當你創建一個新的版本,你只是在鏈的末端,加上它沒有需要在(頁面)和當前版本之間「插入」它。
缺點:除非您重建鏈條,否則不能丟棄舊版本。但這可能不是一個頻繁的操作。
相關問題
- 1. 實施第三修訂歷史
- 2. 如何實施neo4j持久性?
- 3. 如何在Shopify中實施可修改的產品(即訂閱)?
- 4. 實施數據庫修訂的最佳實踐是什麼?
- 5. 訂閱的條紋實施
- 6. 實施Google應用內訂閱
- 7. 實施修改後的HMAC
- 8. 如何定義和實施Neo4J圖的模式?
- 9. 如何在android訂閱中的「應用內結算」中實施訂閱
- 10. 使用SSPI實施SSL:如何開始?
- 11. 實施使用MySQL
- 12. 自動續訂訂閱 - 在應用程序購買實施
- 13. 如何實施Google +
- 14. PushNotifications - 如何實施
- 15. 如何實施RingFiFoBuffer
- 16. 如何實施beatspectrum?
- 17. 如何實施getElementByClassName()
- 18. 如何實施didReceiveMemoryWarning?
- 19. 如何實施spark.ui.filter
- 20. 使用煉油廠實施RSS訂閱源CMS/RoR
- 21. 基於訂閱的通知實施
- 22. Laravel訂閱實施無條帶
- 23. 如何實施訂閱計劃限制? (php)
- 24. 如何在iPhone中的inapp購買中實施每月訂閱?
- 25. 如何實施在線白板設施?
- 26. Neo4j如何訂購通過收集
- 27. Neo4j的5星級用戶評價實施
- 28. 實現用戶數據修訂跟蹤
- 29. 如何使此輪播實施更好?
- 30. Google Play警告:如何修復HostnameVerifier的錯誤實施?
謝謝,這讓我走上了正軌。我想我會混合這兩種方法,因爲對於某些類型的訪問,我總是需要當前版本(即,我將創建一個'[:CURRENT]'類型的關係來加速),但對於其他人,我需要查詢特定的版本,所以我將添加一個版本屬性到關係。 –
@AaronDigulla我想建立一個類似的場景。我有兩個問題:1)假設我想存儲一個'Car'的版本化節點,並且在'carId'(UUID)字段中放置了一個索引。是不是最終得到3個版本的'Car's,具有完全相同的索引字段(可能與查詢「Retrieve the Car 32」有衝突?)? 2)用你的'[:CURRENT]'解決方案,我想象,在每個新版本中,你必須打破以前的'[:CURRENT]'關係指向新的'Car'version,這個指向另一個' [:上一個]'在上一個'Car'上的關係? – Mik378
對於第一個問題,我會考慮讓UUID代表一個不可變的項目,即汽車+版本的組合。然後每個修訂都會創建一個新的UUID,然後可以將這些UUID鏈接在一起以表示版本歷史記錄。對於第二個問題:是的 - 需要爲每個出現的新版本打破和重建關係(類似於將項目插入鏈接列表)。 –