【发布时间】:2022-01-07 16:27:15
【问题描述】:
在datascript 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 和 datascript 或 datalog 通常只支持分散到离散子句的数据模式吗?常规的逻辑运算and等在这里不兼容吗?
【问题讨论】:
标签: clojure datomic datalog datascript