问题描述
我正在使用 datomic 中的 or
子句。
我知道在这个查询中使用 or
会得到 :user/first-name "Mia"
的用户和 :user/first-name "Wallace"
的用户。
(d/q
'[:find ?u
:where
(or [?u :user/first-name "Mia"]
[?u :user/last-name "Wallace"])]
(d/db conn))
但我想要一个类似于 Clojure 的 or
的子句。就是这样,我想要具有 :user/first-name "Mia" 的用户,如果没有,我想找到带有 :user/last-name "Lucas"
的用户。是否可以在一个查询中做到这一点?我知道我可以通过两个查询来完成。
解决方法
您可以使用 Collection Binding 或 Relation Binding 来做到这一点。来自文档:
集合绑定将单个变量绑定到传递的多个值 作为一个集合。这可以用来问“或”问题,即什么 发布与保罗麦卡特尼或乔治哈里森有关吗?
;; query
[:find ?release-name
:in $ [?artist-name ...]
:where [?artist :artist/name ?artist-name]
[?release :release/artists ?artist]
[?release :release/name ?release-name]]
;; inputs
db,["Paul McCartney" "George Harrison"]
;; result
#{["My Sweet Lord"]
["Electronic Sound"]
["Give Me Love (Give Me Peace on Earth)"]
["All Things Must Pass"]
...}