12

我正在学习教程http://www.datomic.com/company/resources/tutorial但我认为我错过了如何访问 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 内部参数我不熟悉。

4

1 回答 1

9

看一下参考资料中的(history db)函数

返回一个特殊的数据库,其中包含跨时间的所有断言和撤回。这个特殊的数据库可用于 datoms 和 index-range 调用和查询,但不能用于实体或 with 调用。也支持 as-of 和 since 边界。请注意,查询将获得所有的添加和撤回,可以通过第五个 datom 字段来区分:add (true for add/assert) [eav tx added]

使用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)获取 ID,而不是使用硬编码的数字,例如2000.

于 2012-09-09T01:43:13.033 回答