首页 文章

在查询中使用Datomic pull

提问于
浏览
4

根据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 回答

  • 5

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

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

相关问题