将日期存储为Neo4j中的节点

时间:2016-12-06 14:34:12

标签: date neo4j cypher graph-databases

我是Neo4j的新手,所以也许我对此完全错了,但我会尝试一下!

我们的数据主要由预订,用户和存储为节点的设施组成 我需要在这个时间范围内计算在特定时间范围内发生的总预留量和总收入(存储为reservation.income)。

我正在考虑通过将日期创建为节点来解决问题,这样我就可以为特定日期发生的所有预订分配关系[:PURCHASED_ON]

据我所知,将日期创建为节点可以给我一些优点:

  • 我可以从dd / mm / yyyy中分割日期并将它们存储为整数属性,这样我就可以使用数学运算符,例如>和<
  • 我可以为代表每个月的节点创建一个标签
  • 在一天或一个月内收入()收入应该更容易

基本上,我正在考虑做这样的事情

CREATE (d:Day {name:01/11/2016 day: TOINT(01), month: TOINT(11), year: TOINT(2016)}

我已经看到一个可能的解决方案可能是每年,每月(1-12)和每天(1-31)创建一个节点,但我认为这会使我的图表的架构变得非常复杂每个预订都有一个" insert_date" (它创建的那天)然后是官方" reservation_date" (它到期的那天)。

我在这里做点什么还是浪费时间?谢谢!

2 个答案:

答案 0 :(得分:2)

您可能希望查看GraphAware TimeTree library,因为日期处理是一件复杂的事情,这似乎是您前进方向的逻辑结论。 TimeTree还支持在日期范围之间查找附加到时间树的事件,此时您可以执行进一步的操作(计数,收入总和等)。

答案 1 :(得分:1)

您应该查看很多date/time functions in the APOC plugin

例如,您可以使用apoc.date.fields(在APOC文档中被过时的名称apoc.date.fieldsFormatted错误地调用)来获取放入节点的年,月,日:

WITH '01/11/2016' AS d
WITH apoc.date.fields(d, 'MM/dd/yyyy') AS f
CREATE (d:Day {name: d, day: f.days, month: f.month, year: f.years});

注意:返回的地图中的属性具有奇数复数的名称。我已提交an issue请求将这些名称改为单数。