database - 是否可以将数据记录通配符 `_` 传递到参数化查询中?

标签 database datomic datalog

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

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

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

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

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

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

最佳答案

如果我没理解错的话,你应该可以输入:

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

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

更新

Datomic 的查询旨在接受像 5:awesome 这样的普通值,以代入 ?type 变量。像 _(或引用版本 '_)这样的符号不符合 Datomic 预期的模式。

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

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

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

关于database - 是否可以将数据记录通配符 `_` 传递到参数化查询中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44276068/

相关文章:

database - 在 dbcp2.BasicDataSource 中配置 SSL

SQL LIKE 语句适用于特定字符之前的所有内容

datomic - datomic 中的子查询支持

Datomic 将谓词应用于基数很多的属性

clojure - 数据查询和懒惰

prolog - Datalog、CLIPS、Prolog

z3 - z3数据日志中的否定表示最优性

mysql - 计算查询中两个nbr i 之间的差异?

php - PHP邮件数据库搜索

datomic - 如何在数据日志查询中对结果进行排序