Datomic에서 두 가지 쿼리를 사용하여이 작업을 수행하는 것이 좋습니다. 피어 캐시 데이터베이스를 로컬로 갖는 것은 하나의 쿼리에서 수행해야하는 많은 부담을 덜어 준다는 것을 의미합니다. 얹는
[:find (max ?year) .
:where [?m :movie/year ?year]]
:
[:find ?maxyear ?title ?rating
:in $ ?maxyear
:where [?m :movie/year ?maxyear]
[?m :movie/title ?title]
[?m :movie/rating ?rating]]
은 OK입니다.
(let [db (d/db conn)]
(->>
(d/q '[:find (max ?year) .
:where [?m :movie/year ?year]]
db)
(d/q '[:find ?maxyear ?title ?rating
:in $ ?maxyear
:where [?m :movie/year ?maxyear]
[?m :movie/title ?title]
[?m :movie/rating ?rating]]
db)))
공지 사항 우리는 바인딩하자에 한 번 연결에서 데시벨 값을 얻을 : 같은 Clojure의의 체인 쿼리는 볼 수 있었다. 그것은 가능는 당신이 바로 제약 언급 한 결과를 얻을 기능을 반환하는 모음을 사용하는 것입니다, 그러나 이것은 당신이 기대하는 방법 동작하지 않을 수 있습니다 - 최신 비틀즈가 해제 도착이 예와 같이
(d/q '[:find (max ?tuple)
:where [?e :artist/name "The Beatles"]
[?a :release/artists ?e]
[?a :release/year ?y]
[?a :release/name ?n]
[(vector ?y ?n) ?tuple]]
(d/db conn))
이것은 첫 번째 요소의 암시 적 순서에 의존하지만 여러 개의 maxes에 대해 어떻게 작동합니까?
[[[2011 "Love"]]]
을하지만 최대없이, 우리는 최대로 뽑아 하나를 참조 독특한 아니었다 수 :이 반환, 당신이 기대하는 방법을 많이 알고 있다면
[[2011 "1"]] [[2011 "Love"]]
, 당신이 설정할 수 있습니다 예 :
:find (max 2 ?tuple)
그러나 이것은 우리를 피하는 길을 피하는 것입니다. 대부분의 경우 쿼리를 결합하는 간단하고 강력한 사례를 선호하는 것이 좋습니다.