想象一下我有演员和电影。对于给定的演员列表,如何编写一个查询,返回演员参与的五部最新电影的5元组列表(按电影日期降序)?
更具体地说:给出了一个名为参与者和模型的:db/id的列表如下:
演员:
:db/id
:actor/name str
:actor/movie ref
电影:
:db/id
:db/name str
:db/date inst
我想写一个查询,如:
(d/q '[:find ?actor ???????
:in $ [?actor ...]
:where ??????????] snapshot actors)
预期结果:
[[1 [2 3 4 5 6]
7 [8 9 10 11 12]]
其中1
和7
是演员ids,2,3,4,5,6,8,9,10,11,12
是电影ids。
现在,我有一种强烈的感觉,这种查询是无法构建的。如果我是对的,我如何才能得到这些信息块(想象一下,每个演员都有成堆成吨的电影被投进去,太多的电影无法在记忆中保存)?
发布于 2019-04-12 11:10:56
这是一个普遍的问题--如果您有太多的数据无法在内存中使用,那么可能像map/reduce这样的东西会更好地工作。那么多的数据也很难排序--如果不同时对内存中的所有内容进行排序,如何进行排序?分块排序并不能很好地与现实相符.
一般的方法是Richard在您的评论中链接到的--手工对输出进行排序。
如果您不使用查询来提取实体,而只对实体id和要排序的值进行查询,这也会有所帮助。这样,data就不需要将所有数据的块提取到对等程序中了。相反,您可以在对相对稀疏的查询结果进行排序之后,提取所需的数据。
这里另一件可能有帮助的事情是为您需要排序的属性使用一个单独的隔断。这样,您就可以确保Datomic为获得用于排序的稀疏数据而必须拉出的块只包含正在排序的属性的数据。
https://stackoverflow.com/questions/54456086
复制相似问题