9

Neo4jグラフでノード間の関係の強さの変化を表現したいと思います。

静的グラフの場合、これは、関係に「強度」プロパティを設定することで簡単に実行できます。

  A --knows--> B
       |
     strength
       |
       3

ただし、時間の経過とともに更新する必要があるグラフの場合、書き込み前の読み取りが必要なため、プロパティの値をアトミックに(RESTインターフェイスを介して)インクリメントできないため、問題があります。入ってくるストリーミングデータに応じてグラフを更新する場合は、(単に更新するのではなく)インクリメントする必要があります。

一度に1つのRESTクライアントのみが読み取りと書き込みを行うようにする(外部同期)か、組み込みのトランザクションを使用できるように組み込みAPIのみに固執する必要があります。これは実行可能かもしれませんが、厄介なようです。

もう1つの解決策は、プロパティなしで複数の関係を記録することです。これにより、「強度」は実際には関係の数になります。

A knows B
A knows B
A knows B

強さ3の関係を意味します。

  • 短所:整数の強さしか記録できません
  • 利点:書き込み前の読み取りは必要ありません
  • 短所:(おそらく)より多くのストレージが必要
  • 短所:(おそらく)複数の関係を抽出してカウントする必要があるため、値の抽出がはるかに遅くなります

誰かがこのアプローチを試しましたか、そして特に読書のときにパフォーマンスの問題に遭遇する可能性がありますか?

これをモデル化するためのより良い方法はありますか?

4

3 に答える 3

5

良いアイデア。ストレージとマルチリードを減らすために、これらの関係は、トランザクションで実行されるバッチジョブで1つに集約できます。

各relは、個別の重み値を保持することもでき、その集計値が重みとして使用されます。整数ベースである必要はなく、デクリメントを表すために負の値にすることもできます。

単一の関係の重み値をトランザクションで更新するための小さなサーバー拡張機能を作成することもできます。おそらくRESTAPIにも意味があります(「単一値の設定」操作に加えて、単一値の変更操作があるため)。

PUT http://localhost:7474/db/data/node/15/properties/mod/foo 

本文にはデルタ値(1.5、-10)が含まれています。もう1つのアイデアは、modeキーワードを実際の操作に置き換えることです。

PUT http://localhost:7474/db/data/node/15/properties/add/foo 
PUT http://localhost:7474/db/data/node/15/properties/or/foo 
PUT http://localhost:7474/db/data/node/15/properties/concat/foo 

整数以外の場合、「増分」とはどういう意味ですか?

于 2011-12-13T10:10:39.103 に答える
2

うーん、少し異なるアプローチですが、キューイングシステムの使用を検討することもできます。私はNeo4jRESTインターフェースも使用しており、絶えず変化する関係の強さを保存することを検討しています。プロジェクトはRailsにあり、Resqueを使用しています。Neo4jデータベースの更新が必要な場合は常に、Resqueキューにスローされ、ワー​​カーが完了します。Neo4j Resqueキューで作業しているワーカーは1人だけなので、一度に複数のNeo4j更新を実行しようとはしません。

これには、ユーザーが更新をトリガーするアクションを実行するときに、neo4jの更新を待たないという追加の利点があります。ただし、Neo4jの更新をすぐに使用/表示する必要がない場合にのみ実行可能なソリューションです(ただし、ワーカーの速度とキューのサイズによっては、数秒しかかかりません)。

于 2011-12-23T16:09:59.317 に答える
1

対象とする読み取りおよび書き込みの負荷に少し依存します。グラフ全体の大きさはどれくらいになりますか?

于 2011-12-12T23:07:41.330 に答える