3

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

我该如何匹配这个?

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

1 回答 1

1

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

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 元谓词,但是在 Datomic 中无法表示的 n 元谓词中没有任何东西可以表示。好处是现在你有了一个命名属性,而不是仅仅根据它在谓词中的位置来定义的东西(这在现实世界的系统中非常脆弱:考虑如何为类似的东西更改模式) .

于 2013-02-01T13:32:12.867 回答