[英]processing and comparing dates in cypher and neo4j
我正在使用 Neo4j 数据库,并且需要能够查询检查节点中的日期属性是在当前日期之前还是之后。 使用日期格式为 mm/dd/yyyy 的 csv 文件将日期传递到数据库中。
在研究了这个概念后,我发现 neo4j 目前在其发布版本中不支持日期。 如果neo4j 不支持日期,我如何让neo4j 进行查询,它会检查currentDate > dateProperty(意味着当前日期在日期属性中的日期之后)?
我不希望更改格式,除非有一种方法可以将日期存储为 neo4j 可以使用的格式,但将其显示为 mm/dd/yyyy。 如果没有,有没有办法可以将日期转换为neo4j可以使用查询中的代码使用的格式?
[更新了有关 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
子句中(这是完全合法的),那么可能会不必要地为每个Data
节点重新计算cd
集合。
注意 2:只要每个日期的格式始终正好是mm/dd/yyyy
此查询不需要在比较之前将每个日期组件转换为 int。 例如, mm
必须始终为 2 个数字字符('12' > '09' 为true
),否则查询将无法正常工作('12' > '9' 为false
)。
在 neo4j 3.x 中,添加了 APOC 程序支持(但它必须安装在 neo4j 服务器上),包括日期/时间支持的程序。
在最新版本的 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")
(可以使用更多的日期/日期时间变体,请参阅文档)。
然后,您可以在选择节点时对日期/日期时间属性进行(正确)比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.