我正在尝试通过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]]
我很确定我错过了一些非常明显的东西,但我现在已经坚持了一天。谢谢你的帮助!
答案 0 :(得分:4)
根据Datomic的Query Doc,您可以在查询中使用任何纯函数。您不必先安装它们。您必须安装的功能是交易功能。
不需要安装查询函数,因为它们像所有其他函数一样在应用程序中运行。 Datomic与执行查询的数据库服务器完全不同。查询始终由Peer Library在您的应用程序中执行。
您需要安装的唯一类型的函数是事务函数,因为它们在Transactor内运行。 Transactor是一个处理Datomic中所有写操作的单一特殊过程。
答案 1 :(得分: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]]