Je suis historien de l’histoire médiévale et j’essaie de coder les réseaux entre rois, ducs, papes, etc. sur une période d’environ 50 ans (de 1220 à 1270) dans l’Allemagne médiévale. Comme je ne suis pas un spécialiste des bases de données graphiques, je cherche la possibilité de gérer des dates et des plages de dates.
Existe-t-il des possibilités de gérer une plage de dates jusqu'à un bord de façon à ce que les bords, qui représentent une relation, disparaissent après la disparition, par exemple? 3 années?
Existe-t-il une possibilité de demander des relations qui ont leur date-tag dans une plage de dates?
La façon habituelle de traiter les dates dans Neo4j est de les stocker sous forme de chaîne ou sous forme de millis depuis Epoch (aka msec depuis le 01/01/1970).
La première approche rend le graphique plus lisible, la dernière vous permet de faire des calculs, par exemple. calculer les deltas.
Dans votre cas, je stockerais deux propriétés appelées validFrom
et validTo
sur les relations. Vos requêtes doivent vous assurer que vous recherchez le bon intervalle de temps.
Par exemple. Pour trouver le (s) roi (s) en charge de la France du 01 janvier 1220 au 31 décembre 1221, vous devez:
MATCH (c:Country{name:'France'})-[r:HAS_KING]->(king)
WHERE r.validFrom >= -23667123600000 and r.validTo <=-23604051600000
RETURN king, r.validFrom, r.validTo
Depuis Neo4j 3.0, il y a la bibliothèque APOC qui fournit quelques fonctions pour convertir les horodatages en/à partir de chaînes de date lisibles par l'homme .
Vous pouvez également stocker les dates dans leur représentation numérique sous le format suivant: YYYYMMDD
Dans votre cas, 12200101
serait le 1er janvier 1220 et 12701231
serait le 31 décembre 1270.
C'est un format utile et lisible et vous pouvez effectuer des recherches de plage comme:
MATCH (h:HistoricEvent)
WHERE h.date >= 12200101 AND h.date < 12701231
RETURN h
Il vous permettrait également de commander par dates, si vous en avez besoin.
A partir de Neo4J 3.4 , le système gère la durée et les dates, voir le documentation officielle . Voir plus d'exemples ici .
Un exemple lié à la question initiale: Récupérer les événements historiques survenus au cours des 30 derniers jours:
WITH duration({days: 30}) AS duration
MATCH (h:HistoricEvent)
WHERE date() - duration < date(h.date)
RETURN h
Une autre option pour les dates qui maintient le nombre de nœuds/propriétés que vous créez relativement bas est une liste d’années liées (première année d’intérêt - dernière année), un des mois (1-12) et une des dates dans un mois (1- 31). Chaque événement de votre graphique peut ensuite être connecté à une année, un mois et un jour. De cette façon, vous n'avez pas à créer un nouveau nœud pour chaque nouvelle combinaison année-mois. Vous avez juste un seul ensemble de mois, un de jours et un an. Je redimensionne les chiffres pour les manipuler plus facilement,
Années yyyy * 10000
Mois sont mm * 100
Date sont jj
donc si vous exécutez une requête telle que
match (event)-[:happened]->(t:time)
with event,sum(t.num) as date
return event.name,date
order by date
Vous obtiendrez une liste de tous les événements par ordre chronologique, avec des dates comme le 17 janvier 1904 (19040117) (format aaaammjj).
De plus, étant donné que ce sont des listes chaînées où, par exemple, ...- (t0: heure {num: 19040000}) - [: précède] -> (t1: heure {num: 19050000}) -. .. La commande est également intégrée aux nœuds.
C’est, jusqu’à présent, comment j’ai aimé faire ma datation