2014-07-07 2 views
6

엔티티가있을 때 datomic의 쿼리 결과가 게으르지 않다는 사실에 놀랐습니다.Datomic 쿼리와 게으름

이 선택에 대한 분명한 근거가 있습니까? 어떤 사람이 (some-fn (100 개의 질의 결과를 포함하는 수백만을 취함))을 원한다면 합리적인 것처럼 보일지 모르지만, 이는 엔티티 ID의 전체 세트를 평가할 것입니까?

쿼리에서 직접적으로 느린 seq (엔티티 ID)를 얻는 방법이 있습니까? 아니면 항상 엔티티를 통해 사용할 수있는 게으름과 함께 항상 메모리에로드해야합니까?

+0

내가 볼 수있는 확실한 근거는 없지만 이것은 미묘한 문제처럼 보입니다. 문서에 따르면 쿼리의 모든 중간 단계는 기본 데이터 집합이 필요하지 않더라도 메모리에 적합해야합니다. 이것은 결과가 또한 기억에 꼭 들어 맞아야하는 이유 인 것처럼 보인다. 데이터 로그의 작동 방식이나 구현 방식과 관련이 있다고 생각합니다. 이 요구 사항과 지연 쿼리 API의 부족 여부는 명확하지 않지만 이것이 가장 좋은 추측입니다. 또한 집계 기능조차도 베타로 표시됩니다. –

+0

두 번째 질문에 관해서는'datoms'와'seek-datoms'가 가장 가까울 것입니다. 원시 자료에 게으른 접근을 제공합니다. –

답변

4

datomic.api/datoms fn을 사용하면 느린 방식으로 엔티티에 액세스 할 수 있습니다. 당신의 속성이 :db/index이있는 경우는 datoms를 호출하고 사용 가능한 인덱스의 유형은 당신이. 예를 들어 :avet 인덱스에 관심있는 속성의 유형에 따라 다릅니다 때 인덱스 유형을 지정해야

주에만 사용할 수 있습니다 스키마에 설정되고 :vaet 색인은 사용자의 속성이 :db.type/ref 인 경우에만 사용할 수 있습니다.

우리는 직장에서이 같은 것을 사용 (참고 : 속성, ref-attr이 작동 할 수 :db.type/ref이어야합니다) :

(defn datoms-by-ref-value 
    "Returns a lazy seq of all the datoms in the database matching the 
    given reference attribute value." 
    [db ref-attr value] 
    (d/datoms db :vaet value ref-attr)) 

datoms 문서는 비트 스파 스이지만, 일부 재판 오류와 당신은 아마도 당신이 필요로하는 것을 해결할 수 있습니다. :avet 색인을 사용하는 것에 대한 post by August Lilleaas이 있습니다 (어느 것이 datomic 스키마의 속성에 대한 색인이 필요함). 다소 도움이되는 것으로 나타났습니다.

+0

'Datoms와 함께 사용할 수있는 색인은 Datomic 문서에 나와 있습니다 : http://docs.datomic.com/indexes.html –