Missing data 在Datomic中查找缺少属性的实体

Missing data 在Datomic中查找缺少属性的实体,missing-data,datomic,Missing Data,Datomic,如果我有以下数据库: { :fred :age 42 } { :fred :likes :pizza } { :sally :age 42 } 如何查询这两个实体(:fred和:sally),为:fred返回属性:likes:pizza,为:sally返回空值 询问 [:find ?n ?a ?l :where [?n :age ?a] [?n :likes ?l]] 仅返回:fred 42:pizza返回一组实体,这些实体可能有或可能没有声明特定属性,这类似于关系数据库中

如果我有以下数据库:

{ :fred :age 42 }
{ :fred :likes :pizza }
{ :sally :age 42 }
如何查询这两个实体(
:fred
:sally
),为
:fred
返回属性
:likes:pizza
,为
:sally
返回空值

询问

[:find ?n ?a ?l
 :where [?n :age ?a]
        [?n :likes ?l]]

仅返回
:fred 42:pizza

返回一组实体,这些实体可能有或可能没有声明特定属性,这类似于关系数据库中的左连接

datomic中的方法是执行两个步骤:首先查询实体,然后从那里导航以获取属性值,或者
nil
(如果未为给定实体断言属性)


有关示例,请参阅邮件列表帖子及其附带内容。

Datomic最近更新了一些在Datomic查询中可用的表达式函数。其中一个函数称为
get else
,它允许您在实体上不存在属性时提供默认返回值,就像
clojure一样。如果找不到键,core/get
将返回选项第三个参数

因此,使用您自己的示例,您只需将其更改为:

[:查找n?a?l
:where[?n:年龄?a]
[(get-else$?n:likes false)?l]

不幸的是,您实际上无法将
nil
设置为“默认”值,因为它不是有效的Datomic数据类型,如果您尝试,Datomic会发出尖锐的声音,但是false也会让您达到目的。

您还可以尝试“缺失?”fn

看看这个:


事实上,我相信在这种情况下,
get else
是正确的方法。这是一个单一的查询,而不是两个步骤。仅供参考,缺少另一个类似的内置函数。。这不再是正确的答案。请参阅