【问题标题】:Storing dates as nodes in Neo4j在 Neo4j 中将日期存储为节点
【发布时间】:2016-12-06 14:34:11
【问题描述】:

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

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

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

据我了解,将日期创建为节点可能会给我带来一些好处:

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

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

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

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

我是在这里做某事还是只是在浪费时间?谢谢!

【问题讨论】:

标签: date neo4j cypher graph-databases


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有很多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 要求将名称设为单数。

    【讨论】:

    • 感谢您的回答,我不知道APOC,它看起来非常非常有趣!