Neo4j 如何对依赖于时间的关系建模?

Neo4j 如何对依赖于时间的关系建模?,neo4j,Neo4j,建模和迭代依赖于时间的关系的正确方法是什么 例如: 约翰于69年3月7日与伊丽莎白结婚,并于73年12月5日与她离婚;然后,他于1982年3月18日与科里结婚,至今仍保持婚姻 马克为IBM工作(特定日期间隔),然后为MSFT工作(其他时间间隔),等等 还有许多其他依赖于时间的关系: 住在 为…工作 报告给 属于……等 建立这些模型的正确方法是什么?典型的查询是使用“as-of”参数查找遍历,例如“谁是John的配偶,截止到1974年1月1日?”这可以通过使用索引轻松完成。索引/属性只能使

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

例如:

  • 约翰于69年3月7日与伊丽莎白结婚,并于73年12月5日与她离婚;然后,他于1982年3月18日与科里结婚,至今仍保持婚姻
  • 马克为IBM工作(特定日期间隔),然后为MSFT工作(其他时间间隔),等等
还有许多其他依赖于时间的关系:

  • 住在
  • 为…工作
  • 报告给
  • 属于……等

建立这些模型的正确方法是什么?典型的查询是使用“as-of”参数查找遍历,例如“谁是John的配偶,截止到1974年1月1日?”

这可以通过使用索引轻松完成。索引/属性只能使用原语,所以可以将日期对象转换为长值,然后可以为该值编制索引。您必须将索引存储为特殊类型,但在此之后,您可以基于范围进行搜索,这样您就可以执行“Before”或“after”甚至“Between”类型查询。

我假设始终为每种类型建立两种关系-lived_in_s、lived_in_e、attributed_to_e。。。。其中,后缀“s”和“e”表示该关系的开始和结束时间。然后,查询as-of参数可能如下所示:

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;
START n=node({John})
匹配n-[r:配偶的配偶]-m,n-[?r2:配偶的配偶的配偶]-m
时间在哪里{timestamp}和r.time>{timestamp}
返回m;
(我可能在r2?的查询中有一个输入错误,我没有测试就写了它)


你可能想使用尼古拉斯写的关于

的索引,你可以考虑使用额外的节点来代表一个特定的婚姻或就业周期。例如,约翰的婚姻可以按如下方式建模:

(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)
这使你在每个人可能结婚的次数以及是否存在结束日期方面都具有灵活性

希望这有帮助


Nige

我通常会添加带有on_date属性的时间戳

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

约翰于69年3月7日与伊丽莎白结婚,并于73年12月5日与她离婚;然后,他于1982年3月18日与科里结婚,至今仍保持婚姻


如果您想知道John是否结婚以及与谁结婚,只需比较日期,就可以得到结束节点。

很有意义。那么仍然要将时间依赖性建模为一对from/till属性吗?建立“永远”价值模型的最佳方法是什么?输入最小值/最大值或忽略它们并解释查询中的未命中?Forever可以是
长。MAX_VALUE
.Nige,我不确定这是否正确——这些节点只与两个相关节点相关,并描述了完全可以通过关系的属性直接完成的连接。这不是对或错,只是另一种可能的方法。归根结底,你现在和将来都需要什么样的抽象层次:婚姻永远只是双方之间的一种关系,还是它自己的一种实体?对于代表婚姻的节点,您还可以与其他相关节点(如地理位置)或其他相关人员(如该婚姻的证人或子女)建立关系。Neo4j不允许关系端点是其他关系,所以这在其他情况下是不可能的。这一点很好!如果婚姻本身具有附加属性,那么你是对的。