2017-03-04 78 views
1

我一直在使用临床图形数据集处理重新接纳问题。假设患者在30天内被重新接受。所以,这意味着我需要在第二次访问日期的第一天(访问日期)添加30天。如何在Cypher中将日期添加到日期属性?

这里是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) 

这个查询将不能工作,因为日期属性是YYYYMMDD格式。例如,如果是20151225,则会提供20151255.但我需要在添加30天后将其作为20160124。是否有其他方式使用与YYYYMMDD不同的格式。我知道字符串格式为YYYY-MM-DD,但是如何使用这种格式来添加日期?

如何做到这一点?

我将不胜感激您的帮助。

+2

您是否考虑过使用支持日期和时间的[APOC库](https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_date_time_support)? –

回答

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) 

Ofcourse,你可以简化这个查询,并把它缩短:

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

借用APOC程序。为了让事情变得更容易,我们有一些新的功能可以在不久的将来使用不同的时间单位来增加时间,所以你可以花一些时间(如果你愿意的话可以选择毫秒),并且在没有时间的情况下增加30天的时间自己做乘法。类似于'return apoc.date.add(e.unix,'s',30,'d')as thirtyDaysLaterInSeconds' – InverseFalcon

+0

['apoc.date.add()'](https://neo4j-contrib.github。 io/neo4j-apoc-procedures /#_ adding_subtracting_time_unit_values_to_timestamps)现已在APOC程序中提供。试试看! – InverseFalcon

0

我们发现了一个临时的解决办法:我们设置在过去的一个具体日期(本例中为1/1/2009),并且在第一次访问(e.ADMIT_DATE-1/1/2009)和第二次访问(e2.ADMIT_DATE-1/1/2009)为天。然后,我们可以得出第一次和第二次访问(e2.DAYS-e.DAYS)之间的差异,找出重新接纳标准的30天。

我已经签出了apoc程序插件,它似乎有点复杂。但我绝对可以重试它。非常感谢您的回应。

+1

小心,如果这些是你使用的确切表达式。 '-1/1/2009'将被解释为减1除以1除以2009(作为整数,因为没有操作数是浮点)。 – InverseFalcon