Clojure Datomic与Neo4j相比如何?

Clojure Datomic与Neo4j相比如何?,clojure,neo4j,datomic,Clojure,Neo4j,Datomic,我正在考虑将Neo4j集成到我正在构建的Clojure系统中。我被问到的第一个问题是为什么我没有使用Datomic。有人对此有好的答案吗?我听说并看过Datomic的视频,但我对Graph数据库的了解还不够,无法了解Neo4j和Datomic之间的区别,以及它会给我带来什么不同?它们之间有一些基本的区别: 数据模型 Neo4j和Datomic都可以为任意关系建模。它们都有效地使用了EAV(实体属性值)模式,因此它们都可以对许多相同的问题域进行建模,但Datomic的EAV模式还嵌入了时间维度(即

我正在考虑将Neo4j集成到我正在构建的Clojure系统中。我被问到的第一个问题是为什么我没有使用Datomic。有人对此有好的答案吗?我听说并看过Datomic的视频,但我对Graph数据库的了解还不够,无法了解Neo4j和Datomic之间的区别,以及它会给我带来什么不同?

它们之间有一些基本的区别:

数据模型 Neo4j和Datomic都可以为任意关系建模。它们都有效地使用了EAV(实体属性值)模式,因此它们都可以对许多相同的问题域进行建模,但Datomic的EAV模式还嵌入了时间维度(即EAVT),如果您想在任意时间点对数据库执行有效的查询,这将非常强大。这是非不变数据存储(包括Neo4j)无法做到的

数据存取 Neo4j和Datomic都提供遍历API和查询语言:

询问 Neo4j和Datomic都提供声明性查询语言(分别为Cypher和Datalog),它们支持递归查询,但Datomic的Datalog通过允许将自定义筛选和聚合函数实现为任意JVM代码,提供了远远优越的查询功能。实际上,这意味着内置函数可以被Clojure的有效替代。这是可能的,因为运行查询的是应用程序,而不是数据库

横穿 遍历API始终由应用程序代码驱动,这意味着Neo4j和Datomic都能够使用任意遍历、过滤和数据转换代码遍历图形,但Neo4j需要运行事务,这实际上意味着它有时间限制

数据一致性 另一个基本区别是数据组查询不需要数据库协调(即无读取事务)而且它们总是使用一致的数据快照
,这意味着您可以在任意时间段内执行多个查询和数据转换
,并保证结果始终一致,并且没有事务超时(因为没有事务超时)。同样,在像绝大多数现有数据库(包括Neo4j)这样的非不变数据存储中,这是不可能做到的。这也适用于它们的遍历API

Neo4j和Datomic都是事务(ACID)系统,但由于Neo4j使用传统的交互式事务(使用乐观并发控制),因此查询需要在事务内部进行(需要协调),这会对查询施加超时限制。在实践中,这意味着对于非常复杂的长时间运行的查询,您将最终拆分查询,以便它们在特定的时间限制内完成,从而放弃数据一致性

工作组
如果出于某种原因,您的查询需要涉及大量数据(超过内存中通常容纳的数据量),而您无法对结果进行流式处理(因为Datomic提供流式API),Datomic可能不是一个好的选择,因为您不会利用Datomic的体系结构,强迫对等方不断地移出其工作内存,执行额外的网络调用和解压缩数据段。

非常周密的描述,谢谢。你用过这两种产品吗?@Zubair我用过Datomic。我对Neo4j很熟悉。作为旁注,请看,这是一组图形接口,通常由图形数据库实现,以展示它们的一些功能。Neo4j和Datomic实现都有(虽然Datomic实现使用Java,而不是Clojure,所以有些东西不是惯用的)。只需对您的描述做一点评论:“自定义过滤和聚合函数”也可以通过Neo4j实现。Cypher并不是查询数据的唯一方法(特别是在JVM世界中),遍历框架允许您编写任何代码来检索数据,并且您可以始终使用较低级别的API来实现更细粒度的检索。关于数据一致性,您是绝对正确的。这一基本区别在这篇内容丰富的Hickey演讲中得到了很好的说明:。这是一个经过深思熟虑的答案,但为了完整性,我希望看到在Neo4j方面有丰富经验的人加入进来。公认的答案似乎偏向于达托米语。