Datomic中的高级排序查询

问题描述 投票:1回答:1

想象一下,我有演员和电影。如何编写一个查询,针对给定的演员列表返回演员参与的五部最新电影的5元组​​列表(按电影日期降序排序)?

更具体地说:给出一个列表:db / id被称为actor和模型如下:

演员:

: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]]

17是演员ID而2,3,4,5,6,8,9,10,11,12是电影ID。

现在,我强烈感觉无法构建这样的查询。如果我是对的,我怎么能把这些信息分块(想象一下每个演员都有大量的电影,他们被投入,太多不适合记忆)?

clojure datomic
1个回答
0
投票

这是一个普遍的问题 - 如果你有太多的数据要适合内存,那么map / reduce之类的东西可能会更好。那么多的数据也很难排序 - 你如何在没有同时在内存中排序的东西的情况下排序?以块为单位排序并不能很好地映射现实......

一般方法是Richard Riehle在评论中链接的内容 - 手动排序输出。

如果您不使用查询来提取实体,但仅查询实体ID和要排序的值,它也可以提供帮助。这样,Datomic就不需要将所有数据的块拉入对等体。在对相对稀疏的查询结果进行排序后,您可以取出所需的数据。

另一件可以帮助的事情是使用单独的partition作为您需要排序的属性。这样,您可以确保Datomic必须提取的用于获取稀疏数据以进行排序的块仅包含要排序的属性的数据。

© www.soinside.com 2019 - 2024. All rights reserved.