基于事件的数据的临时图数据库

时间:2015-05-07 01:04:47

标签: neo4j graph-databases temporal-database

我有数据告诉我某件事发生了事件。

示例:

  • 第1栏位于2015-02-15 10:00的A地点。
  • 第1号专栏已于2015-02-15 10:15放入专栏#2。
  • 方框#2已于2015-02-15 11:00放入方框#3。
  • 第3栏位于2015-02-16 03:00的B地点。
  • 第2号专栏已于2015-02-16 04:30从专栏#3中删除。
  • 第3栏位于2015-02-16 05:00的C地点。

我有三个主要要求:

  1. 我应该能够告诉我现在所有的盒子在哪里查询。 例如应该在2015-02-16 06:00查询。框#1在位置B的方框#2内。方框#3位于C区,内部没有任何内容。
  2. 我应该可以看到特定框中发生的所有事情。 例如对于方框#1:

    • 位于2015-02-15 10:00的位置A
    • 于2015-02-15 10:15
    • 被放入Box#2
    • 位于Box#2内,于2015-02-15 11:00在Box#3内放置
    • 位于Box#3内,位于第3栏,位于2015-02-16 03:00的B地点。
    • 位于Box#2内,于2015-02-16 04:30从Box#3中删除。
  3. 我应该能够告诉特定时间所有方框的位置。 例如在2015-02-16 10:30,第1个方框位于A区的第2个方框内。

  4. 我一直在关注图形数据库,因为它们似乎比关系数据库更好地处理这种类型的关系(尝试在Sql中进行递归查询并不容易)。 看起来我需要一个Box节点,一个Location节点和它们之间的边缘,用于关系“Inside”和“At”。 但我不确定如何在图模型中加入时间要求。 我看过this,但我不确定如何使其符合我的要求。

    另请注意:这将需要扩展到1-4亿个盒子,每个盒子可以容纳1到5000个事件。 并能够处理数以千计的第二次事件

1 个答案:

答案 0 :(得分:3)

有趣的问题

以下是您的示例制作的一些示例数据。这是您问题的一种可能实现方式。

// create the boxes and the locations and add relationships
// between them. On each relationship add a time.
create (b1:Box {name: 'Box #1'}) 
create (b2:Box {name: 'Box #2'}) 
create (b3:Box {name: 'Box #3'}) 
create (lA:Location {name: 'A'})
create (lB:Location {name: 'B'})
create (lC:Location {name: 'C'})
create b1-[:AT {time: '2015-02-15 10:00'}]->lA
create b1-[:INSIDE {time: '2015-02-15 10:15'}]->b2
create b2-[:INSIDE {time: '2015-02-15 11:00'}]->b3
create b3-[:AT {time: '2015-02-16 03:00'}]->lB
create b2-[:REMOVED {time: '2015-02-16 04:30'}]->b3
create b3-[:AT {time: '2015-02-16 05:00'}]->lC
return *

Picture of the sample graph

这是一个从特定框开始询问图表的查询。总体战略是撤回定向链盒。在这个例子中,我只是采用了最长的链条。可能更完整的可能是返回每个路径,按时间排序并选择具有最新时间的路径。

一旦我有了路径,我就从中移除了节点并迭代它们并匹配位置和路径。我把关系类型和时间都拉回来了。

match p=(b:Box {name: 'Box #1'})-[:INSIDE|REMOVED*]->(:Box)
with p
order by length(p) desc
limit 1
with nodes(p) as boxes
unwind boxes as box
optional match box-[rel:AT|INSIDE|REMOVED]->(box_spot)
return rel.time as Time
, box.name as Box
, type(rel) as Directive
, box_spot.name as Spot
order by rel.time

使用更多用例肯定可以改进和增强。该模型对于按时间查询模型不是很好。时间是关系上的字符串。这次neo4j不允许对关系的属性进行索引。我认为这个模型非常适合挑选一个盒子并且跟着它结束。

enter image description here