2016-04-29 4 views
3

Учитывая эти определения в datascript дб,Почему этот запрос не возвращает результатов?

(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)) 

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

(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")) 

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

ответ

3

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

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

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

Смежные вопросы