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

Ral*_*lph 8 missing-data datomic

如果我有以下Datomic数据库:

{ :fred :age 42 }
{ :fred :likes :pizza }
{ :sally :age 42 }
Run Code Online (Sandbox Code Playgroud)

如何查询两个实体(:fred:sally),取回属性:likes :pizza:fred和一个空值:sally

查询

[:find ?n ?a ?l
 :where [?n :age ?a]
        [?n :likes ?l]]
Run Code Online (Sandbox Code Playgroud)

只返回:fred 42 :pizza.

小智 16

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

因此,使用您自己的示例,您只需要像这样更改它:

[:find ?n ?a ?l :where [?n :age ?a] [(get-else $ ?n :likes false) ?l]

不幸的是,你实际上不能创建nil一个"默认"值,因为它不是一个有效的Datomic数据类型,如果你尝试,Datomic会鲤鱼,但是false也应该让你到达你想去的地方.


Ale*_*ard 6

返回一组可能或可能没有声明特定属性的实体类似于关系数据库中的LEFT JOIN.

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

查看邮件列表帖子如何在Datomic中进行左连接?以其附带的要点为例.

  • 实际上,我相信`get-else`在这种情况下是正确的方法.这是一个单一的查询,而不是两个步骤.作为一个FYI,另一个类似的内置函数是"缺失?". (2认同)

Fel*_*ipe 5

您还可以尝试“丢失”?fn。

看看这个:

http://docs.datomic.com/query.html#missing