Datomic查询和懒惰

Sco*_*ach 6 clojure lazy-evaluation datomic

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

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

有没有办法直接从查询中获取一个懒惰的seq(实体-id),或者它们是否总是必须首先加载到内存中,只有通过实体可用的懒惰?

liw*_*iwp 6

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

请注意,您必须在调用时指定索引类型,datoms并且可用的索引类型取决于您感兴趣的属性的类型.例如,:avet索引仅在您的属性已:db/index在架构中设置时才可用,并且:vaetindex仅在属性类型时可用: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))
Run Code Online (Sandbox Code Playgroud)

datoms文档是有点稀疏,但也有一些审判的错误你大概可以计算出你所需要的.August Lilleaas发表了一篇关于使用:avet索引的帖子(这需要对数据库模式中的属性进行索引),我觉得这有点有用.