clojure - n 元谓词 Datomic (n != 2) 可能吗?

标签 clojure datomic datalog

我尝试将我读到的有关 Datalog 的内容与 Datomic 的描述相匹配。我在 Datomic 中看到的所有谓词都是三元组,即更 Prologian 语法中的 [实体属性值] 或属性(e,v)。另一方面,Datalog 支持 n 元谓词,例如 pred(a,b,c,d)。

我该如何匹配这个?

  1. 我是否错过了 Datomic 的一个功能,即它是否有 n 元谓词,或者我可以以某种方式对它们进行建模吗?
  2. Datomics Datalog 是通常称为 Datalog 的受限版本吗?

最佳答案

传统Datalog中的n元谓词实际上类似于关系数据库中的表。例如,以下行将在传统数据记录系统中添加有关人员的信息:

assert Person("John", "Smith", "1985-01-01")

请注意,唯一告诉您第三个值是出生日期的是它在谓词中的位置。

Datomic 不使用这样的自由格式谓词来存储数据。它严格在查询端使用 Datalog。要在 Datomic 中表示类似我们上面的人的东西,您需要创建三个属性。您可以调用以下属性::person/first-name:person/last-name:person/dob(请注意, >:person/ 只是名称的一部分,它实际上并没有创建任何类型的结构或类似表格的东西)。

每个属性都需要使用 transact 函数安装才能使用。以下是您需要发送的内容以进行 :person/last-name

交易的示例
[{:db/id #db/id[:db.part/db]
  :db/ident :person/last-name
  :db/valueType :db.type/string
  :db/cardinality :db.cardinality/one
  :db/fulltext true
  :db/doc "A person's last name"
  :db.install/_attribute :db.part/db}]

您可以在 Datomic 的文档中找到更多详细信息:http://docs.datomic.com/schema.html

一旦您拥有属性,您就可以通过处理以下内容来添加我们开始时使用的相同信息:

[{:db/id #db/id[:db.part/user]
:person/first-name "John"
:person/last-name "Smith"
:person/dob "1985-01-01"}]

所以简短的答案是:没有 Datomic 不会在输入端执行 n 元谓词,但是您可以在 n 元谓词中表示的任何东西都不能在 Datomic 中表示。优点是,现在您拥有一个命名属性,而不是仅根据其在谓词中的位置来定义的属性(事实证明,这在现实世界的系统中非常脆弱:考虑如何更改类似的模式) .

关于clojure - n 元谓词 Datomic (n != 2) 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14357413/

相关文章:

database - 令人困惑的DES Datalog语法错误

filter - Clojure线程优先,带有过滤功能

clojure - 为什么 ' ns/use 与 Clojure 的用法很奇怪?

datomic - DataLog 等同于 SQL 吗?

clojure - 为什么 Datomic 属性以驼峰命名

search - Datomic - 选择某些属性最高的实体

c# - 使用计时器逐行读取文本文件

clojure - 可以通过 Datomic pull 语法获取枚举值吗?

clojure - 在 Eclipse 中加载 Clojure Leiningen 项目

clojure - 在 Clojure 中使用字符串插值宏 (<<)