如何使用neo4j实现修订?

时间:2012-10-03 11:27:39

标签: version-control neo4j

我有一个对象,我需要保留所有更改的历史记录。我将如何使用neo4j实现此目的?

2 个答案:

答案 0 :(得分: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 :(得分:1)

你也可以从另一方面接近它:

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

优点:当您创建新版本时,只需将其添加到链的末尾,无需在(页面)和当前版本之间“插入”它。

缺点:你不能只丢掉旧版本,除非你重建链。但这可能不是经常的操作。