【发布时间】:2014-07-22 22:29:13
【问题描述】:
我正在评估一个项目的数据库。现在我非常喜欢 Neo4J 的图形特性。
我正在寻找创建一个使用“最后一个良好价值”方法(我的话)之类的时间数据库。
这是一个使用粗略的 Neo4J 伪代码的示例。想象以下作为单独的交易发生。
CREATE (a:Person {first: "Charles", last: "Tolliver", timestamp: timestamp() + 00})
CREATE (b:Person {first: "Charlie", timestamp: timestamp() + 10})
CREATE (c:Person {first: "Chuck", timestamp: timestamp() + 20})
CREATE (d:Person { last: "Peters", timestamp: timestamp() + 30})
CREATE (e:Person {age:42, timestamp: timestamp() + 40})
CREATE (a)<-[:UPDATES]-(b)<-[:UPDATES]-(c)<-[:UPDATES]-(d)<-[:UPDATES]-(e)
RETURN a,b,c,d,e;
然后我希望能够做类似的事情:
MATCH (p:Person)
WHERE p.first="Charles"
return p, collect(
{ first: p.first, last: p.last, age: p.age, timestamp: p.timestamp }
)
我想像这样取回数据:
{ first: "Chuck", last: "Peters, age: 42, timestamp:...}
每个后续插入“屏蔽”先前的数据。
理想情况下,我希望能够以相同的方式查询各种时间戳,并在该时间点获取聚合对象的“快照”。
问题:
- 这个模式有我可以研究的名称吗?
- 是否有任何数据库原生/开箱即用地支持这种模式?
- 在 Neo4J 或其他图形数据库中是否有一个干净的范例/工具集?
*注意:出于各种原因,我不喜欢使用基于“帧”的时间性。
注意:我不是在问“哪些数据库最适合这个”或任何主观的东西。我正在寻找有关支持此模式/范式的客观信息。
【问题讨论】:
-
您是否正在寻找一种基于时间的图表版本控制?如果是这样,伊恩罗宾逊写了一篇关于如何做到这一点的优秀博客文章。 iansrobinson.com/2014/05/13/time-based-versioned-graphs
-
这听起来像是
Self和JavaScript的原型继承或实例继承,你是这么想的吗?不确定实现它的最佳方法是什么,并且作为应用程序层可能比在数据库中完全建模更容易。一种方法是存储版本的链接列表,检索某个深度的子列表,然后为每个属性检索从尾到头遍历子列表并返回该属性的第一个实例。 -
谢谢;我会看一下这篇文章,Kenny Bastani。我认为 JavaScript 范式激发了我的意思。我正在研究 Cognitect 的“Datomic”作为可能的解决方案。如果我发现任何满意的东西,我会回帖。
标签: design-patterns neo4j graph-databases temporal-database data-masking