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