如何在Cypher的日期属性中添加天数?

时间:2017-03-04 21:23:13

标签: date neo4j cypher days

我一直在使用临床图数据集进行再入院问题。假设患者在30天内重新入院。因此,这意味着我需要在第二个访问日期的第一个日期(访问日期)添加30天。

以下是Cypher查询:

MATCH(p:Person)-[r:PATIENT_HAS]->(e:Encounter)  
WITH p,e 
MATCH (p)-[r:PATIENT_HAS]-(e2:Encounter) WHERE e2.ADMIT_DATE < (e.ADMIT_DATE + 30)

此查询无效,因为date属性为YYYYMMDD格式。例如,如果是20151225,则会给出20151255.但是我需要在添加30天后将其作为20160124。有没有其他方法可以使用与YYYYMMDD不同的格式。我知道YYYY-MM-DD有字符串格式,但使用这种格式添加天数的方法是什么?

怎么能做到这一点?

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

在我看来,在Neo4j中处理日期的最佳方法是将它们保存为UNIX纪元时间,以毫秒或秒为单位。我们在Neo4j中有一个很棒的插件叫apoc procedures,允许你使用很棒的程序。在您的具体情况下,我将使用apoc.date.*程序并将您的日期格式解析为以秒为单位的纪元时间。

MATCH (e:Encounter)
WITH e,apoc.date.parse(e.ADMIT_DATE,"s","YYYYMMDD") as unix
set e.unix = unix

所以现在你的查询看起来像是:

MATCH(p:Person)-[r:PATIENT_HAS]->(e:Encounter)   
MATCH (p)-[r:PATIENT_HAS]-(e2:Encounter) 
WHERE e2.unix < e.unix + (30 * 24 * 60 * 60)

当然,您可以简化此查询并缩短查询时间:

MATCH  (e2:Encounter)-[r:PATIENT_HAS]-(p:Person)-[r:PATIENT_HAS]->(e:Encounter)  
WHERE e2.unix < e.unix + (30 * 24 * 60 * 60)

答案 1 :(得分:1)

您可以构建 Duration,并将其直接添加到日期。 以下是 Cypher 中的示例:

RETURN Date() + Duration({days: 30})

参考:https://neo4j.com/docs/cypher-manual/current/functions/temporal/duration/

答案 2 :(得分:0)

我们找到了一个临时解决方案:我们在过去设定了一个特定日期(在我们的案例中是1/1/2009),并且正在获得第一次访问之间的差异(e.ADMIT_DATE-1/1/2009)第二次访问(e2.ADMIT_DATE-1/1/2009)为天。然后我们能够得出第一次和第二次访问之间的差异(e2.DAYS-e.DAYS),以确定再入标准的30天。

我检查了apoc程序插件,看起来有点复杂。但我绝对可以重试它。非常感谢你们的回应。

答案 3 :(得分:0)

我目前正在使用Neo4j 4.0.3和以下作品:

RETURN REPLACE(toString(date('20151225') + duration('P30D')),'-','')
// "20160124"