7

私は最近多くの実験を行っていますが、私がやりたかったことの 1 つは、Neo4j と MongoDB という 2 つの一般的な NoSQL データベースを結合することです。単純に、それらが完全に補完し合っていると感じているからです。Neo4j のファースト クラスの市民であるリレーションは、まさに MongoDB に欠けているものですが、MongoDb を使用すると、ノード プロパティに大量のデータを入れなくて済みます。

そのため、Neo4j Java REST バインディングと MongoDB Java ドライバーを使用して、Java アプリケーションで 2 つを組み合わせようとしています。すべてのドメイン エンティティには、両方のデータベースに保存する一意の識別子があります。他のデータは MongoDB に保存され、エンティティ間の関係は Neo4J に保存されます。たとえば、両方のデータベースにはユーザー ID が含まれ、MongoDB にはプロファイル情報が含まれ、Neo4J には友情関係が含まれます。私が作成したカスタム データ アクセス レイヤーを使用すると、これはまさに希望どおりに機能します。そしてそれは速いです。

しかし... ユーザーを作成したいときは、Neo4j でノードを作成し、MongoDB でドキュメントを作成する必要があります。Neo4j はトランザクション対応で、MongoDB はトランザクション対応でないことを除けば、必ずしも問題ではありません。両方がトランザクションの場合、いずれかが失敗したときに両方のトランザクションをロールバックします。しかし、MongoDB はトランザクション対応ではないため、これを行うことはできません。

ユーザーを作成するたびに、ノードとドキュメントの両方が作成されるか、どちらも作成されないことを確認するにはどうすればよいですか。一致するノードがない大量のドキュメントになってしまいたくありません。

その上、結合されたデータベース インタラクションを ACID に準拠させるだけでなく、スレッドセーフにすることも望んでいます。GraphDatabaseService と MongoClient / DB の両方がシングルトンから提供されます。

MongoDB で「トランザクション ドキュメント」を作成することについて何かを見つけましたが、そのアプローチは本当に好きではありません。私は、neo4j beginTx、tx.success、tx.failure、tx.finish セットアップのような、すてきでクリーンなものが欲しいです。理想的には、同じ try/catch/finally ブロックで実装できるものです。

トランザクショナルに見える CouchDB に切り替えるべきでしょうか?

編集:コメントに触発されてさらに調査した後、CouchDBも私の特定のニーズには適していないことに気付きました。明確にするために、Neo4j の部分は固定されています。ドキュメント ストア データベースは、Java ライブラリを持っている限りではありません。

4

3 に答える 3

11

ピーター・ヤン、

Neo4j 2.0 を使用できる場合は、MongoDB でドキュメントをトランザクション的に作成する Schema-Index-Provider (これは非常に簡単です) を実装できます。

Neo4j は (最初から) インデックス プロバイダーをトランザクション対応にするため、Lucene でそれを行いました。Redis 用のものもあります (更新する必要があります)。しかし、Neo4j 2.0 を使用すると、はるかに簡単になります。必要に応じて、私の MapDB の実装を確認してください。( https://github.com/jexp/neo4j-mapdb-index )

于 2013-05-07T13:54:44.153 に答える
2

私は両方のテクノロジの大ファンですが、OrientDBの方が適していると思います。これは、グラフ (Neo4 として) とドキュメント (MongoDB として) のデータベースであり、ACID トランザクションをサポートします。あなたのニーズに完璧にマッチしているように聞こえます。

于 2013-05-07T11:02:42.413 に答える
0

ここhttps://stackoverflow.com/questions/23465663/what-is-the-best-practice-to-combine-neo4j-and-mongodb?lq=1に投稿されているように、Structr を見ているかもしれません。

そのバックエンドは、Neo4j 周辺のドキュメント データベースと見なすことができます。完全にトランザクション対応でオープンソースです。

于 2014-05-05T06:53:56.030 に答える