2012-06-14 15 views
1

我具有「重溫過去的」一節http://datomic.com/company/resources/tutorial.html以「重溫過去的」 Datomic教程的部分問題

在與datomic教程問題,對於下面的兩個查詢:

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 

我不是太肯定的是這是一個正確的行爲,沒有任何我做錯了什麼?

回答

10

如果您正在通過Clojure的西雅圖教程,可能需要了解的最重要的一件事情是在Datomic發行版中包含正在運行的Clojure代碼。文件名是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

+0

我試圖加入!但它是一個封閉的組,我沒有被允許進入。因此,我發佈了堆棧溢出的三個問題。 – zcaudate

+0

感謝您的指導!我想知道爲什麼這個網站是針對java用戶的,但只有最少的clojure編碼例子。在這裏的網站clojure apis部分應該有一個鏈接或一個真正的大標題... http://datomic.com/company/resources/clojure-api – zcaudate

+0

對於加入該組的麻煩抱歉 - 我看到沒有記錄在我的結尾。如果你用你的電子郵件地址直接ping我(stuarthalloway在datomic.com),我會直接給你發一個團體邀請。 –