2012-06-14 30 views
12

我正在關注教程,http://www.datomic.com/company/resources/tutorial,但我想我缺少一個關於如何訪問Datomic時間模型的難題。在Datomic中,我如何獲得對特定實體的值所做更改的時間表視圖?

如果我做了一系列的增加和縮回

;; 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"]]> 

怎麼可能得到了一系列的價值的變化(實體2000屬性:DB/DOC)?

我想要得到的東西在

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

格式例如:

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

它不能是困難的,但也有很多:DB內部參數,我我不熟悉。

回答

9

看看在(history db)功能in the reference.

返回一個包含所有斷言和跨越時間 撤消一個特殊的數據庫。此特殊數據庫可用於 數據和索引範圍調用和查詢,但不適用於帶呼叫的實體或 。 as-of,因爲界限也被支持。需要注意的是 查詢將得到所有的添加和撤消,可以是 區分第五datom場:添加(用於添加/斷言真) [EAV TX添加]

使用history你可以做一些事情這樣得到的數據你想:

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"] [...]]> 

也期待在(tempid :db.part/user)獲得的,而不是使用硬編碼的號碼,如2000標識。

+0

很酷...會有這個遊戲=) – zcaudate

相關問題