有没有办法在查询中纯粹表达这种逻辑?
(def e-top
(let [res (d/q '[:find ?e (count ?p)
:where [?p :likes ?e]] db)]
(first (apply max-key last res))))
答案 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,而你没有与之相关的性能优势同行图书馆正在进行中。