如果我有以下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
如何在未找到键的情况下返回选项第三参数一样。
因此,使用您自己的示例,您只需要像这样更改它:[:find ?n ?a ?l :where [?n :age ?a] [(get-else $ ?n :likes false) ?l]
不幸的是,您实际上不能将nil
设置为“默认”值,因为它不是有效的Datomic数据类型,如果您尝试Datomic会will咕,但false也会使您继续前进。
关于missing-data - 在Datomic中查找缺少属性的实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21101259/