我是一名中世纪历史学家,正在尝试编码1220年至1270年期间(在德国中世纪)各国国王、公爵、教皇之间的网络关系。由于我不是图数据库的专家,因此我正在寻找处理日期和日期范围的可能性。
有没有可能将日期范围传递给边缘,以便表示关系的边缘在例如3年后消失?
有没有可能询问那些具有处于日期范围内的日期标记的关系?
我是一名中世纪历史学家,正在尝试编码1220年至1270年期间(在德国中世纪)各国国王、公爵、教皇之间的网络关系。由于我不是图数据库的专家,因此我正在寻找处理日期和日期范围的可能性。
有没有可能将日期范围传递给边缘,以便表示关系的边缘在例如3年后消失?
有没有可能询问那些具有处于日期范围内的日期标记的关系?
在Neo4j中处理日期的常见方式是将它们存储为字符串表示或自 Jan 01 1970 起经过的毫秒数 (也称为 epoch 毫秒数)。
第一种方法使图更易读,后者允许您进行数学计算,例如计算时间差。
在您的情况下,我会在关系上存储两个属性,分别称为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 库提供了几个函数,用于将时间戳转换为/从人类可读的日期字符串。点击此处查看详情。
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将一个数字存储为长整型,而将另一个数字存储为字符串。我该如何强制将其存储为长整型? - Andreas Kuczera从Neo4J 3.4版本开始,系统可以处理时间间隔和日期,详情请查看官方文档。更多示例可在此处查看。
一个与原问题相关的示例:检索过去30天内发生的历史事件:
WITH duration({days: 30}) AS duration
MATCH (h:HistoricEvent)
WHERE date() - duration < date(h.date)
RETURN h
match (event)-[:happened]->(t:time)
with event,sum(t.num) as date
return event.name,date
order by date
(n:Article)
和表示公司的节点(m:Company)
,例如,如果文章发布于20170401,则可以执行以下操作来构造此子图:MATCH (a:Article {title:"some title"}),(c:Company {name:"some company"}) CREATE (a)-[:mentions]->(c)
。 - TshimangaMATCH (a:Article {title:"some article"}),(y:Year {num:20170000}),(m:Month {num:400}),(d:Date {num:1}) MERGE (y)<-[:published]-(a)-[:published]->(m) merge (a)-[:published]->(d)
- Tshimanga