根据> geting-started.clj'的第54行。与Datomic一起提供的文件(在samples / seattle下)我应该可以在查询中使用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读取的拉函数api似乎是:
(pull db pattern eid)
我想说自从编写西雅图代码以来,API已经发生了变化。我对么?如果没有,这里发生了什么。感谢
答案 0 :(得分:5)
正如评论者指出的那样,问题是传递datomic.api/pull
函数而不是使用拉表达式。一些澄清点:
您没有在查询中调用pull
函数,而是在pull
子句中使用名为find
expression的特殊表达式。请注意,查询接受数据结构文字(为什么必须使用quote
/ '
)。 pull
表达式是query grammar的一部分,是数据目录解析器识别的内容,而不是直接调用Datomic API中具有不同调用的pull函数。