2012-09-18 37 views
6

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 đỡ!

Trả lời

4

Bạn cần sử dụng d/gọi. Vì vậy, ví dụ của bạn sẽ trông giống như sau:

[: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]] 
+0

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

4

Theo số Query Doc của Datomic, bạn có thể sử dụng bất kỳ hàm thuần túy nào trong truy vấn. Bạn không cần phải cài đặt chúng trước. Các hàm bạn phải cài đặt là các chức năng giao dịch.

Chức năng truy vấn không cần phải được cài đặt vì chúng chạy trong ứng dụng của bạn giống như tất cả các chức năng khác. Trong Datomic không có những thứ như máy chủ cơ sở dữ liệu thực thi truy vấn. Truy vấn luôn được thực thi trong ứng dụng của bạn theo số Peer Library.

Loại chức năng duy nhất bạn cần cài đặt là các chức năng giao dịch vì chúng chạy bên trong Transactor. Transactor là một quá trình đặc biệt duy nhất xử lý tất cả các ghi trong Datomic.

+0

Điều này cực kỳ thú vị. Đây là liên kết mới http://docs.datomic.com/database-functions.html Các hàm hạng nhất đáng buồn là Java/Clojure độc ​​quyền. – est

Các vấn đề liên quan