Datomic与Neo4j相比如何?

时间:2013-07-27 06:54:00

标签: clojure neo4j datomic

我正在考虑将Neo4j集成到我正在构建的Clojure系统中。我被问到的第一个问题是为什么我没有使用Datomic。有没有人对此有一个好的答案?我听说过有关Datomic的视频,但我对图形数据库了解不足以了解Neo4j和Datomic之间的区别,以及它对我有什么不同?

1 个答案:

答案 0 :(得分:51)

它们之间存在一些根本区别:

数据模型

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

数据访问

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

查询

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

穿越

遍历API 始终由应用程序代码驱动,这意味着Neo4j和Datomic都可以使用任意遍历,过滤和数据转换代码来执行图表除了 Neo4j需要一个正在运行的交易,实际上意味着它是有时间限制的。

数据一致性

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

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

工作集

如果出于某种原因,您的查询需要涉及大量数据(超过通常适合内存的数据)并且您无法传输结果(因为Datomic提供了流API),Datomic可能不会很好因为你不会利用Datomic的架构,迫使同行不断地驱逐他们的工作记忆,执行额外的网络调用和解压缩数据段。