Использование 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 ответ:
Как указывает комментатор, проблема заключается в передаче функции
datomic.api/pull
вместо использования выражения pull. Некоторые моменты разъяснения:Вы не вызываете функцию
pull
внутри запроса, а используете специальное выражение, называемоеpull
выражение внутри предложенияfind
. Обратите внимание, что запрос принимает литерал структуры данных (почему вы должны использоватьquote
/'
). Выражениеpull
является частью грамматики запроса и чем-то, что распознает синтаксический анализатор datalog, а не прямой вызов функции pull в Datomic API, которая имеет другой вызов.