Datomic查询:查找具有一定价值的所有entties

时间:2014-07-03 10:49:01

标签: clojure datomic datalog

使用此查询:

{: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,_应该作为通配符,匹配任何东西,所以第二个查询应该至少返回与第一个相同数量的结果,甚至可能更多。

...谢谢

1 个答案:

答案 0 :(得分:2)

对于此示例,查询的逻辑结构本质上是正确的,但属性ident关键字未解析为其实体ID。请注意,这是一种特殊情况,当您使用属性作为输入进行查询时 - 无法保证查询引擎执行此转换的方案。有关“属性作为查询输入”的详细信息,请参阅查询(http://docs.datomic.com/query.html)上的Datomic文档。

重构此查询的方法如下:

    (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。