2016-04-29 60 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子句加上備用數據庫的名稱符號(例如:in ?alt-db :where [?alt-db ?tag :tag/name ?tagname] ...)。

我還沒有使用dev卡,所以有可能還有其他的東西需要這個工作,但修復你的查詢是第一步。

相關問題