【发布时间】:2015-06-03 07:47:00
【问题描述】:
我是一位研究中世纪历史的历史学家,我正在尝试编写中世纪德国约 50 年(从 1220 年到 1270 年)期间国王、公爵、教皇等之间的网络。由于我不是图形数据库专家,我正在寻找一种处理日期和日期范围的可能性。
是否有可能在日期范围内处理边缘,以便表示关系的边缘在例如3 年?
是否有可能要求在日期范围内具有日期标签的关系?
【问题讨论】:
标签: date neo4j date-range
我是一位研究中世纪历史的历史学家,我正在尝试编写中世纪德国约 50 年(从 1220 年到 1270 年)期间国王、公爵、教皇等之间的网络。由于我不是图形数据库专家,我正在寻找一种处理日期和日期范围的可能性。
是否有可能在日期范围内处理边缘,以便表示关系的边缘在例如3 年?
是否有可能要求在日期范围内具有日期标签的关系?
【问题讨论】:
标签: date neo4j date-range
在 Neo4j 中处理日期的常用方法是将它们存储为字符串表示形式或自纪元以来的毫秒(即自 1970 年 1 月 1 日以来经过的毫秒)。
第一种方法使图表更易于阅读,后者允许您进行数学运算,例如计算增量。
在您的情况下,我将在关系上存储两个名为 validFrom 和 validTo 的属性。您的查询需要确保您正在寻找正确的时间间隔。
例如要找到 1220 年 1 月 1 日至 1221 年 12 月 31 日期间负责法国的国王,您可以:
MATCH (c:Country{name:'France'})-[r:HAS_KING]->(king)
WHERE r.validFrom >= -23667123600000 and r.validTo <=-23604051600000
RETURN king, r.validFrom, r.validTo
从 Neo4j 3.0 开始,APOC 库提供了couple of functions for converting timestamps to/from human readable date strings。
【讨论】:
您还可以将日期存储在数字表示中,格式如下:YYYYMMDD
在您的情况下,12200101 将是 1220 年 1 月 1 日,12701231 将是 1270 年 12 月 31 日。
这是一种有用且可读的格式,您可以执行范围搜索,例如:
MATCH (h:HistoricEvent)
WHERE h.date >= 12200101 AND h.date < 12701231
RETURN h
如果需要,它还可以让您按日期订购。
【讨论】:
MATCH (from {id:line.id1}), (to {id:line.id2}) create from-[:NEGATIV{reltype:line.rel1, datum:line.date, datenorm:line.datenorm, vorgID:line.vorgID}]->to; 不知道为什么 neo4j 存储一个数字和另一个数字一样长。我怎样才能强制存储多久?
另一个使您创建的节点/属性数量保持在较低水平的日期选项是链表年份(感兴趣的最早年份 - 最近年份)、月份之一 (1-12) 和一个月中的一个日期(1-31)。然后,图表中的每个“事件”都可以连接到年、月和日。这样,您不必为年月日的每个新组合创建一个新节点。您只有一组月份、几天和一年。我缩放数字以使操作它们更容易,就像这样
年份是 yyyy*10000
月份为 mm*100
日期为 dd
所以如果你运行一个查询,例如
match (event)-[:happened]->(t:time)
with event,sum(t.num) as date
return event.name,date
order by date
您将获得按时间顺序排列的所有事件列表,日期如 1904 年 1 月 17 日显示为 19040117(yyyymmdd 格式)
此外,因为这些是链表,例如, ...-(t0:time {num:19040000})-[:precedes]->(t1:time {num:19050000})-... 排序也内置在节点中。
到目前为止,这是我喜欢的约会方式
【讨论】:
As of Neo4J 3.4,系统处理持续时间和日期,参见official documentation。查看更多示例here。
与原始问题相关的示例:检索从现在起最近 30 天内发生的历史事件:
WITH duration({days: 30}) AS duration
MATCH (h:HistoricEvent)
WHERE date() - duration < date(h.date)
RETURN h
【讨论】: