6

おそらく数百万のノードとエッジを持つ大きな有向グラフ G を維持する必要があります。メモリに収まらない可能性があります。

このグラフで実行する必要がある頻繁な操作には、次のようなものがあります。

  1. 各ノード/エッジには、アクセス数、重みなど、それに関連付けられたユーザー定義のプロパティがあります。

  2. ノード (頂点) ごとに、プロパティ値に基づいて効率的なクエリを実行する必要があります。たとえば、X 値が v1 より大きく v2 より小さいノードを見つけます。これには、おそらく特定のフィールドにインデックスを作成する必要があります。

  3. 特定のノードのすべての着信エッジと発信エッジを見つけて、エッジの重みを更新する必要があります。

  4. 特定のノードからローカル (DFS ベース) トラバーサルを実行し、特定のユーザー定義の述語を満たすすべてのパスを返す必要があります (この述語は、パス内のノード/エッジのプロパティ値を使用する場合があります)。

  5. ノード/エッジを効率的に追加/削除する必要があります。ただし、これは操作 1、2、3 ほど頻繁には実行されません。

グラフには、他の部分よりも頻繁にアクセスされるホットスポットがいくつかある可能性があり、これらのホットスポットをメモリにキャッシュしたいと考えています。

最小限の実装労力でこれを達成する効率的な方法は何ですか?

Neo4j/InfiniteGraph/DEX などのディスクベースのグラフ データベースを検討しています。上記のすべての操作をサポートしていますが、一貫性/同時制御やクラスターベースのレプリケーションなど、提供されている多くの機能は必要ないため、やり過ぎのようです。また、それらの多くは Java に基づいており、C/C++ インターフェイスを備えたものを好みます。

基本的に、永続性、ノードのクエリ、およびローカル トラバーサルを効率的に処理するオンディスク グラフ ライブラリが必要です。私が使用できる既存の(オープンソース)プロジェクトに関する推奨事項はありますか? そうでない場合、そのようなことを実装する最良の方法は何ですか?

4

1 に答える 1