Datomic汇总使用情况

时间:2014-04-22 09:06:28

标签: datomic datalog

我希望通过下一个查询找到年龄最小的人

(d/q '[:find ?name (min ?age)
         :in [[?name ?age]]]
       [["John" 20]
        ["Bill" 25]
        ["Jack" 20]
        ["Steve" 28]
        ["Andrew" 30]])

但结果是

[["Andrew" 30] ["Bill" 25] ["Jack" 20] ["John" 20] ["Steve" 28]]

怎么做?

3 个答案:

答案 0 :(得分:3)

不是将查询链接在一起,而是使用子查询(在查询中而不是在查询之外进行查询调用):

(d/q '[:find ?name ?mage
       :in $
       :where [(datomic.api/q '[:find (min ?age)
                                :where [_ :age ?age]]
                              $) [[?mage]]]
              [?name :age ?mage]]
   [["John" :age 20]
    ["Bill" :age 25]
    ["Jack" :age 20]
    ["Steve" :age 28]
    ["Andrew" :age 30]])

返回:

#{["John" 20] ["Jack" 20]}

答案 1 :(得分:2)

这将是一个纯粹的Datalog解决方案

(let [db [["John" 20]
          ["Bill" 25]
          ["Jack" 20]
          ["Steve" 28]
          ["Andrew" 30]]]
  (d/q '[:find ?name ?min-age
         :in $ ?min-age
         :where [?name ?min-age]]
       db
       (ffirst (d/q '[:find (min ?age)
                      :in [[?name ?age]]]
                 db))))

SQL中的HAVING子句不是查询语言的一部分,但由于所有查询都在对等体中执行,因此嵌套查询不会产生任何开销。

答案 2 :(得分:-1)

在这种情况下,您不需要datomic,因为您已经在序列中拥有了所需的所有数据。请改用clojure sort

(first (sort-by second [...]))