私は、大量のグラフ操作がほぼリアルタイムで実行されるプロジェクトに取り組んでいます。現在、Hibernate、MySQL、および EhCache を使用していますが、すべてのグラフ関連の永続性をNeo4jやTitanなどのグラフ データベースに移行することを検討しています。
グラフ データベースは Hibernate+relational よりも優れたパフォーマンスを発揮できますか? 1つのうちの6つを他の6つに置き換えるつもりはないことを確認したいだけです.
neo4j (または一部のグラフ db) に移行する場合の利点は、データ量の増加に関係なく、クエリ時間が一定 (ほぼ) であり、予測可能であることです。一般化された回答は通常、nosql データベースには適用されないため、データドメインに基づいて概念実証を行うことを常にお勧めします。
ここから撮影。
グラフ データベースとリレーショナル データベースはどちらも、クエリのパフォーマンスを向上させるためにキャッシュに依存しています。ただし、グラフ データベースでのエッジ トラバーサルは通常一定時間の操作であり、通常、頂点がキャッシュされている場合はエッジもキャッシュされます。RDBMS では、外部キー トラバーサルには、O(log n) 時間かかるターゲット テーブルでの B ツリー インデックス ルックアップが必要です。インデックスがキャッシュに収まらない場合、データベースは低速なディスク シーク操作を実行する必要があります。
Bitsyをチェックしてください。グラフがメモリに収まる場合、クエリと更新は非常に高速です。または、Neo4J や Titan など、より大きなデータセットを処理できる別のブループリント実装を使用することもできます。
Hibernate を使用している場合は、その性質上オブジェクト グラフであるドメイン オブジェクトを保持しています。
データベースは表形式の構造であり、この関係は問題ありませんが、すぐに壊れてしまいます。さらに、Hibernate には、結合を使用してデータベース全体を取り込むという厄介な癖があります。
Neo4j がオブジェクト リレーションをコア機能として設計されており、ドメインの永続化を行っていることを考えると、この自然な設計の適合性は確実に優れています。
また、Neo4j は Lucene (ばかげた高速検索インデックス) を使用してクエリを実行し、トラバーサルのためにノードに直接ジャンプできます。
結論: Neo4j は、驚異的なスケールとまさにグラフ関連のデータのアイデアのために設計されました。スケーリングに問題はありませんが、ツール/ライブラリは、従来の DB 接続の場合ほど成熟していないことがわかります。