0

在数据脚本1.3.0上测试

数据:

[{:db/id -1 :name "Smith" :firstname "Oliver" :age 20}
 {:db/id -2 :name "Jones" :firstname "Oliver" :age 20}
 {:db/id -3 :name "Smith" :firstname "Amelia" :age 16}
 {:db/id -4 :name "Jones" :firstname "Amelia" :age 16}]

尝试使用and以下逻辑谓词查询姓名为 Smith 且年龄超过 18 岁的人,为什么它返回未过滤的整个集合?

'[:find ?firstname ?name
  :where
  [?p :name ?name]
  [?p :firstname ?firstname]
  [?p :age ?age]
  [(and (= ?name "Smith") (> ?age 18))]]

;;; wrong result: #{[Oliver Smith] [Oliver Jones] [Amelia Smith] [Amelia Jones]}

然后更改为使用离散谓词进行查询并按预期获得满意的结果。

'[:find ?firstname ?name
  :where
  [?p :name ?name]
  [?p :firstname ?firstname]
  [?p :age ?age]
  [(= ?name "Smith")]
  [(> ?age 18)]]

;;; correct result: #{[Oliver Smith]}

是否datomic或通常只支持分散datascriptdatalog离散子句的数据模式?传统的逻辑运算and等在这里不兼容吗?

4

2 回答 2

2

这是因为 AND 是隐含的。所有子句都由 AND 隐式连接,因为它们都必须同时为真才能使查询匹配

于 2021-12-01T17:55:25.590 回答
1

根据手册,您不能and-clause像那样使用。您可以使用 an 的唯一方法and-clause是当它位于 an 内时or-clause

or子句中,您可以使用and子句来指定连词。此子句在 or 子句之外不可用,因为连词是其他子句中的默认设置。

于 2021-12-01T06:12:29.027 回答