私は中世の歴史の歴史家であり、中世のドイツで約50年間(1220年から1270年)にわたって王、公爵、教皇などの間のネットワークをコーディングしようとしています。私はグラフデータベースの専門家ではないので、日付と日付範囲を処理する可能性を探しています。
Edgeへの日付範囲を処理する可能性はありますか? 3年?
日付タグが日付範囲内にある関係を要求する可能性はありますか?
Neo4jで日付を処理する一般的な方法は、文字列表現として、またはエポック(1970年1月1日からミリ秒が経過)からのミリ秒として日付を格納することです。
最初のアプローチはグラフをより読みやすくし、後者はあなたが数学を行うことを可能にします。デルタを計算します。
あなたの場合、関係にvalidFrom
およびvalidTo
という2つのプロパティを保存します。クエリでは、正しい時間間隔を探していることを確認する必要があります。
例えば。 1220年1月1日から1221年12月31日までフランスを統括する王を見つけるには、次のようにします。
MATCH (c:Country{name:'France'})-[r:HAS_KING]->(king)
WHERE r.validFrom >= -23667123600000 and r.validTo <=-23604051600000
RETURN king, r.validFrom, r.validTo
Neo4j 3.0以降には、 タイムスタンプを人間が読み取り可能な日付文字列との間で変換するための関数の組み合わせ を提供するAPOCライブラリがあります。
次の形式で日付を数値表現で保存することもできます:YYYYMMDD
あなたの場合12200101
は1220年1月1日であり、12701231
は1270年12月31日です。
これは便利で読みやすい形式であり、次のような範囲検索を実行できます。
MATCH (h:HistoricEvent)
WHERE h.date >= 12200101 AND h.date < 12701231
RETURN h
また、必要に応じて、日付で注文することもできます。
Neo4J 3.4以降 、システムは期間と日付を処理します。 公式ドキュメント を参照してください。他の例を見る ここ 。
元の質問に関連する例:今から過去30日間に発生した履歴イベントを取得します。
WITH duration({days: 30}) AS duration
MATCH (h:HistoricEvent)
WHERE date() - duration < date(h.date)
RETURN h
作成するノード/プロパティの数をかなり低く保つ日付の別のオプションは、リンクリストの年(関心のある最も早い年-最新の年)、月のいずれか(1〜12)、および月の日付のいずれか(1〜 31)。次に、グラフ内のすべての「イベント」を年、月、日に関連付けることができます。この方法では、年と月の新しい組み合わせごとに新しいノードを作成する必要はありません。月、日、年のセットが1つだけあります。簡単に操作できるように数値をスケーリングします
年はyyyy * 10000です
月はmm * 100です
日付はddです
したがって、次のようなクエリを実行すると
match (event)-[:happened]->(t:time)
with event,sum(t.num) as date
return event.name,date
order by date
1904年1月17日などの日付が19040117(yyyymmdd形式)として表示されるすべてのイベントのリストを時系列で取得します。
さらに、これらは、たとえば...-(t0:time {num:19040000})-[:precedes]->(t1:time {num:19050000})-...の順序が構築されているリンクリストであるため、ノードにも。
これは、これまでのところ、イベントでデートをするのが好きな方法です