如果我有以下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数据库:
{ :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 会失败,但 false 也应该让您到达目的地。
取回一组可能具有或不具有断言的特定属性的实体类似于关系数据库中的 LEFT JOIN。
datomic 中的方法是执行两个步骤:首先查询实体,然后从那里导航以获取属性值,或者nil
是否没有为给定实体断言属性。
请参阅邮件列表帖子您如何在 Datomic 中进行左连接?并以随附的要点为例。