在查询中使用Datomic pull

时间:2016-04-05 11:28:29

标签: clojure datomic

根据> 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已经发生了变化。我对么?如果没有,这里发生了什么。感谢

1 个答案:

答案 0 :(得分:5)

正如评论者指出的那样,问题是传递datomic.api/pull函数而不是使用拉表达式。一些澄清点:

您没有在查询中调用pull函数,而是在pull子句中使用名为find expression的特殊表达式。请注意,查询接受数据结构文字(为什么必须使用quote / ')。 pull表达式是query grammar的一部分,是数据目录解析器识别的内容,而不是直接调用Datomic API中具有不同调用的pull函数。