【问题标题】:Datomic queries and laziness原子查询和惰性
【发布时间】:2014-08-27 13:00:36
【问题描述】:

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

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

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

【问题讨论】:

  • 我看不到明显的理由,但这看起来是一个微妙的问题。根据文档,即使底层数据集不需要,查询中的每个中间步骤都必须适合内存。这似乎是结果也必须适合内存的原因。我猜这与数据记录的工作方式或他们如何实现它有关。这个要求和缺少惰性查询 API 是否相关尚不清楚,但这是我最好的猜测。另请注意,即使聚合功能仍被标记为 beta。
  • 至于您的第二个问题,datomsseek-datoms 是您最接近的:它们提供对原始数据的惰性访问。

标签: clojure lazy-evaluation datomic


【解决方案1】:

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

请注意,您必须在调用datoms 时指定索引类型,您可用的索引类型取决于您感兴趣的属性类型。例如,:avet 索引仅在您的属性在架构中设置了: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 文档有点稀疏,但通过一些尝试,您可能会发现您需要的错误。有一个 post by August Lilleaas 关于使用 :avet 索引(它需要在 datomic 模式中的属性上使用索引),我发现它有些帮助。

【讨论】:

猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 2014-11-28
  • 2023-03-21
  • 2013-05-02
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多