バッチ インサータを使用して、約 10 億のノードと 100 億の関係を持つデータベースを作成しています。リレーションシップを min(from, to) の順序で並べ替えることが望ましいことを複数の場所で読みましたが (これは実行しませんでした)、このプラクティスが最適である理由を理解していません。当初、これは挿入速度を向上させるだけだと思っていましたが、データベースをオンにすると、トラバーサルが非常に遅くなりました。特にこのサイズのデータベースでは、それには多くの理由がある可能性があることを認識していますが、関係を保存する方法を除外できるようにしたいと考えています。
主な質問:リレーションシップを非常に「ランダムな」順序で挿入すると、ディスク上のどこに保存されるかによって、トラバーサル速度が低下しますか? ノードをトラバースしようとすると、関係が断片化しすぎているのではないかと考えています。これが当てはまるかどうかについて、誰かが私に教えてくれることを願っています。
更新:
ユースケースは、クエリに REST API を介して Cypher を使用する基本的な Neo4j の友人の友人の例です。
各ノード (人) は一意であり、誰を知っているかについて多数の「知っている」関係があります。私は 10 億のノードを持っていますが、100 億のリレーションシップはすべて約 3,000 万のノードから発生しています。したがって、クエリで使用する開始ノードには、そこから平均で約 330 の関係があります。
私の最初のテストでは、4 つの順序付けられていない友達の友達の結果を取得するだけでも、信じられないほど時間がかかりました (平均で 100 秒以上)。もちろん、クエリごとにキャッシュがウォームアップされた後はかなり高速でしたが、グラフはかなりランダムであり、リレーションシップ全体をメモリに格納することはできません。
必要に応じて、私のシステムの詳細の一部: