根据Datomic(在样本/西雅图下)附带的'geting-started.clj'文件的第54行,我应该能够在查询中使用pull函数,如下所示:
(def pull-results (q '[:find (pull ?c [*]) :where [?c :community/name]] (db conn)))
但是,在下面的代码中我收到一个错误:IllegalArgumentException Argument [*] in:find不是变量datomic.query / validate-query(query.clj:315)
(defn get-tag [] (d/q '[:find (d/pull ?e [*])
:where [?e :tag.tag/term]] (db conn)))
现在,在我眼里,这两个人的构造相似 . 再加上从http://docs.datomic.com/clojure/#datomic.api/pull读取的pull函数api似乎是:
(pull db pattern eid)
我会说自从编写西雅图代码以来,API已经发生了变化 . 我对么?如果没有,这里发生了什么 . 谢谢
1 回答
正如评论者指出的那样,问题是传递
datomic.api/pull
函数而不是使用拉表达式 . 一些澄清点:您没有在查询中调用
pull
函数,而是在find
子句中使用名为pull
expression的特殊表达式 . 请注意,查询接受数据结构文字(为什么必须使用quote
/'
) .pull
表达式是query grammar的一部分,是数据目录解析器识别的内容,而不是直接调用Datomic API中具有不同调用的pull函数 .