получение элементов по eid из datomic, слишком мало входных данных?

Итак, я пытаюсь использовать идентификатор объекта для извлечения элементов, недавно переданных в базу данных datomic.

Однако при вызове (get-post-by-eid zzzzzzzzz) я получаю сообщение об ошибке

IllegalArgumentExceptionInfo :db.error/too-few-inputs Query expected 2 inputs but received 1  datomic.error/arg (error.clj:57)


(defn get-post-by-eid [eid]
   (d/q '[:find ?title ?content ?tags ?eid
              :in $ ?eid
              :where
              [?eid post/title ?title]
              [?eid post/content ?content]
              [?eid post/tag ?tags]] (d/db conn)))

Итак, я полагаю, что моя строка запроса должна быть неправильно сформирована.

Я просматривал http://www.learndatalogtoday.org/chapter/3, но все же не уверен, где я сбиваюсь с пути.

Любая помощь приветствуется (=


person sova    schedule 05.03.2015    source источник


Ответы (1)


В вашем предложении :in указано, что вы ожидаете передачи двух источников данных в функцию q. $ ?eid означает, что вы собираетесь передать базу данных (привязанную к $) и какое-то другое значение, которое будет привязано к ?eid.

Как это:

(defn get-post-by-eid [eid]                  
  (d/q '[:find ?title ?content ?tags ?eid    
         :in $ ?eid                          
         :where                              
         [?eid post/title ?title]            
         [?eid post/content ?content]        
         [?eid post/tag ?tags]]              
       (d/db conn)                           
       eid))  

В противном случае ваш параметр eid не сможет фактически попасть в запрос. Вы должны передать это явно, в этом нет никакой магии.

person levand    schedule 05.03.2015
comment
Ух ты! Таким образом, все, что входит в предложение :in, также должно быть явно добавлено в (d/q ...) в конце. Теперь это имеет большой смысл, так как (d/q '[найти предложение] (d/db conn) eid) точно так же, как передача аргументов любому другому оператору. Спасибо за этот очень ясный ответ. Решил уточнить, так как, возможно, у кого-то возникнет подобный вопрос в будущем (= спасибо за ваш четкий ответ - person sova; 05.03.2015
comment
В яблочко. Привязки в предложении :in сопоставляются один к одному с аргументами в q - person levand; 05.03.2015