当前位置:  开发笔记 > 编程语言 > 正文

结合Neo4J和MongoDB:一致性

如何解决《结合Neo4J和MongoDB:一致性》经验,为你挑选了1个好方法。

这些天我正在做很多实验,我想做的其中一件事就是结合两个流行的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库那么长.



1> Michael Hung..:

彼得 - 扬,

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

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

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有