为什么Datascript/Datomic查询中逻辑and谓词无法正常生效?
问题原因
你在单个方括号包裹的谓词子句里嵌套and的写法不符合Datascript的查询语法规范:Datascript解析[(...)]格式的子句时,只会将其识别为单一的谓词函数调用,不会处理内部嵌套的逻辑操作符,所以这个and子句实际没有执行任何过滤,相当于写了无效语句,查询自然返回了全量数据。
逻辑操作的正确用法
不存在不兼容and的情况,Datalog的where子句本身默认就是逻辑与语义,你把多个过滤条件拆成独立子句并列书写,本身就是标准的and逻辑实现方式,也是官方最推荐的写法。
如果需要显式使用and操作符,一般是配合or、not等逻辑操作实现复合逻辑分支,语法是把and作为子句开头,直接包裹一组子条件,不需要额外加方括号,示例如下:
'[:find ?firstname ?name :where [?p :name ?name] [?p :firstname ?firstname] [?p :age ?age] (and (= ?name "Smith") (> ?age 18))]
上述写法和你拆分两个独立子句的执行效果完全一致。
不同查询引擎的支持情况
Datomic、Datascript都兼容上述逻辑操作语法,通用Datalog标准也原生支持显式and、or、not等逻辑操作,只要符合对应查询引擎的语法规范即可正常使用。
内容的提问来源于stack exchange,提问作者sof
相关产品推荐
相关产品推荐

