mongodb - 结合 Neo4J 和 MongoDB : Consistency

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

因此,我尝试使用 Neo4j Java REST 绑定(bind)和 MongoDB Java 驱动程序将两者结合到 Java 应用程序中。我所有的域实体都有一个唯一标识符,我将其存储在两个数据库中。其他数据存储在 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 block 中实现一些东西。

我是否应该切换到 CouchDB,它似乎是事务性的?

编辑:经过更多研究,由评论引发,我开始意识到 CouchDB 也不适合我的特定需求。澄清一下,Neo4j 部分是一成不变的。 Document Store 数据库只要有 Java 库就行。

最佳答案

彼得-扬,

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

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

https://stackoverflow.com/questions/16416787/

相关文章:

php - 为什么这种 mongo 排序在 PHP 中不起作用?

mongodb - 如何使用 c# 在 mongodb 中增加一个字段

java - 带有Java play 2.0的mongodb数据库

php - mongodb:查找列的最高数值

c# - MongoDB + C# 驱动程序 + 查询元素数组,其中每个数组元素包含要查询的子文档

node.js - 如何在 mongoose、Node.js 中通过 var 设置键?

node.js - 模型操作的 Sails.js 身份验证

node.js - Mongoose 不更新嵌入式文档

mongodb - 与 skip() 和 limit() 一起使用的 Distinct() 命令

javascript - 如何在 mongodb-native findAndModify 中使用变