结合Neo4J和MongoDB:一致性

时间:2013-05-07 10:30:09

标签: mongodb transactions neo4j consistency

这些天我正在做很多实验,我想做的其中一件事就是结合两个流行的NoSQL数据库,即Neo4j和MongoDB。仅仅因为我觉得它们完美地相互补充。 Neo4j中的第一类公民,即关系,是MongoDB中缺少的,而MongoDb允许我不在我的节点属性中放入大量数据。

所以我试图在Java应用程序中使用Neo4j Java REST绑定和MongoDB Java驱动程序将两者结合起来。我的所有域实体都有一个唯一的标识符,我存储在两个数据库中。其他数据存储在MongoDB中,实体之间的关系存储在Neo4J中。例如,两个数据库都包含userid,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库那么长。

3 个答案:

答案 0 :(得分:11)

彼得-一月,

如果您能够使用Neo4j 2.0,您可以实现一个Schema-Index-Provider(这非常简单),可以在MongoDB中以事务方式创建文档。

由于Neo4j使其索引提供程序具有事务性(从一开始),我们使用Lucene做了这个,并且还有一个用于Redis(需要更新)。但是使用Neo4j 2.0要容易得多,如果你愿意,可以查看我的MapDB实现。 (https://github.com/jexp/neo4j-mapdb-index

答案 1 :(得分:2)

虽然我是这两种技术的忠实拥护者,但我认为更好的选择可能是OrientDB。它是一个图形(如Neo4)和文档(作为MongoDB)数据库,并支持ACID事务。听起来非常适合您的需求。

答案 2 :(得分:0)

在此发布https://stackoverflow.com/questions/23465663/what-is-the-best-practice-to-combine-neo4j-and-mongodb?lq=1,您可以查看Structr。

它的后端可以被视为Neo4j周围的文档数据库。它完全是事务性的和开源的。

相关问题