Neo4J グラフ データベース (プロバイダーとして GrapheneDB を使用) を利用する .Net アプリケーションを作成しました。新しいグラフ オブジェクトを保存すると、パフォーマンスの問題が発生します。グラフの履歴を保持していないので、保存するたびに、最初にノードと関係を含む古いグラフを削除してから、新しいグラフを保存します。ノードにまだインデックスを付けていません。これらのグラフを一度に複数ロードするのは非常に高速なので、これは問題ではないと思います。
私の save メソッドは、各ブランチをステップ実行し、ノードと関係をマージします。(きれいにするために、各ステップから関係を除外しました)。完全なクエリが作成された後、コードは 1 回で実行されます。
- ルート ノード 37 とノード 4 をマージします。
- type1 ノード 12-17 を 4 とマージ
- type2 ノード 18-22 を 4 とマージ
- 2 を 37 とマージする
- 7-11 を 2 にマージ
- 5 を 37 とマージします (関係を作成します)
- 23-26 を 5 にマージ
- 6 を 37 とマージします (関係を作成します)
- 30-27 を 6 とマージ
ノード 2、4、5、6 は、100 ~ 200 のリーフ ノードを持つことができます。私のデータベースには、これらのグラフが約 100 個あります。この保存には、実稼働環境でサーバーに 10 ~ 20 秒かかる場合があり、タイムアウトになることもあります。
別の方法で保存しようとしましたが、時間がかかりますが、タイムアウトすることはあまりありません。最初にノードのグループを作成します。各ノードにはルート ID 37 が格納されます。各グループは個別の実行で作成されます。ノードを作成したら、子ノードとルート ノードを選択して関係を作成します。これにより、クエリが個別の小さなクエリに分割されます。
この保存のパフォーマンスを改善するにはどうすればよいですか? これらのグラフを 30 個読み込むには、3 ~ 5 秒かかります。また、データが追加されるにつれて、保存のパフォーマンスが大幅に低下することにも注意してください。