【问题标题】:Advanced sorting query in DatomicDatomic 中的高级排序查询
【发布时间】:2019-01-31 08:18:44
【问题描述】:

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

更具体地说:给定一个名为 actors 的 :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]]

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

现在,我有一种强烈的感觉,不能构造这样的查询。 如果我是对的,我怎样才能分块获得这些信息(想象一下每个演员都有成吨成吨的电影,太多以至于无法记忆)?

【问题讨论】:

标签: clojure datomic


【解决方案1】:

这是一个普遍的问题——如果你有太多的数据无法放入内存,那么像 map/reduce 这样的东西可能会更好。这么多数据也很难排序——如果没有同时在内存中排序的所有数据,你如何排序?分块排序并不能很好地映射到现实......

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多