如何建立时间依赖关系模型?

时间:2013-01-09 23:56:35

标签: neo4j

建模和迭代时间依赖关系的正确方法是什么?

例如:

  • 约翰于07/03/69与伊丽莎白结婚,并于05/12/73与她离婚;然后他于03/18/82与Corrie结婚并仍然结婚。
  • Mark为IBM工作(某些日期间隔),然后是MSFT(其他时间间隔)等。

还有许多其他与时间有关的关系:

  • 住在
  • 工作
  • 报告
  • 属于等。

对这些进行建模的正确方法是什么?一个典型的查询是找到一个带有“as of”参数的遍历,例如“从01/01/74开始,John的配偶是谁?”

4 个答案:

答案 0 :(得分:1)

使用索引可以轻松完成。索引/属性只能使用原语,因此您可以将Date对象转换为long值,然后可以索引该值。您必须将索引存储为特殊的Numeric类型,但之后,您可以根据范围进行搜索,这样您就可以执行“之前”或“之后”甚至“之间”类型查询。

答案 1 :(得分:1)

您可以考虑使用额外的节点来表示特定的婚姻或工作期与calendar subgraph一起使用。例如,约翰的婚姻可以模仿如下:

(John)-[:MARRIAGE]->(John+Liz)
(Liz)-[:MARRIAGE]->(John+Liz)
(John+Liz)-[:START_DATE]->(07/03/69)
(John+Liz)-[:END_DATE]->(05/12/73)
(John)-[:MARRIAGE]->(John+Corrie)
(Corrie)-[:MARRIAGE]->(John+Corrie)
(John+Corrie)-[:START_DATE]->(03/18/82)

这使您可以灵活地处理每个人可能进行的婚姻数量以及END_DATE是否存在。

希望这有帮助

的NiGe

答案 2 :(得分:0)

我假设为每种类型构建总是两种关系 - lived_in_s,lived_in_e,belowned_to_s,belowned_to_e ....其中后缀“s”和“e”表示该关系的开始和结束时间。比查询参数可能看起来像:

START n=node({John}) 
MATCH n-[r:spouse_of_s]-m, n-[?r2:spouse_of_e]-m
WHERE r2.time? < {timestamp} AND r.time > {timestamp}
RETURN m;

(我可能在r2的查询中输入错误?,我没有经过测试就写了它)

你可能想要使用@nicholas写的关于

的索引

答案 3 :(得分:0)

我通常会在on_date属性中添加时间戳。

我还建议您使用以下格式YYYYMMDD编码日期。然后,您可以在代码中轻松添加比较。例如:

约翰于07/03/69与伊丽莎白结婚,并于05/12/73与她离婚;然后他于03/18/82与Corrie结婚并仍然结婚。

如果你想知道John是否已婚并且与谁结婚,你可以简单地比较日期,并获得结束节点。