2014-07-07 20 views
6

Jestem zaskoczony, że wyniki kwerend w danych nie są leniwe, gdy podmioty są.Datomic zapytania i lenistwo

Czy istnieje oczywisty powód takiego wyboru, którego mi brakuje? Wydaje się rozsądne, że ktoś może chcieć chcieć (mapować some-fn (wziąć 100 zapytań-zawierających-wyniki-miliony)), ale to wymusiłoby ocenę całego zestawu entity-ids, nie?

Czy istnieje sposób, aby uzyskać leniwy seq (entity-ids) bezpośrednio z powrotem z zapytania, czy też zawsze muszą być najpierw załadowane do pamięci, z lenistwem dostępnym tylko poprzez encję?

+0

Nie widzę żadnych oczywistych przesłanek, ale to wygląda na subtelny problem. Zgodnie z dokumentami każdy etap pośredni zapytania musi pasować do pamięci, nawet jeśli podstawowy zbiór danych nie musi tego robić. Wydaje się, że jest to powód, dla którego wynik musi również pasować do pamięci. Zgaduję, że ma to coś wspólnego z tym, jak działa datalog lub jak go realizuje. Nie jest jasne, czy to wymaganie i brak leniwego API zapytań są niejasne, ale to moje najlepsze przypuszczenie. Pamiętaj również, że nawet funkcje agregacji są nadal oznaczone jako beta. –

+0

Co do twojego drugiego pytania, 'datoms' i' seek-datoms' są ci najbliższe: zapewniają leniwy dostęp do surowych danych. –

Odpowiedz

4

Możesz użyć datomic.api/datoms fn, aby uzyskać leniwy dostęp do podmiotów.

Należy pamiętać, że trzeba określić typ indeksu podczas wywoływania datoms oraz rodzaje indeksów dostępnych dla Ciebie zależy od typu atrybutu, że jesteś zainteresowany Np. Wskaźnik :avet jest dostępna tylko wtedy, gdy atrybut ma :db/index ustawić w schemacie, a indeks :vaet jest dostępny tylko wtedy, gdy atrybut ma typ :db.type/ref.

Używamy coś takiego w pracy (uwaga: atrybut, ref-attr, muszą być :db.type/ref to zadziałało):

(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)) 

Dokumentacja datoms jest nieco skąpe, ale z jakiegoś procesu błędu prawdopodobnie możesz ustalić, czego potrzebujesz. Jest post by August Lilleaas o korzystaniu z indeksu :avet (który wymaga indeksu na atrybut w schemacie danych), który uważam za nieco pomocny.

+0

Indeksy dostępne do użycia z 'datami' są wymienione w dokumentach Datomic tutaj: http://docs.datomic.com/indexes.html –