webentwicklung-frage-antwort-db.com.de

Wie werden Daten in neo4j behandelt?

Ich bin ein Historiker der mittelalterlichen Geschichte und versuche, Netzwerke zwischen Königen, Herzögen, Päpsten usw. über einen Zeitraum von etwa 50 Jahren (von 1220 bis 1270) im mittelalterlichen Deutschland zu kodieren. Da ich kein Spezialist für Graphendatenbanken bin, suche ich nach einer Möglichkeit, Daten und Datumsbereiche zu bearbeiten. 

Gibt es irgendwelche Möglichkeiten, über einen Datumsbereich mit einer Kante umzugehen, so dass die Kanten, die eine Beziehung darstellen, nach z. 3 Jahre?

Gibt es eine Möglichkeit, nach Beziehungen zu fragen, deren Datums-Tag in einem Datumsbereich liegt?

13
Andreas Kuczera

Die übliche Art und Weise, mit Datumsangaben in Neo4j umzugehen, besteht darin, sie entweder als String-Darstellung oder als Millis seit Epoche (alias msec, seit dem 1. Januar 1970) zu speichern.

Der erste Ansatz macht den Graphen leichter lesbar, der zweite erlaubt es Ihnen, Berechnungen durchzuführen, z. Deltas berechnen.

In Ihrem Fall würde ich zwei Eigenschaften mit den Namen validFrom und validTo für die Beziehungen speichern. Ihre Abfragen müssen sicherstellen, dass Sie nach dem richtigen Zeitintervall suchen. 

Z.B. Um den für Frankreich zuständigen König (n) vom 1. Januar 1220 bis zum 31. Dezember 1221 zu finden, tun Sie:

MATCH (c:Country{name:'France'})-[r:HAS_KING]->(king)
WHERE r.validFrom >= -23667123600000 and r.validTo <=-23604051600000
RETURN king, r.validFrom, r.validTo

nachtrag

Seit Neo4j 3.0 gibt es die APOC-Bibliothek, die eine Reihe von Funktionen zum Konvertieren von Zeitstempeln in/aus von Menschen lesbaren Datumsfolgen bereitstellt.

12

Sie können die Datumsangaben auch in ihrer Zahlendarstellung in folgendem Format speichern: YYYYMMDD

In Ihrem Fall wäre 12200101 der 1. Januar 1220 und 12701231 der 31. Dezember 1270. 

Es ist ein nützliches und lesbares Format, und Sie können Suchbereiche wie: 

MATCH (h:HistoricEvent)
WHERE h.date >= 12200101 AND h.date < 12701231
RETURN h

Es würde Ihnen auch erlauben, nach Datum zu bestellen, wenn Sie es brauchen.

6
Amin Abu-Taleb

Ab Neo4J 3.4 behandelt das System Dauer und Datum, siehe offizielle Dokumentation . Weitere Beispiele hier .

Ein Beispiel für die ursprüngliche Frage: Rufen Sie die historischen Ereignisse der letzten 30 Tage ab:

WITH duration({days: 30}) AS duration
MATCH (h:HistoricEvent)
WHERE date() - duration < date(h.date)
RETURN h
2
loopasam

Eine weitere Option für Datumsangaben, bei der die Anzahl der von Ihnen erstellten Knoten/Eigenschaften relativ niedrig gehalten wird, ist eine verknüpfte Listenjahre (frühestes interessierendes Jahr - letztes Jahr), eines von Monaten (1-12) und eines von Datumsangaben in einem Monat (1- 31). Dann kann jedes "Ereignis" in Ihrer Grafik mit einem Jahr, einem Monat und einem Tag verknüpft werden. Auf diese Weise müssen Sie nicht für jede neue Kombination aus einem Jahr, einem Monat und einem Tag einen neuen Knoten erstellen. Sie haben nur einen einzigen Monat, einen Tag und ein Jahr. Ich skaliere die Zahlen, um sie leichter zu manipulieren

Jahre sind JJJJ * 10000

Monate sind mm * 100

Datum sind dd

wenn Sie also eine Abfrage ausführen, z

match (event)-[:happened]->(t:time) 
with event,sum(t.num) as date 
return event.name,date
order by date

Sie erhalten eine Liste aller Ereignisse in chronologischer Reihenfolge. Datumsangaben wie der 17. Januar 1904 erscheinen als 19040117 (Format JJJJMMTT).

Da es sich hierbei um verknüpfte Listen handelt, in denen beispielsweise ... - (t0: Zeit {num: 19040000}) - [: vorangeht] -> (t1: Zeit {num: 19050000}) -. .. Reihenfolge ist auch in den Knoten eingebaut.

So habe ich bisher meine Event-Dating gemacht

1
Tshimanga