30

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

4

1 回答 1

56

它们之间有一些根本区别:

数据模型

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

数据访问

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

查询

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

遍历

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

数据一致性

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

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

工作集

如果由于某种原因您的查询需要涉及大量数据(超出内存中通常容纳的数据量)并且您无法流式传输结果(因为 Datomic 提供流式 API),那么 Datomic 可能不适合,因为您不会利用 Datomic 的架构,迫使对等方不断驱逐他们的工作内存,执行额外的网络调用和解压缩数据段。

于 2013-07-27T14:38:42.267 回答