Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4J和MongoDB的结合:一致性_Mongodb_Transactions_Neo4j_Consistency - Fatal编程技术网

Neo4J和MongoDB的结合:一致性

Neo4J和MongoDB的结合:一致性,mongodb,transactions,neo4j,consistency,Mongodb,Transactions,Neo4j,Consistency,这几天我做了很多实验,我想做的一件事就是合并两个流行的NoSQL数据库,即Neo4j和MongoDB。只是因为我觉得它们是完美互补的。Neo4j中的第一类公民关系正是MongoDB中缺少的,而MongoDB允许我在节点属性中不放置大量数据 因此,我尝试在Java应用程序中结合这两者,使用Neo4JJavaREST绑定和MongoDBJava驱动程序。我的所有域实体都有一个唯一的标识符,我将其存储在两个数据库中。其他数据存储在MongoDB中,实体之间的关系存储在Neo4J中。例如,两个数据库都包

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

因此,我尝试在Java应用程序中结合这两者,使用Neo4JJavaREST绑定和MongoDBJava驱动程序。我的所有域实体都有一个唯一的标识符,我将其存储在两个数据库中。其他数据存储在MongoDB中,实体之间的关系存储在Neo4J中。例如,两个数据库都包含用户ID,MongoDB包含配置文件信息,Neo4J包含友谊关系。对于我编写的自定义数据访问层,它的工作原理与我希望的完全相同。而且很快

但是。。。当我想要创建一个用户时,我需要在Neo4j中创建一个节点,在MongoDB中创建一个文档。不一定是问题,除了Neo4j是事务性的,MongoDB不是。如果两者都是事务性的,我会在其中一个事务失败时回滚这两个事务。但是因为MongoDB不是事务性的,所以我不能这样做

如何确保无论何时创建用户,节点和文档都会被创建,或者两者都不会被创建。我不想最终得到一堆没有匹配节点的文档

除此之外,我不仅希望我的组合数据库交互符合ACID,还希望它是线程安全的。GraphDatabaseService和MongoClient/DB都是由Singleton提供的

我发现了一些关于在MongoDB中创建“事务文档”的东西,但我真的不喜欢这种方法。我想要一些漂亮干净的东西,比如neo4j beginTx,tx.success,tx.failure,tx.finish设置。理想情况下,我可以在相同的try/catch/finally块中实现一些东西

我是否应该切换到CouchDB,它看起来确实是事务性的


编辑:在经过更多的研究后,我意识到CouchDB也不适合我的特定需求。为了澄清这一点,Neo4j部件是用石头制成的。文档存储数据库的长度与它有Java库的长度不同

虽然我是这两种技术的忠实粉丝,但我认为对你来说更好的选择是。它是一个图形(如Neo4)和文档(如MongoDB)数据库,支持ACID事务。听起来很适合你的需要。

彼得·简

如果您能够使用Neo4j 2.0,那么您可以实现一个模式索引提供程序(非常简单),它可以在MongoDB中以事务方式创建文档

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

如本文所述,您可以查看Structr


它的后端可以看作是Neo4j周围的文档数据库。它完全是事务性的、开源的。

您在CouchDb中看到了哪些事务?Mongodb没有事务(按设计)。看起来您不仅需要事务,还可能需要分布式事务。您需要在事务中使用DB,或者构建一个清理过时/断开连接的数据的进程。我的错。我不是很了解情况。我读了一些关于Coach DB的信息,但从这些零碎的信息中,我错误地推断出他们有ACID交易。是的,我正在寻找分布式事务。Neo4j部分是一成不变的,我担心有各种原因,其中包括一些超出我的“管辖范围”。但我对OrientDB也有一些疑问。似乎他们想把每件事都做好。不幸的是,我还没有找到一款尝试过并成功的产品。我在这里可能是错的,但不知何故,我怀疑OrientDB是否能够提供一种能够与Graph DB类和Document Store类的顶尖学生竞争的产品。但那当然可能只是我的玩世不恭。。。和你一样,我也是一个粉丝:德妮丝!几乎为提出另一项技术而感到沮丧。;-)A-W-E-S-O-M-E!这就是为什么我如此喜欢Neo4j。当你在文档中找不到它时,总会有一些聪明的家伙有一个解决方案。非常感谢!好的,我一直在做这件事,我只想检查一下我是否朝着正确的方向去做。我只是确保每当一个节点被“索引”时,实际上发生的是在集合中创建一个文档,而不是实际索引一个节点。我还强制实现了唯一性,这样一个节点就不能有两个文档。现在,要向这些文档添加信息,我只需使用Mongo查询来查找文档并对其进行编辑,对吗?@Pieter Jan您是否找到或编写了MongoDB的索引提供程序?我需要在我的应用程序中实现同样的功能。你是否分享你是如何做到这一点的?