2016-03-27 6 views
1

私はグラフのデータベースに入っていて助言が必要です。関係のプロパティを使用したNeo4jモデリングのアドバイス

この例では、「Person」ノードと「Project」ノードの2つの関係があります。 2つの関係は以下のとおりです。

  • 予定日が、これは投影終了日付
  • 検証日付で、これはどちらのプロジェクトに人からある実際の完成日

です。

具体的には、リレーションシッププロパティを使用してイベントの「日付値」を保持することを参照してください。彼らはこれに対して何らかのマイナス面であるか、これをグラフでモデル化するより良い方法ですか?

単純なモックアップは以下である: enter image description here

答えて

3

むしろユリウス日付としてよりも、(長い整数として格納されている)は、UNIXエポックタイムスタンプの形式で日付を保持することが容易です。 Neo4jには、日付/時刻形式は組み込まれていません。

タイムスタンプを使用して、日付の計算を実行して、現在の日付に基づいてプロジェクトの日数を指定することができます。

Cypherのtimestamp()機能は、neo4j内の現在のUnix時間を取得する方法を提供します。

Neo4Jの各関係は、関係の実際の内容を除いて、内部的に34バイトのデータを占有します。スケジュール済みの完了と検証済みの完了の両方を、2つの関係として格納するのではなく、単一の関係でプロパティとして保持する方が効率的です。

リレーションシップには、スケジュールされた日付と確認された日付(NoSQLの利点)の両方を持つ必要はありません。後でSETキーワードを使用して確認日を追加できます。

例を挙げてください。

次のCypherステートメントを使用して作成します。

Create (p:Person {name:'Bill'})-[r:Works_On {scheduledcompletion: 1461801600}]->(pro:Project {name:'Jabberwakie'}) 

次のCypherステートメントを使用して、検証済みの日付を現在の時刻に設定します。

Match (p:Person {name:'Bill'})-[r:Works_On]->(pro:Project {name:'Jabberwakie'}) set r.verifiedcompletion=timestamp() 

プロジェクトが予定より遅れたりしなかった場合はブール値を返すために、この場合には、計算のいくつかの種類を実行するには、次のサイファーのステートメントを使用します。

Match (p:Person {name:'Bill'})-[r:Works_On]->(pro:Project {name:'Jabberwakie'}) return case when r.scheduledcompletion > r.verifiedcompletion then true else false end as behindschedule 
+0

本当にありがとうございました。あなたも提案した日付形式を調べます。 –

+0

よろしくお願いいたします。私はそれが助けてくれることを願っています:) – Anomaly211

0

はまた、全体のプロジェクトに関連して、このプロパティは、それに関連するすべての人のために同じである場合場合にノードプロジェクトに投影終了の日付と実際の完成の日付を格納考えます。

これは、データの重複を避けるのに役立ちます。また、プロパティを使用してプロジェクトをクエリすると、関係を探す必要がなくなります。あなたのモデルが異なる人物のために実際に異なる日付になるように設計されていて、データセットをリレーションシップに格納するのであれば、プロジェクト全体のノード情報をプロジェクトノードに格納することも理にかなっています。モデルをより明確にし、いくつかのクエリを実行するのが速くなるので、

+0

申し訳ありませんが、私は完全な説明はしませんでしたが、このモデルには同じプロジェクトを実行している個人がいて、これが私が関係にデータを入れようとした理由です。あなたはそれを違う方法でやってくれると言いましたか? –