6

我正在尝试通过 REST API 在 Datomic 中进行“外部连接”。从https://github.com/Datomic/day-of-datomic/blob/master/tutorial/social_news.clj我举了最后一个例子:

(defn maybe
  "Returns the set of attr for e, or nil if e does not possess
   any values for attr."
  [db e attr]
  (seq (map :a (d/datoms db :eavt e attr))))

;; find all users 
(q '[:find ?e ?upvote
     :where
     [?e :user/email]
     [(user/maybe $ ?e :user/upVotes) ?upvote]]
   (db conn))

我将maybe函数插入到我的数据库中,可以这样查询:

[:find ?n ?v :in $ :where [?e ?a ?v] [?a :db/ident :db/fn] [?e :db/ident ?n]]

返回

:maybe  #db/fn{:code "(seq (map :a (d/datoms db :eavt e attr)))", :params [db e attr], :requires [], :imports [], :lang :clojure}

但是,我无法弄清楚如何在查询中调用该函数。我有:data/user一些交易的属性,我想获得它存在的价值。这是我要运行的查询;我想:maybe成为上面定义的数据库函数。

[:find ?attr ?v ?when ?who :where
 [17592186045423 ?a ?v ?tx true]
 [?a :db/ident ?attr]
 [(:maybe $ ?tx :data/user) ?who]
 [?tx :db/txInstant ?when]]

我很确定我错过了一些非常明显的东西,但我已经坚持了一天。谢谢你的帮助!

4

2 回答 2

4

根据Datomic的查询文档,您可以在查询中使用任何纯函数。您不必先安装它们。您必须安装的功能是交易功能。

查询函数不需要安装,因为它们像所有其他函数一样在您的应用程序中运行。Datomic 与执行查询的数据库服务器完全不同。查询总是由对等库在您的应用程序中执行。

您需要安装的唯一类型的函数是事务函数,因为它们在Transactor内部运行。Transactor 是一个处理 Datomic 中所有写入的单个特殊进程。

于 2012-12-19T11:56:09.160 回答
4

您需要使用 d/invoke。所以你的例子看起来像这样:

[:find ?attr ?v ?when ?who :where
 [17592186045423 ?a ?v ?tx true]
 [?a :db/ident ?attr]
 [(d/invoke $ :maybe ?tx :data/user) ?who]
 [?tx :db/txInstant ?when]]
于 2013-01-21T17:38:45.310 回答