在Datomic

时间:2015-06-15 11:51:24

标签: datomic

有没有办法在查询中纯粹表达这种逻辑?

(def e-top
  (let [res (d/q '[:find ?e (count ?p)
                   :where [?p :likes ?e]] db)]
    (first (apply max-key last res))))

1 个答案:

答案 0 :(得分:2)

如果您需要在一个查询中工作,那么聚合问题的聚合最好用子查询(对查询内部查询的嵌套调用)来解决。请参阅此answer on the Datomic mailing list,其中包含针对mbrainz的汇总结果的类似(不完全相同)查询:

(d/q '[:find ?track ?count
       :where [(datomic.api/q '[:find ?track (count ?artist)
               :where [?track :track/artists ?artist]] $) [[?track ?count]]]
       [(> ?count 1)]]
  (d/db conn))

对于您的情况(假设工作留在Clojure中),申请将更快更简单。只需要做一些简单的事情的子查询(例如,获取与最大值相关联的东西)往往更有意义,如果你正在使用REST API或其他客户端包裹Datomic,而你没有与之相关的性能优势同行图书馆正在进行中。