Проблемы с повторным посещением предыдущего раздела Datomic Tutorial

У меня проблемы с учебным пособием по 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

Я не слишком уверен, что это правильное поведение, есть ли что-то, что я делаю неправильно?


person zcaudate    schedule 14.06.2012    source источник


Ответы (1)


Если вы работаете с учебным пособием Seattle в 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, если у вас есть дополнительные вопросы.

person Stuart Dabbs Halloway    schedule 14.06.2012
comment
Я пытался присоединиться! но это была закрытая группа, и меня не пустили... таким образом, 3 вопроса, которые я запостил о переполнении стека. - person zcaudate; 14.06.2012
comment
спасибо за ваше руководство! Мне было интересно, почему веб-сайт был ориентирован на пользователей Java, но имел только минимальные примеры кода для clojure. Где-то в разделе API clojure для веб-сайта здесь должна быть ссылка или действительно большой заголовок... datomic.com/company/resources/clojure-api - person zcaudate; 14.06.2012
comment
Извините за проблемы с присоединением к группе - я не вижу записей об этом на своей стороне. Если вы напишете мне напрямую (stuarthalloway на datomic.com) со своим адресом электронной почты, я отправлю вам приглашение в группу напрямую. - person Stuart Dabbs Halloway; 14.06.2012