16

関係情報を MySQL テーブル (contact_id、other_contact_id、strength、recorded_at) に保存するアプリケーションがあります。連絡先の関係が誰であるかを示したり、2 つの連絡先の相互連絡先のリストを生成したりするだけでよい場合は、これで問題ありません。

しかし今、次のような統計を生成する必要があります:「2011 年 1 月の強度 3 以上の双方向接続の総数は?」または (各連絡先がグループの一部であると仮定して)「どのグループが接続数が最も多いか」他団体などへ

これらの統計情報を生成するための SQL が非常に速く扱いにくくなることがすぐにわかりました。

そこで、特定の日付に対してメモリ内にグラフを生成するスクリプトを作成しました。その後、そのグラフに対して必要な統計を実行できました。グラフ部分の生成を除いて、はるかに理解しやすく、一般的にパフォーマンスも大幅に向上します。

次に考えたのは、これらのグラフをキャッシュして、新しい統計を実行する必要があるときはいつでも呼び出すことができるようにすることでした (または、後でグラフを生成します。たとえば、今日のグラフの場合、昨日のグラフを取得し、昨日以降に発生した変更を適用します)。グラフが 1 MB を超えるまでうまく機能する memcached を試しました。

そこで、Neo4J のようなグラフ データベースを使用することを考えています。

唯一の問題は、グラフが 1 つだけではないことです。または私はそうしますが、それは時間の経過とともに変化するものであり、異なる参照時間でクエリできる必要があります。

私も:

  • 複数のグラフをNeo4Jに保存し、それらを個別に取得/操作しますか? 次に、日付ごとに個別のソーシャル グラフを作成して保存します。

また

  • 有効な to および from タイムスタンプを各エッジに追加し、グラフを適切にフィルター処理します。したがって、「5 月 1 日」のグラフが必要な場合は、「5 月 1 日」より前に作成された 2 つのノード間の最新のエッジのみをたどります (すべてのエッジが5 月 1 日以降に作成されたノードは接続されません)。

私はグラフデータベースにかなり慣れていないので、ヘルプ/ポインター/ヒントをいただければ幸いです。

4

3 に答える 3

15

現在、単一のNeo4jインスタンスに格納できるグラフデータベースは1つだけですが、この1つのgraphdbには、必要な数の異なるサブグラフを含めることができます。グローバル操作(インデックスクエリなど)を実行する場合は、このことだけを覚えておく必要がありますが、タイムスタンプ付きのプロパティを含む複合クエリを実行して、結果を制限することもできます。

これを行う1つの方法は、特定の日付のグラフの構造を表すためにエッジに時間情報を追加すると言ったように、その時点でグラフの構造をトラバースできることです。

Neo4jでは、参照ノードの意味が異なります。

1日あたりのカテゴリノードの使用(およびそれらをリンクし、より高いレベルの期間でそれらを集約すること)は、インデックス付きプロパティよりもノードを分類するためのより多くのグラフ化方法です。(事実上、これらは、トラバーサルとグラフクエリに簡単に含めることができるグラフ内インデックスです)。

異なる時間構造のみに関心がある限り、ノードを複製する必要はありません。ノードも異なる場合(たとえば、プロパティを変更する場合は、それらを複製して、異なるサブグラフを効果的に作成できます)、または変更のみ(または要件に応じて完全なスナップショット)を含む履歴ノードの接続リストを各ノードに作成します。

あなたのドメインはグラフデータベースに非常に適しているように思えます。より詳細な質問がある場合は、Neo4jメーリングリストに気軽に参加してください。

于 2011-05-11T11:43:51.770 に答える