2014-12-01 2 views
0

이의 내가 영화의 목록이 있다고 가정 해 봅시다 그리고 나는 그들에게이 모든 방법을 얻을 수 있습니다 :Datomic - 어떤 속성에서 가장 높은과를 선택 엔티티

[:find ?year ?title ?rating 
:where 
[?Movie :movie/year ?year ] 
[?Movie :movie/year ?title ] 
[?Movie :movie/year ?rating]] 

나는 더 높은 만 영화를 얻을이를 제한 할 수 있습니다 어떻게 평가? 나는 같은 것을 원한다고 느낀다 ...

[:find ?year ?title ?rating 
:where 
[?Movie :movie/year ?year ] 
[?Movie :movie/year ?title ] 
[?Movie :movie/year ?rating] 
[(= ?rating (max ?rating) ]] 

그러나 분명히 내가 원하는 것을하지는 않을 것이다.) 팁?

답변

3

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) 

그러나 이것은 우리를 피하는 길을 피하는 것입니다. 대부분의 경우 쿼리를 결합하는 간단하고 강력한 사례를 선호하는 것이 좋습니다.

관련 문제