我很惊讶地发现,当实体出现时,datomic中的查询结果并不是懒惰的。
我错过了这个选择有明显的理由吗?有人可能想要这个似乎是合理的(映射some-fn(包含100个查询结果包含数百万)),但是这会强制评估整个实体ID组,不是吗?
有没有办法直接从查询中获取一个懒惰的seq(of-entity-id),或者它们是否总是必须首先加载到内存中,只能通过实体获得懒惰?
答案 0 :(得分:6)
您可以使用datomic.api/datoms
fn以懒惰的方式访问实体。
请注意,您必须在调用datoms
时指定索引类型,并且您可用的索引类型取决于您感兴趣的属性类型。例如:avet
index仅在您的属性在架构中设置了:db/index
时才可用,:vaet
索引仅在您的属性类型为: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
文档有点稀疏,但是如果有一些试验错误,你可能会找到你需要的东西。关于使用:avet
索引(需要对数据库模式中的属性建立索引),post by August Lilleaas有{{3}}我觉得有些帮助。