图形和版本控制

时间:2010-10-30 20:50:20

标签: database-design version-control data-structures graph graph-theory

我有一个有向图数据结构,我试图为每个顶点实现单独的版本控制。这会产生一些有趣的场景,我非常感谢你们有任何想法。具体来说,我希望在遇到所述方案时解决系统的默认行为。

请参阅下图:Graph versions

场景1:“空指针悖论”

Vertex A回滚到版本1.0。由于此回滚将级联其子图,因此C将不再指向D.这可能会产生危险。行为应该是:

  • 1.1:删除边缘C - >; D,创建一个破碎的图表
  • 1.2:删除D,留下E孤儿
  • 1.3:删除D和E
  • 1.4:拒绝在指向D的所有边(在本例中为E - > D)被删除之前执行回滚
  • 1.X:替代解决方案?

场景2:“间接效应”

顶点D已更新,因此以下内容成立:

  • D现在是版本1.2
  • E现在是1.1版
  • C现在是版本1.3
  • A现在是版本1.3

顶点A现在回滚到版本1.2,因此以下内容成立:

  • A现在是版本1.2
  • C现在是版本1.2
  • D现在是版本1.1

默认行为应该是:

  • 2.1:将E回滚到1.0
  • 2.2:由于版本危险而拒绝回滚,实际上会影响功能
  • 2.X:替代解决方案?

3 个答案:

答案 0 :(得分:6)

您正在处理的是一个非常复杂的问题,虽然我不知道专门针对这方面的重点研究项目,但我听到了一些尝试来解决这个问题。 提出一个快速而肮脏的解决方案基本上是不可能的。我可以向您指出我之前就这方面提出的问题(图表和版本控制):

我最终做的是拒绝执行任何类型的修订控制,而是每次都创建具有新身份的新节点。我失去了回滚,我失去了任何类型的跟踪,但我保持事情可管理。

在实践中,您唯一能做的就是对图表进行整体修订控制。将它用于单个节点非常困难。您描述的所有问题都源于您正在跨越事务层的事实,在每个层中,您具有在特定时刻形成的一致图形。如果你跨越这些层,允许顶点修订控制,你正在处理一堆蠕虫,Dune大小。

答案 1 :(得分:4)

在我看来,这里有一些关于粒度的混淆。如果您只对单个顶点进行版本而不是图形,则回滚单个顶点不应影响图形的其余部分。如果,OTOH,你希望整个图表被回滚,那么你也应该对整个图形进行版本化。

问题在于,如果您只对单个顶点进行版本设置,那么您只能为各个顶点提供完整性保证,但不能对整个图形进行完整性保证。因此,如果你描述它,回滚一个单独的顶点“涟漪”整个图形(或至少连接的子图形),那么你不能保证最终处于一致的状态。

似乎与您正在尝试的最接近的研究是关于XML的版本控制,但是,它仅处理强类型树(IOW退化图),而不是一般图。

答案 2 :(得分:1)

Antiquity是Blueprints的版本化图形实现(因此它也适用于neo4j), 看看:https://github.com/asaf/antiquity

相关问题