Datomic教程“重访过去”部分的问题

时间:2012-06-14 02:53:22

标签: clojure datomic

我在“重访过去”部分http://datomic.com/company/resources/tutorial.html

中遇到了数据组教程的问题

对于以下两个查询:

query = "[:find ?c :where [?c :community/name]]";
db_asOf_schema = conn.db().asOf(schema_tx_date);
System.out.println(Peer.q(query, db_asOf_schema).size()); // 0

db_since_data = conn.db().since(data_tx_date);
System.out.println(Peer.q(query, db_since_data).size()); // 0

我在clojure中尝试过这些命令,但无法按照教程中的描述使它们正常工作:

(since (db conn) (java.util.Date.) ) 
;; It should return 0 but returns the whole database instead

(def ts (q '[:find ?when :where [?tx :db/txInstant ?when]] (db conn)))

(count (since (db conn) (ffirst (reverse (sort ts))))))
;; returns 13, but should return 0

(count (as-of (db conn) (ffirst (sort ts)))))
;; returns 13, but should return 0

我不太确定这是正确的行为,有什么我做错了吗?

1 个答案:

答案 0 :(得分:10)

如果您正在使用Clojure中的西雅图教程,可能最重要的一点是要知道工作Clojure代码包含在Datomic发行版中。文件名为samples/seattle/getting-started.clj,您只需按照REPL进行操作即可。

关于你问题中Clojure代码的两个观察结果:

记录since函数返回数据库值,而不是数字,因此您看到的行为符合预期。要查看数据库中的内容,您需要发出查询。

数据库没有Clojure count函数的任何文档语义,因此您不应该对它们调用count。同样,如果您想查看数据库中的内容,则需要发出查询,例如

;; Find all transaction times, sort them in reverse order
(def tx-instants (reverse (sort (q '[:find ?when :where [_ :db/txInstant ?when]]
                                       (db conn)))))

;; pull out two most recent transactions, most recent loaded
;; seed data, second most recent loaded schema
(def data-tx-date (ffirst tx-instants))
(def schema-tx-date (first (second tx-instants)))

;; make query to find all communities
(def communities-query '[:find ?c :where [?c :community/name]])

;; find all communities as of schema transaction
(let [db-asof-schema (-> conn db (d/as-of schema-tx-date))]
  (println (count (seq (q communities-query db-asof-schema)))))

;; find all communities as of seed data transaction
(let [db-asof-data (-> conn db (d/as-of data-tx-date))]
  (println (count (seq (q communities-query db-asof-data)))))

;; find all communities since seed data transaction
(let [db-since-data (-> conn db (d/since data-tx-date))]
  (println (count (seq (q communities-query db-since-data)))))

希望这会有所帮助。如果您有更多问题,还有一个Datomic google group