为什么这个查询 return 没有结果?
Why does this query return no results?
鉴于数据脚本数据库的这些定义,
(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"))
为什么这个查询 return 没有结果?
首先,您的 in 子句应该是 :in $ ?tagname
;您在那里的绑定使您没有默认数据库,这意味着没有任何内容会匹配您的查询子句。
$
符号是一个特殊符号,它被用作 :where
表单中的默认数据库。您可以使用非默认数据库,方法是在 :where
子句前加上备用数据库的名称符号(例如 :in ?alt-db :where [?alt-db ?tag :tag/name ?tagname] ...
)。
我没有使用过开发卡,所以可能还需要其他一些东西才能使它正常工作,但修复您的查询是第一步。
鉴于数据脚本数据库的这些定义,
(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"))
为什么这个查询 return 没有结果?
首先,您的 in 子句应该是 :in $ ?tagname
;您在那里的绑定使您没有默认数据库,这意味着没有任何内容会匹配您的查询子句。
$
符号是一个特殊符号,它被用作 :where
表单中的默认数据库。您可以使用非默认数据库,方法是在 :where
子句前加上备用数据库的名称符号(例如 :in ?alt-db :where [?alt-db ?tag :tag/name ?tagname] ...
)。
我没有使用过开发卡,所以可能还需要其他一些东西才能使它正常工作,但修复您的查询是第一步。