Tôi đang cố gắng thực hiện 'ghép nối bên ngoài' trong Datomic qua REST API. Từ https://github.com/Datomic/day-of-datomic/blob/master/tutorial/social_news.clj tôi đã đưa ra những ví dụ cuối cùng:Sử dụng chức năng cơ sở dữ liệu trong truy vấn dữ liệu
(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))
tôi chèn có thể hoạt động vào cơ sở dữ liệu của tôi, và nó có thể được truy vấn như sau:
[:find ?n ?v :in $ :where [?e ?a ?v] [?a :db/ident :db/fn] [?e :db/ident ?n]]
lợi nhuận
:maybe #db/fn{:code "(seq (map :a (d/datoms db :eavt e attr)))", :params [db e attr], :requires [], :imports [], :lang :clojure}
Tuy nhiên, tôi không thể tìm ra cách gọi hàm trong truy vấn. Tôi có thuộc tính :data/user
trên một số giao dịch, mà tôi muốn nhận được giá trị cho nơi nó tồn tại. Đây là truy vấn tôi đang cố chạy; Tôi muốn :maybe
là chức năng cơ sở dữ liệu được xác định ở trên.
[:find ?attr ?v ?when ?who :where
[17592186045423 ?a ?v ?tx true]
[?a :db/ident ?attr]
[(:maybe $ ?tx :data/user) ?who]
[?tx :db/txInstant ?when]]
Tôi khá chắc chắn rằng tôi thiếu một điều gì đó khá rõ ràng, nhưng tôi đã bị mắc kẹt trong này một ngày nay. Cảm ơn vì bất kì sự giúp đỡ!
Tất nhiên, bạn có thể định nghĩa một hàm phi cơ sở dữ liệu gọi d/gọi cho bạn, và đơn giản gọi nó từ bên trong truy vấn. Nó có thể làm cho truy vấn dễ đọc hơn nếu bạn chọn một tên tốt. – Brian