2012-06-14 4 views
12

Podążam za tutorialem, http://www.datomic.com/company/resources/tutorial, ale myślę, że brakuje mi prostego fragmentu zagadki, jak uzyskać dostęp do modelu czasu Datomica.W Datomic, w jaki sposób uzyskać widok osi czasu zmian dokonanych w wartościach danej jednostki?

Gdybym zrobić serię dodaje i chowa

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

Jak to jest możliwe, aby uzyskać szereg zmian wartości na jednostki 2000 (atrybut: db/doc)?

chcę dostać coś w formacie

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

Na przykład:

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

To nie może być takie trudne, ale istnieje wiele: db parametry wewnętrzne, że "Nie jestem zaznajomiony z.

Odpowiedz

9

Spójrz na funkcji (history db)in the reference.

Zwraca specjalną bazę danych zawierającą wszystkie twierdzenia i o wycofaniu w czasie. Ta specjalna baza danych może być używana dla wywołań i zapytań z zakresu danych i indeksów, ale nie dla encji ani z połączeniami. as-of i ponieważ granice są również obsługiwane. Zauważ, że zapytań otrzyma wszystkie dodatki i wycofywania, które mogą być wyróżnia dziedzinie datom piąty: dodano (true dla ADD/assert) [EAV TX dodane]

Korzystanie history można zrobić coś tak aby uzyskać dane chciałeś:

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

również spojrzeć (tempid :db.part/user) uzyskać identyfikatory zamiast używać zakodowanego numery jak 2000.

+0

fajnie ... będzie grać z tym =) – zcaudate