【问题标题】:Why logical "and" predicates do not work?为什么逻辑“和”谓词不起作用?
【发布时间】: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]}

datomicdatascriptdatalog 通常只支持分散到离散子句的数据模式吗?常规的逻辑运算and等在这里不兼容吗?

【问题讨论】:

    标签: clojure datomic datalog datascript


    【解决方案1】:

    根据the manual,您不能像那样使用and-clause。使用and-clause 的唯一方法是当它位于or-clause 内时:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多