2017-03-04 126 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