Logseq高级查询中:in变量无法适配语法糖写法的问题求助
问题:Logseq高级查询中语法糖无法配合:in变量使用?
我尝试在Logseq高级查询中使用变量?dev替代常量"dev",以下两种写法均可正常运行:
[?b :block/ref-pages [:block/name "dev"]]
[?b :block/ref-pages ?p] [?p :block/name ?dev]
但使用以下语法糖写法时无法运行,报错信息为:"Nothing found for entity id [:block/name ?dev]"
[?b :block/ref-pages [:block/name ?dev]] ; ERROR: "Nothing found for entity id [:block/name ?dev]"
涉及的完整查询代码如下:
#+BEGIN_QUERY {:title "Find tag: MyTag" :query [:find (pull ?b [*]) :in $ ?dev :where ;; either one of the following 2 lines works: [?b :block/ref-pages [:block/name "dev"]] ;; [?b :block/ref-pages ?p] [?p :block/name ?dev] ;; THE FOLLOWING LINE IS NOT WORKING ;; [?b :block/ref-pages [:block/name ?dev]] ; ERROR: "Nothing found for entity id [:block/name ?dev]" ] :inputs ["dev"] } #+END_QUERY
原因解析
Logseq高级查询基于Datalog语法,你用到的[:block/name "dev"]是实体引用语法糖,它的作用是在查询初始化阶段直接将常量值转换成对应的实体ID,以此简化查询写法。
但这个语法糖的解析逻辑不支持动态变量:当你把常量"dev"换成变量?dev时,查询会直接把[:block/name ?dev]当作一个字面意义的实体ID去查找,而不会将?dev绑定到:inputs传入的参数值,自然找不到对应的实体,因此抛出错误。
而第二种可行的写法[?b :block/ref-pages ?p] [?p :block/name ?dev]是标准的Datalog链式查询:先通过?p关联到ref-pages对应的实体,再匹配该实体的name属性等于变量?dev的参数值,完全符合Datalog的变量绑定逻辑,所以能正常运行。
简单来说,这种嵌套式的实体引用语法糖仅支持常量值,无法配合动态变量使用,必须改用标准的链式查询写法来实现变量匹配。
内容的提问来源于stack exchange,提问作者user31634237
相关产品推荐
相关产品推荐

