Datomic和Neo4j有何区别?

33

我正在考虑将Neo4j集成到我正在构建的Clojure系统中。我被问及的第一个问题是为什么不使用Datomic。有人能给出一个好的答案吗?我听说过并看过关于Datomic的视频,但我不了解图形数据库的知识,也不知道Neo4j和Datomic之间的区别以及这对我有什么影响。

1个回答

59

它们之间存在一些基本的差异:

数据模型

Neo4j和Datomic都可以建模任意关系。它们都使用了EAV(实体-属性-值)模式,因此它们可以建模许多相同的问题领域,除了 Datomic的EAV模式还嵌入了一个时间维度(即EAVT),如果您想要在任意时间点对数据库执行高效查询,则使其非常强大。这是非不可变数据存储(包括Neo4j在内)所无法实现的。

数据访问

Neo4j和Datomic都提供遍历API和查询语言:

查询

Neo4j和Datomic都提供声明性查询语言(Cypher和Datalog),支持递归查询,除了 Datomic的Datalog通过允许将自定义过滤和聚合函数实现为任意JVM代码,提供了更出色的查询功能。在实践中,这意味着Cypher的内置函数可以有效地被Clojure的sequence库取代。这是可能的,因为你的应用程序而不是数据库运行查询。

遍历

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

数据一致性

另一个基本的不同之处在于,Datomic 查询不需要数据库协调(即没有读事务),并且它们始终使用一致性数据快照进行操作,这意味着您可以执行多个查询和数据转换在任意时间段内,并保证结果始终一致,并且没有事务会超时(因为没有事务)。再次强调,在非不可变数据存储(包括 Neo4j 在内)中无法做到这一点。这也适用于它们的遍历 API。
Neo4j 和 Datomic 都是事务性(ACID)系统,但是由于 Neo4j 使用传统的交互式事务 - 使用乐观并发控制 - 查询需要在事务内部发生(需要协调),这会对查询施加超时限制。实际上,这意味着对于非常复杂、长时间运行的查询,您将最终将查询分解成几个部分,以便它们在一定时间内完成,并放弃数据的一致性。

工作集

如果由于某种原因您的查询需要涉及大量数据(超过通常能够容纳在内存中的数据),并且您不能流式传输结果(因为 Datomic 提供了流式 API),那么 Datomic 可能不是一个好选择,因为您将无法利用 Datomic 的架构,迫使同伴们不断地驱逐其工作内存,执行额外的网络调用和解压数据段。

非常好的描述,谢谢。您两个产品都用过吗? - yazzapps.com
2
@Zubair 我使用过Datomic。我熟悉Neo4j。另外,看一下https://github.com/datablend/blueprints,这是一组图形接口,通常由图形数据库实现,以展示它们的某些功能。Neo4j和Datomic的实现都在那里(尽管Datomic的实现使用Java而不是Clojure,因此有些东西不符合惯用法)。 - a2ndrade
1
仅对您的描述进行评论:“自定义过滤和聚合函数”也可以通过Neo4J实现。Cypher不是查询数据的唯一方式(特别是在JVM世界中),遍历框架允许您编写任何代码来检索数据,并且您始终可以回退到更低级别的API以实现更精细的检索。 - fbiville
1
关于数据一致性,您说得非常正确。这种基本差异在Rich Hickey的演讲中得到了很好的阐述:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey。 - fbiville
2
这是一个非常深思熟虑的答案,但为了完整起见,我想看到有丰富的Neo4j经验的人发表意见。被接受的答案似乎偏向于Datomic。 - Ben
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接