或 datomic 中的子句

问题描述

我正在使用 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 BindingRelation 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"]
  ...}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...