2012-06-14 15 views
12

Tôi đang theo hướng dẫn, http://www.datomic.com/company/resources/tutorial nhưng tôi nghĩ rằng tôi đang thiếu một phần đơn giản của câu đố về cách truy cập mô hình thời gian của Datomic.Trong Datomic, làm cách nào để có được chế độ xem dòng thời gian của các thay đổi được thực hiện cho các giá trị của một thực thể cụ thể?

Nếu tôi làm một loạt các bổ sung và rút

;; DO a series of transactions 
;; (transact conn [:db/add entity-id attribute value0]) 

(use 'datomic.api) 
(dir datomic.api) 
(def conn (connect "datomic:dev://localhost:4334/demo")) 

(transact conn '[:db/add 2000 :db/doc "Hello There"]) 
(q '[:find ?e ?n :where [?e :db/doc ?n] [(= 2000 ?e)]] (db conn)) 
; => <HashSet [[2000 "Hello There"]]> 

(transact conn '[:db/add 2000 :db/doc "Hello There 1"]) 
(q '[:find ?e ?n :where [?e :db/doc ?n] [(= 2000 ?e)]] (db conn)) 
; => <HashSet [[2000 "Hello There 1"]]> 

(transact conn '[:db/add 2000 :db/doc "Hello There 2"]) 
(q '[:find ?e ?n :where [?e :db/doc ?n] [(= 2000 ?e)]] (db conn)) 
; => <HashSet [[2000 "Hello There 2"]]> 

(transact conn '[:db/add 2000 :db/doc "Hello There 3"]) 
(q '[:find ?e ?n :where [?e :db/doc ?n] [(= 2000 ?e)]] (db conn)) 
; => <HashSet [[2000 "Hello There 3"]]> 

Làm thế nào là nó có thể để có được một loạt các thay đổi giá trị trên (đơn vị 2000 thuộc tính: db/doc)?

Tôi muốn để có được một cái gì đó trong các định dạng của

[ [Transaction Number, Time, Value] .... [Transaction Number, Time, Value]] 

Ví dụ:

[ [T1, "2012-March-16-9:30:12", "Hello There"] 
    .... 
    .... 
    .... 
    [T27, "2012-June-14-9:54:38", "Hello There 3"] ] 

Nó không thể là khó khăn, nhưng có rất nhiều: db thông số nội bộ mà tôi 'không quen thuộc với.

Trả lời

9

Hãy nhìn vào các (history db) chức năng in the reference.

Trả về một cơ sở dữ liệu đặc biệt có chứa tất cả khẳng định và rút lại theo thời gian. Có thể sử dụng cơ sở dữ liệu đặc biệt này cho các cuộc gọi và truy vấn phạm vi chỉ số và chỉ mục, nhưng không được sử dụng cho mục đích hoặc với các cuộc gọi. as-of và kể từ khi giới hạn cũng được hỗ trợ. Lưu ý rằng truy vấn sẽ nhận được tất cả những bổ sung và rút lại, có thể là phân biệt bởi các lĩnh vực datom thứ năm: gia tăng (đúng đối với add/assert) [Eav tx thêm]

Sử dụng history bạn có thể làm điều gì đó như thế này để có được những dữ liệu mà bạn muốn:

datomic-test.core> (q '[:find ?tx ?tx-time ?v 
         :in $ ?e ?a 
         :where [?e ?a ?v ?tx _] 
           [?tx :db/txInstant ?tx-time]] 
         (d/history (db conn)) 
         2000 
         :db/doc) 
#<HashSet [[13194139534315 #inst "2012-09-09T00:45:49.086-00:00" "Hello There"] [...]]> 

Ngoài ra nhìn vào (tempid :db.part/user) để có được ID thay vì sử dụng số cứng mã hoá như 2000.

+0

cool ... sẽ có lượt phát với this =) – zcaudate