Почему этот запрос не возвращает результатов?
Учитывая эти определения сценария базы данных,
(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] ...
).
Я не работал с картами разработчиков, поэтому, возможно, что-то еще нужно, чтобы это заработало, но исправление вашего запроса - это первый шаг.