2012-10-03 34 views

回答

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

+0

謝謝,這讓我走上了正軌。我想我會混合這兩種方法,因爲對於某些類型的訪問,我總是需要當前版本(即,我將創建一個'[:CURRENT]'類型的關係來加速),但對於其他人,我需要查詢特定的版本,所以我將添加一個版本屬性到關係。 –

+0

@AaronDigulla我想建立一個類似的場景。我有兩個問題:1)假設我想存儲一個'Car'的版本化節點,並且在'carId'(UUID)字段中放置了一個索引。是不是最終得到3個版本的'Car's,具有完全相同的索引字段(可能與查詢「Retrieve the Car 32」有衝突?)? 2)用你的'[:CURRENT]'解決方案,我想象,在每個新版本中,你必須打破以前的'[:CURRENT]'關係指向新的'Car'version,這個指向另一個' [:上一個]'在上一個'Car'上的關係? – Mik378

+1

對於第一個問題,我會考慮讓UUID代表一個不可變的項目,即汽車+版本的組合。然後每個修訂都會創建一個新的UUID,然後可以將這些UUID鏈接在一起以表示版本歷史記錄。對於第二個問題:是的 - 需要爲每個出現的新版本打破和重建關係(類似於將項目插入鏈接列表)。 –

1

你也可以從另一個方面來解決:

(pages)-[:VERSION]->(V1)-[:VERSION]->(V2)-[:VERSION]->(V3) 
^            ^
    |             | 
category           current 
    node           version of page 

優勢:當你創建一個新的版本,你只是在鏈的末端,加上它沒有需要在(頁面)和當前版本之間「插入」它。

缺點:除非您重建鏈條,否則不能丟棄舊版本。但這可能不是一個頻繁的操作。