我一直在使用临床图数据集进行再入院问题。假设患者在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有字符串格式,但使用这种格式添加天数的方法是什么?
怎么能做到这一点?
感谢您的帮助。
答案 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"