web-dev-qa-db-ja.com

Postgresqlでグラフデータをモデル化する最良の方法

疎な有向グラフまたは無向グラフをPostgresqlに保存および照会するにはどうすればよいでしょうか。 pggraph のようなものがありますが、それはまだ計画段階です。

Neo4Jのような専用のグラフデータベースがこれに最も適していると思います。ただし、拡張機能またはデータ型を使用してPostgresql内に同じものを実装する方法はあります。これにより、別のデータベースエンジンを追加する必要がなくなります。

26
jethar

質問は、あまりにも曖昧で広すぎて、正確な答えを出すことができないと思います...

ただし、本質的には、SQLデータベース内のグラフデータを効率的にクエリするためのいくつかの手法があり、高度に特殊化されたシナリオに適用されます。たとえば、最短経路を見つけることに関心がある場合は、GRIPPインデックスを維持することを選択できます。 (基本的に、グラフに適用される事前に順序付けられたツリーインデックスのように機能します。)私の知る限り、これらの手法はまだ標準化されていません。

それが言われ、ソーシャルネットワークに言及しているあなたのコメントを見ると、それらのそれぞれが過剰であるという可能性があります。興味が主にユーザーの友人に関連するデータの取得にある場合、またはノードの近隣を照会するという意味で同等のものにある場合、結合でトラバースする必要があるノードの数は非常に少ないため、必要はありません専用ツール、データ構造など:単に再帰CTEを使用します。

http://www.postgresql.org/docs/current/static/queries-with.html

後者を使用するときに最適なパフォーマンスを得るには、クエリのwith (...)部分内でできるだけ多くのwhere条件をシフトして、ノードを早期に削除します。

18

基礎となるストレージにPostgreSQLを使用し、処理エンジンにPL/Python経由でnetworkXまたはiGraphを使用します。

彼らの本「 Graph Databases 」では、Ian Robinson、Jim Webber、およびEmil Eifremが、基礎となるストレージと処理エンジンを区別しています。最近の問題( here を参照)で従った答えを見ると、基礎となるストレージにPostgreSQLを使用し、処理エンジンとしてnetworkXを使用していることがわかります。元のソリューションに比べてパフォーマンスが大幅に向上し(「グラフデータベース」の本で説明されているものと同様)、その実装は非常に簡単でした。

17
Ian Gow

質問は一般的なものなので、ストリートネットワークのようなほとんど平面のグラフで機能するソリューションを追加します。PostgreSQLはPostgis topology を介して優れたソリューションを提供します。 Postgisトポロジは、ジオメトリをエッジ、ノード、面、およびそれらの相対的な関係として保存します。これは、ストリートネットワークのジオメトリからエッジとその開始ノードと終了ノードを選択できることを意味します。これにより、選択した処理エンジンで簡単にグラフを作成できます(networkxまたはPyhtonのグラフツールが例です)。

ただし、私が言ったように、Postgresql/Postgisトポロジは、グラフ分析の観点から街路網のようなジオメトリを調査する場合に機能します。

2
Duccio A