是否可以将数据通配符`_`传递给参数化查询?

时间:2017-05-31 05:03:48

标签: database datomic datalog

是否可以将通配符_传递给参数化查询?像这样:

(d/q [:find ?e
      :in $ ?type
      :where [?e :type ?type]] db _)

当我按照上面的说法尝试这个时,它引发了一个错误。有没有办法做到这一点?

我知道我可以使用如下所示的查询获取所有内容:

(d / q [:find?e       :[?e:type]] db)

但我的目标是避免在我不希望按:type过滤结果时构建单独的查询。用例是,例如,API端点,可能会也可能不会过滤结果。

1 个答案:

答案 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的一部分。

除了手写单独查询之外,唯一的解决方法是从基础部分和附加部分动态组合查询向量。无论是比手工编写更容易还是更难,不同的查询取决于您的具体情况。