Использование Datomic pull в запросе


По строке 54 в получать начали.clj ' файл, который поставляется с Datomic (под samples / seattle) я должен быть в состоянии использовать функцию pull внутри запроса так:

(def pull-results (q '[:find (pull ?c [*]) :where [?c :community/name]] (db conn)))

Однако в моем коде ниже я получаю ошибку: IllegalArgumentException аргумент [ * ] в :find не является переменной datomic.запрос/проверка запроса (Запрос.clj: 315)

(defn get-tag [] (d/q '[:find (d/pull ?e [*])
                        :where [?e :tag.tag/term]] (db conn)))
Так вот, на мой взгляд, эти двое построены сходным образом. Вкупе с тем, что функция pull api как считывается из http://docs.datomic.com/clojure/#datomic.api/pull представляется следующим образом:
(pull db pattern eid)
Я бы сказал, что API изменился с тех пор, как был написан код Сиэтла. Я не ошибаюсь? Если нет, то что здесь происходит? Спасибо
1 4

1 ответ:

Как указывает комментатор, проблема заключается в передаче функции datomic.api/pull вместо использования выражения pull. Некоторые моменты разъяснения:

Вы не вызываете функцию pull внутри запроса, а используете специальное выражение, называемое pull выражение внутри предложения find. Обратите внимание, что запрос принимает литерал структуры данных (почему вы должны использовать quote/'). Выражение pull является частью грамматики запроса и чем-то, что распознает синтаксический анализатор datalog, а не прямой вызов функции pull в Datomic API, которая имеет другой вызов.