如何在DataScript中正确查询多值属性,匹配指定值获取预期结果
问题原因
你写的查询返回空有两个核心原因:
- DataScript 1.3.0的Datalog查询引擎不支持直接在谓词位置内联匿名函数,所有调用的函数必须是全局命名空间下预先定义好的可访问函数。
- 如果你提前给
:hobbies属性设置了:db/cardinality :db.cardinality/many多值类型,DataScript存储时会自动把传入的爱好数组拆分为独立datom,不需要手动用some遍历匹配。
正确写法
方案1(推荐,性能最优)
首先确认你的schema中:hobbies配置为多值属性:
{:hobbies {:db/cardinality :db.cardinality/many}}
查询语句可以直接简化为索引匹配,不需要额外谓词:
'[:find ?name :where [?p :name ?name] [?p :hobbies "sports"]]
运行后直接返回预期结果#{["Oliver Smith"]}。
方案2(hobbies为单值存储数组场景)
如果你确实需要把爱好整体作为单值向量存储,先在可访问的命名空间下定义判断函数:
(defn has-sports-hobby? [hobbies] (some #{"sports"} hobbies))
再在查询中调用该预定义函数即可:
'[:find ?name :where [?p :name ?name] [?p :hobbies ?hobbies] [(你的命名空间/has-sports-hobby? ?hobbies)]]
内容的提问来源于stack exchange,提问作者sof
相关产品推荐
相关产品推荐

