我惊讶地发现,当实体是时,datomic 中的查询结果并不懒惰。
我缺少这个选择是否有明显的理由?有人可能想要(映射 some-fn(获取 100 个包含数百万个查询结果的查询))似乎是合理的,但这会强制评估整个实体 ID 集,不是吗?
有没有办法直接从查询中获取惰性序列(实体 ID),或者它们是否总是必须首先加载到内存中,而惰性只能通过实体获得?
我惊讶地发现,当实体是时,datomic 中的查询结果并不懒惰。
我缺少这个选择是否有明显的理由?有人可能想要(映射 some-fn(获取 100 个包含数百万个查询结果的查询))似乎是合理的,但这会强制评估整个实体 ID 集,不是吗?
有没有办法直接从查询中获取惰性序列(实体 ID),或者它们是否总是必须首先加载到内存中,而惰性只能通过实体获得?
您可以使用datomic.api/datoms
fn 以惰性方式访问实体。
请注意,您必须在调用时指定索引类型,datoms
并且可用的索引类型取决于您感兴趣的属性的类型。例如,:avet
仅当您的属性已:db/index
在模式中设置时,索引才可用,并且:vaet
index 仅在您的属性为 type 时可用:db.type/ref
。
我们在工作中使用这样的东西(注意:属性,,ref-attr
必须是:db.type/ref
这个才能工作):
(defn datoms-by-ref-value
"Returns a lazy seq of all the datoms in the database matching the
given reference attribute value."
[db ref-attr value]
(d/datoms db :vaet value ref-attr))
datoms
文档有点稀疏,但通过一些尝试,您可能会发现您需要的错误。August Lilleaas有一篇关于使用:avet
索引(它需要在 datomic 模式中的属性上建立索引)的帖子,我发现它有些帮助。