如果我有以下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/

10-10 08:05