如果我有以下 Datomic数据库:
{ :fred :age 42 }
{ :fred :likes :pizza }
{ :sally :age 42 }
如何查询两个实体(
:fred
和 :sally
),取回属性 :likes :pizza
为 :fred
和 :sally
的空值?查询
[:find ?n ?a ?l
:where [?n :age ?a]
[?n :likes ?l]]
只返回
:fred 42 :pizza
.
最佳答案
Datomic 最近更新了一些在 Datomic 查询中可用的表达式函数。这些函数之一被称为 get-else
如果实体上不存在属性,它允许您提供默认返回值,就像 clojure.core/get
一样。如果未找到 key ,将返回选项第三个参数。
因此,使用您自己的示例,您只需要像这样更改它:[:find ?n ?a ?l
:where [?n :age ?a]
[(get-else $ ?n :likes false) ?l]
不幸的是,您实际上无法制造 nil
一个“默认”值,因为它不是有效的 Datomic 数据类型,如果您尝试,Datomic 会导致错误,但 false 也应该让您到达目的地。
关于missing-data - 在 Datomic 中查找缺少属性的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21101259/