1

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

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

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

我知道我可以通过如下查询获得所有内容:

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

但我的目标是避免在我不想按:type. 例如,用例是可能过滤或不过滤结果的 API 端点。

4

1 回答 1

1

如果我理解正确,您应该可以输入:

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

在 Datomic 中,任何未指定的值都被视为通配符。上面的查询将返回具有该:type属性的所有实体的列表,无论值如何。

更新

Datomic 的查询被设计为接受一个普通的值,比如5或被:awesome替换到?type变量中。像_(或引用的版本'_)这样的符号不符合 Datomic 预期的模式。

只是为了好玩,我尝试了几种变体,但无法让 Datomic 以?type您建议的方式接受变量的符号 '_。我认为您必须为通配符案例编写单独的查询。

本质上,通配符_是 Datomic 查询语法中的一个特殊符号(也称为“保留字”),就像$. ?Datomic 还强制查询变量以like?e或开头?type。这些要求是您无法更改的 Datomic DSL 的一部分。

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

于 2017-05-31T05:26:55.840 回答