2017-03-04 1 views
1

Ich habe mit einem klinischen Diagramm-Datensatz an einem Rückübernahme-Problem gearbeitet. Nehmen wir an, ein Patient wird innerhalb von 30 Tagen wieder aufgenommen. Das bedeutet, dass ich für das Datum des zweiten Besuchs 30 Tage zum ersten Datum (Besuchsdatum) hinzufügen muss. HierWie kann ich Tage zu einer Datumseigenschaft in Cypher hinzufügen?

ist die Cypher Abfrage:

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) 

Diese Abfrage wird nicht funktionieren, weil das Datum Eigenschaft in YYYYMMDD-Format ist. Zum Beispiel, wenn es 20151225 ist, wird es 20151255 geben. Aber ich muss es nach Hinzufügen von 30 Tagen als 20160124 bekommen. Gibt es eine andere Möglichkeit, ein anderes Format als YYYYMMDD zu verwenden? Ich weiß, dass es ein String-Format wie YYYY-MM-DD gibt, aber wie kann man dieses Format verwenden, um Tage hinzuzufügen?

Wie kann dies erreicht werden?

Ich würde Ihre Hilfe zu schätzen wissen.

+2

Haben Sie darüber nachgedacht, die [APOC-Bibliothek] (https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_date_time_support) zu verwenden, die Datums- und Uhrzeitangaben unterstützt? –

Antwort

4

Der beste Weg, mit Daten in Neo4j zu behandeln, ist meiner Meinung nach, sie als UNIX-Epochenzeit in Millisekunden oder Sekunden gespeichert zu haben. Wir haben ein großartiges Plugin in Neo4j mit dem Namen apoc procedures, das Ihnen erlaubt, großartige Prozeduren zu verwenden. In Ihrem speziellen Fall würde ich apoc.date.* Prozeduren verwenden und Ihr Datumsformat auf Epochzeit in Sekunden analysieren.

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

So jetzt Ihre Abfrage aussehen würde:

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 Sie diese Abfrage vereinfachen können und machen es kürzer:

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

Abgestimmt mit APOC-Verfahren. Und um die Dinge einfacher zu machen, haben wir einige neue Funktionen, die in Kürze in die Pipeline kommen, um Zeit mit unterschiedlichen Zeiteinheiten hinzuzufügen, so dass Sie eine Zeit in s (oder ms, wenn Sie bevorzugen) nehmen und an 30 Tagen Zeit ohne hinzufügen können um die Multiplikation selbst zu machen. So etwas wie 'return apoc.date.add (e.unix, 's', 30, 'd') als thirtyDaysLaterInSeconds' – InverseFalcon

+0

[' apoc.date.add() '] (https: //neo4j-contrib.github. io/neo4j-apoc-procedures/# _ adding_subtracting_time_unit_values_to_timestamps) ist jetzt in APOC-Prozeduren verfügbar. Probieren Sie es aus, wenn Sie können! – InverseFalcon

0

Wir fanden eine vorübergehende Lösung aus: Wir setzen ein bestimmtes Datum in der Vergangenheit (01.01.2009 in unserem Fall) und unterscheiden zwischen dem ersten Besuch (e.ADMIT_DATE-1/1/2009) und dem zweiten Besuch (e2.ADMIT_DATE-1/1/2009) als Tage. Dann können wir die Differenz zwischen dem ersten und dem zweiten Besuch (e2.Days-e.Days) ermitteln, um 30 Tage für die Rückübernahmekriterien zu ermitteln.

Ich hatte das apoc procedures plugin ausgecheckt und es schien ein bisschen kompliziert. Aber ich kann es definitiv wiederholen. Vielen Dank für Ihre tollen Antworten.

+1

Seien Sie vorsichtig, wenn dies die exakten Ausdrücke sind, die Sie verwenden. '-1/1/2009' wird als Subtraktion von 1 geteilt durch 1 dividiert durch 2009 interpretiert (als Ganzzahlen, da keiner der Operanden Gleitkomma ist). – InverseFalcon

Verwandte Themen