我有数据告诉我某件事发生了事件。
示例:
我有三个主要要求:
我应该可以看到特定框中发生的所有事情。 例如对于方框#1:
我应该能够告诉特定时间所有方框的位置。 例如在2015-02-16 10:30,第1个方框位于A区的第2个方框内。
我一直在关注图形数据库,因为它们似乎比关系数据库更好地处理这种类型的关系(尝试在Sql中进行递归查询并不容易)。 看起来我需要一个Box节点,一个Location节点和它们之间的边缘,用于关系“Inside”和“At”。 但我不确定如何在图模型中加入时间要求。 我看过this,但我不确定如何使其符合我的要求。
另请注意:这将需要扩展到1-4亿个盒子,每个盒子可以容纳1到5000个事件。 并能够处理数以千计的第二次事件
答案 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 *
这是一个从特定框开始询问图表的查询。总体战略是撤回定向链盒。在这个例子中,我只是采用了最长的链条。可能更完整的可能是返回每个路径,按时间排序并选择具有最新时间的路径。
一旦我有了路径,我就从中移除了节点并迭代它们并匹配位置和路径。我把关系类型和时间都拉回来了。
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不允许对关系的属性进行索引。我认为这个模型非常适合挑选一个盒子并且跟着它结束。