1

「過去の再考」セクションのdatomicチュートリアルに問題がありますhttp://datomic.com/company/resources/tutorial.html

以下の2つのクエリの場合:

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

これが正しい動作であるかどうかはわかりませんが、何か間違っていることはありますか?

4

1 に答える 1

9

Clojureでシアトルのチュートリアルを実行している場合、おそらく最も重要なことは、動作するClojureコードがDatomicディストリビューションに含まれていることです。ファイル名はsamples/seattle/getting-started.cljです。REPLで簡単にフォローできます。

あなたの質問のClojureコードに関する2つの観察:

このsince関数は、数値ではなくデータベース値を返すように文書化されているため、表示されている動作は期待どおりです。データベースに何があるかを確認するには、クエリを発行する必要があります。

データベースにはClojurecount関数のセマンティクスが文書化されていないため、データベースを呼び出さない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)))))

お役に立てれば。さらに質問がある場合は、Datomicgoogleグループもあります。

于 2012-06-14T18:05:33.833 に答える