是否可以将通配符_
传递给参数化查询?像这样:
(d/q [:find ?e
:in $ ?type
:where [?e :type ?type]] db _)
当我按照上面的说法尝试这个时,它引发了一个错误。有没有办法做到这一点?
我知道我可以使用如下所示的查询获取所有内容:
(d / q [:find?e :[?e:type]] db)
但我的目标是避免在我不希望按:type
过滤结果时构建单独的查询。用例是,例如,API端点,可能会也可能不会过滤结果。
答案 0 :(得分:1)
如果我理解正确,您应该可以输入:
(d/q [:find ?e
:in $
:where [?e :type]] db )
在Datomic中,任何未指定的值都被视为通配符。上述查询将返回具有:type
属性的所有实体的列表,无论其值如何。
Datomic的查询旨在接受5
或:awesome
等普通值替换为?type
变量。像_
(或引用版本'_
)这样的符号不符合Datomic所期望的模式。
只是为了好玩,我尝试了几种变体,无法让Datomic以你提议的方式接受?type
变量的符号'_。我认为你必须为通配符案例编写一个单独的查询。
基本上,通配符_
是Datomic查询语法中的特殊符号(也称为“保留字”),就像$
一样。 Datomic还强制查询变量以?
或?e
之类的?type
开头。这些要求是您无法改变的Datomic DSL的一部分。
除了手写单独查询之外,唯一的解决方法是从基础部分和附加部分动态组合查询向量。无论是比手工编写更容易还是更难,不同的查询取决于您的具体情况。