鉴于 Datomic不支持分页,我想知道如何有效地支持查询,例如:
取前 30 个实体
:history/body
,找到:history/body
与某个正则表达式匹配的实体。
这是我单独进行正则表达式匹配的方法:
{:find [?e]
:where [[?e :history/body ?body]
[(re-find #"foo.*bar$" ?body)]]}
观察:
- 然后我可以
(take ...)
从中获取,但这与匹配前 30 个实体不同。 - 我可以获取所有实体,
take 30
然后使用 手动过滤re-find
,但如果我有 30M 实体,那么让所有实体take 30
看起来非常低效。另外:如果我想从我的 30M 实体中取出 20M 并通过 过滤它们re-find
怎么办?
Datomic 文档讨论了查询是如何在本地执行的,但我尝试对一组 52913 个实体进行内存转换(当然,它们已完全touch
编辑),这需要大约 5 秒。想象一下,数百万或数以百万计的情况会有多糟糕。