【问题标题】:processing and comparing dates in cypher and neo4j在 cypher 和 neo4j 中处理和比较日期
【发布时间】:2020-06-08 19:13:38
【问题描述】:

我正在使用 neo4j 数据库,需要能够查询检查节点中的日期属性是在当前日期之前还是之后。使用日期格式为 mm/dd/yyyy 的 csv 文件将日期传递到数据库中。

研究了这个概念后,我发现 neo4j 目前在其发布版本中不支持日期。如果 neo4j 不支持日期,我如何让 neo4j 进行查询,检查 currentDate > dateProperty (意味着当前日期在日期属性中的日期之后)?

我不希望更改格式,除非有办法以 neo4j 可以使用但显示为 mm/dd/yyyy 的格式存储日期。如果没有,有没有办法可以将日期转换为 neo4j 可以使用查询中的代码使用的格式?

【问题讨论】:

  • 唯一比陷入使用已实现日期的语言处理日期的兔子洞更糟糕的是,陷入使用未实现日期的语言处理日期的兔子洞。

标签: database date datetime neo4j


【解决方案1】:

[更新了 neo4j 3.x 中的 APOC 信息]

原答案

此查询应返回满足currentDate > d.date 的所有节点。它假定您以相同的mm/dd/yyyy 格式传递currentDate 参数。

WITH split({currentDate}, '/') AS cd
MATCH (d:Data)
WITH cd, split(d.date, '/') AS dd, d
WHERE
  (cd[2] > dd[2]) OR
  (cd[2] = dd[2] AND
    ((cd[0] > dd[0]) OR
     (cd[0] = dd[0] AND (cd[1] > dd[1]))))
RETURN d

注意 1:我在开头使用WITH,这样cd 的计算只进行一次。如果该逻辑已合并到另一个 WITH 子句中(这是完全合法的),那么 cd 集合可能会不必要地为每个 Data 节点重新计算。

注意 2:只要每个日期的格式始终完全是 mm/dd/yyyy,此查询不需要在比较之前将每个日期组件转换为 int。例如,mm 必须始终为 2 个数字字符('12' > '09' 是 true),否则查询将无法正常工作('12' > '9' 是 false)。

neo4j 3.x 中添加的 APOC 程序

在neo4j 3.x 中,添加了APOC 程序支持(但它必须安装在neo4j 服务器上),包括date/time support 的程序。

【讨论】:

  • 我假设 Data 代表一个节点,而不仅仅是节点中的一段内容?
  • 为什么开头有with?
  • 是的,Data 是一个label,可以应用于一个或多个节点。我决定添加它,以防你已经有标签。请参阅我的更新答案,了解为什么会有领先的 WITH
  • 我试过这个,它看起来很有希望,除了当我运行它时,它返回了一个 d.date 大于 currentDate 的项目。我输入 07/28/2015 作为 cd,它返回一个日期为 11/24/2015 的节点。
  • See this console,它重现了您所说的您尝试过的内容。正如预期的那样,查询没有返回结果。
【解决方案2】:

在最新版本的 Neo4j 中,您有 date() 和 datetime() 两种格式:

https://neo4j.com/docs/cypher-manual/current/functions/temporal/date/ https://neo4j.com/docs/cypher-manual/current/functions/temporal/datetime/

设置节点属性时,请使用类似于以下的语法:

Match(n) where id(n) = 123 set n.somedatevalue = datetime("2020-06-08T13:08:00Z")

(可以使用更多的日期/日期时间变体,请参阅文档)。

然后,您可以在选择节点时对日期/日期时间属性进行(适当的)比较。

【讨论】:

    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    相关资源
    最近更新 更多