如果我有以下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
。
答案 0 :(得分: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也应该让你到达你去的地方。
答案 1 :(得分:6)
获取可能会或可能不会声明特定属性的一组实体类似于关系数据库中的LEFT JOIN。
datomic中的方法是执行两个步骤:首先查询实体,然后从那里导航以获取属性值,如果属性未针对给定实体声明,则导航nil
。
请参阅邮件列表帖子How do you do a left join in Datomic?及其随附的gist作为示例。
答案 2 :(得分:4)