Подтвердить что ты не робот

В Datomic, как мне получить представление временной шкалы об изменениях, сделанных для значений конкретного объекта?

Я следую учебнику, http://www.datomic.com/company/resources/tutorial, но я думаю, что мне не хватает простой части головоломки о том, как получить доступ к модели Datomic time.

Если я делаю серию добавлений и сокращений

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

Как можно получить серию изменений значения на (атрибут entity 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, с которыми я не знаком.

4b9b3361

Ответ 1

Посмотрите на функцию (history db) в ссылке.

Возвращает специальную базу данных, содержащую все утверждения и ретракции во времени. Эта специальная база данных может использоваться для датами и вызовами и запросами диапазона индексов, но не для сущности или с вызовами. как и из-за того, что также поддерживаются границы. Обратите внимание, что запросы получат все дополнения и ретракции, которые могут быть отличающийся пятым полем данных: добавлено (true для add/assert) [e a v 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.