1

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

例如:

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

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

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

对这些进行建模的正确方法是什么?一个典型的查询是找到一个带有“as of”参数的遍历,例如“谁是 John 的配偶,截至 74 年 1 月 1 日?”

4

4 回答 4

1

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

于 2013-01-10T01:47:03.303 回答
1

您可以考虑结合日历子图使用额外的节点来表示特定的婚姻或工作时期。例如,约翰的婚姻可以建模如下:

(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存在的灵活性。

希望这可以帮助

尼日

于 2013-01-10T09:47:02.037 回答
0

我通常添加一个带有 on_date 属性的时间戳。

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

约翰于 69 年 7 月 3 日与伊丽莎白结婚,并于 73 年 5 月 12 日与她离婚;然后他于 82 年 3 月 18 日与 Corrie 结婚,至今仍结婚。

如果您想知道约翰是否已婚以及与谁结婚,您可以简单地比较日期,并获取结束节点。

于 2013-01-16T08:39:55.163 回答
0

我会假设总是为每种类型建立两种关系 - living_in_s、lived_in_e、belonged_to_s、belonged_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;

(我可能在 r2 的查询中有错字?,我没有测试就写了)

你可能想使用@nicholas 写的索引

于 2013-01-10T09:03:20.137 回答