最佳建模实践,用于在图形数据库中保留事件的时间历史记录

时间:2014-04-07 14:46:30

标签: database-design graph

建模图形数据库时的最佳做法是跟踪关系发生变化的日期和时间,以便在需要时能够重建事件序列的任何部分导致当前的图表?

例如,让我们假设以下内容:

  • 我们希望为用户建模社交图,“”关系的朋友,
  • 的朋友”关系来来去去,
  • 我们很容易看到Bob与目前与Tom的朋友,但我们也想知道:
    • 鲍勃在日期D1开始与汤姆成为朋友
    • 然后在D2日期停止与汤姆成为朋友
    • 然后在第D3日与汤姆再次成为朋友

在没有更好的建议的情况下,我正在考虑做以下事情:

  • 创建三种类型的关系(假设第二和第三关系存储在图形数据库中,并且具有某种“创建时间”时间戳):
    • ”的朋友
    • 开始与
    • 成为朋友
    • 停止与
    • 成为朋友
  • 通过更新(即创建或删除)“”的朋友关系并创建“启动”或“”,每次事件发生时都保持一致性停止成为“关系的朋友,这种关系会增加可能存在的关系。

1 个答案:

答案 0 :(得分:1)

显然,不同的图形数据库可能存在实现差异。但我的看法是:

创建Edge" friends"与属性"开始"并且"停止"。仅在友谊结束时设置已停止的属性。你可以有多个朋友"人与人之间的边缘,如果关系重新开始。

我正在复制Pixy Tutorial"幸存者和参数"部分。我相信这个例子与你的问题非常相似。它使用Prolog来编写查询的一部分,在我看来是一个非常好的主意。

gremlin> pt = pt.extend(''' \
  livingAsOf(Person, Year) :- property(Person, 'born', Year1), Year1 =< Year, livingAsOfSub(Person, Year). \
  livingAsOfSub(Person, Year) :- property(Person, 'died', Year2), Year2 >= Year. \
  livingAsOfSub(Person, Year) :- not(property(Person, 'died', _)). \
''')

gremlin> g.V().as('p').pixy(pt, 'livingAsOf($, ?)', 1950) \
    .select(['p'], {it.name + ', born ' + it.born + (it.died ? ', died ' + it.died : '') })

2014-08-22更新: 关于db特定的实现,在Cassandra支持Titan的情况下,存储&#34;已启动&#34;并且&#34;停止&#34;字段作为一个集合并具有单一的友谊关系边缘。我想从多个友谊边缘撤回,因为它可能会增加不必要的复杂性,但某些数据库和查询模式可能会更好地使用该模式。使用Titan-Cassandra,您可能会发现重复首次启动和最后停止的情况作为字段,并且具有我上面提到的另一个字段,这仅适用于友谊停止和重新启动的情况。这取决于您选择的数据库以及您的查询模式。因此,测试是您在评论中写下的方式。