6

我惊讶地发现,当实体是时,datomic 中的查询结果并不懒惰。

我缺少这个选择是否有明显的理由?有人可能想要(映射 some-fn(获取 100 个包含数百万个查询结果的查询))似乎是合理的,但这会强制评估整个实体 ID 集,不是吗?

有没有办法直接从查询中获取惰性序列(实体 ID),或者它们是否总是必须首先加载到内存中,而惰性只能通过实体获得?

4

1 回答 1

6

您可以使用datomic.api/datomsfn 以惰性方式访问实体。

请注意,您必须在调用时指定索引类型,datoms并且可用的索引类型取决于您感兴趣的属性的类型。例如,:avet仅当您的属性已:db/index在模式中设置时,索引才可用,并且:vaetindex 仅在您的属性为 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 模式中的属性上建立索引)的帖子,我发现它有些帮助。

于 2014-07-08T12:52:30.540 回答