4

使用此查询:

{:find  [?e]
         :where [[?e :db/valueType :db.type/string]]}

我可以找到所有具有名为的属性:db/valueType和值为:db.type/string. 在我的情况下,数据库中有一些数据,它返回十个 ID。

:db.type/string无论属性名称如何,我将如何搜索值为 的所有实体?例如这个查询:

{:find  [?e]
         :where [[?e _ :db.type/string]]}

返回一个空集。据我所知,Datomic 的 Datalog_应该用作通配符,匹配任何内容,因此第二个查询至少应该返回与第一个相同数量的结果,甚至可能更多。

谢谢...

4

1 回答 1

2

对于这个例子,查询的逻辑结构本质上是正确的,但是属性 ident 关键字没有被解析为其实体 id。请注意,这是当您使用属性作为输入进行查询时发生的一种特殊情况——在这种情况下,查询引擎不能保证执行此转换。有关“作为查询输入的属性”,请参阅有关查询的 Datomic 文档 ( http://docs.datomic.com/query.html )。

重组此查询的一种方法是:

    (let [db (d/db conn)] 
            (d/q '[:find ?e 
                   :in $ ?id 
                   :where [?e _ ?id]] 
             db (d/entid db :db.type/string)))

在这种情况下,我们在参数化查询的输入中手动将关键字 :db.type/string 解析为其实体 ID。

于 2014-07-04T01:46:52.583 回答