Почему этот запрос не возвращает результатов?

Учитывая эти определения сценария базы данных,

(def schema
  {:tag/name { :db/unique :db.unique/identity }
   :item/tag {:db/valueType   :db.type/ref
               :db/cardinality :db.cardinality/many}
   :outfit/item {:db/valueType   :db.type/ref
                 :db/cardinality :db.cardinality/many}}
)
(defonce conn (d/create-conn schema))

(defn new-entity! [conn attrs]
  (let [entity (merge attrs {:db/id -1})
        txn-result (d/transact! conn [entity])
        temp-ids (:tempids txn-result)]
    (temp-ids -1)))

(defonce init
  (let [tag1    (new-entity! conn {:tag/name "tag1"})
        item1   (new-entity! conn {:item/tag tag1})
        outfit1   (new-entity! conn {:outfit/item item1})]
    :ok))

Если я запускаю эту девкард, я не получаю никаких результатов:

(defcard find-by-tag-param
  "find items by tag"
  (d/q '[ :find ?item 
         :in ? ?tagname
         :where
         [ ?tag :tag/name ?tagname ]
         [ ?item :item/tag ?tag ]]
       @conn "tag1"))

Почему этот запрос не возвращает результатов?

1 ответ

Решение

Для начала, ваш пункт должен быть :in $ ?tagname; Связывание, которое у вас есть, оставляет вас без базы данных по умолчанию, что означает, что ничто не будет соответствовать вашим запросам.

$ символ является специальным символом, который используется в качестве базы данных по умолчанию в :where формы. Вы можете использовать базы данных не по умолчанию, добавив префикс :where предложения с именем-символом альтернативного БД (например, :in ?alt-db :where [?alt-db ?tag :tag/name ?tagname] ...).

Я не работал с картами разработчиков, поэтому, возможно, что-то еще нужно, чтобы это заработало, но исправление вашего запроса - это первый шаг.

Другие вопросы по тегам