我正在考虑将Neo4j集成到我正在构建的Clojure系统中。我被问及的第一个问题是为什么不使用Datomic。有人能给出一个好的答案吗?我听说过并看过关于Datomic的视频,但我不了解图形数据库的知识,也不知道Neo4j和Datomic之间的区别以及这对我有什么影响。
它们之间存在一些基本的差异:
Neo4j和Datomic都可以建模任意关系。它们都使用了EAV(实体-属性-值)模式,因此它们可以建模许多相同的问题领域,除了 Datomic的EAV模式还嵌入了一个时间维度(即EAVT),如果您想要在任意时间点对数据库执行高效查询,则使其非常强大。这是非不可变数据存储(包括Neo4j在内)所无法实现的。
Neo4j和Datomic都提供遍历API和查询语言:
Neo4j和Datomic都提供声明性查询语言(Cypher和Datalog),支持递归查询,除了 Datomic的Datalog通过允许将自定义过滤和聚合函数实现为任意JVM代码,提供了更出色的查询功能。在实践中,这意味着Cypher的内置函数可以有效地被Clojure的sequence库取代。这是可能的,因为你的应用程序而不是数据库运行查询。
遍历API始终由应用程序代码驱动,这意味着Neo4j和Datomic都能够使用任意遍历、过滤和数据转换代码遍历图形,除了 Neo4j需要运行事务,这在实践中意味着它具有时间限制。