2014-07-07 14 views
6

Sono sorpreso nel constatare che i risultati della ricerca in datomico non sono pigri, quando le entità lo sono.Domande e pigrasi anatomiche

Esiste una giustificazione logica per questa scelta che mi manca? Sembra ragionevole che qualcuno voglia voler (mappare some-fn (prendi 100 query-result-contenenti-milioni)), ma questo forzerebbe la valutazione dell'intero insieme di entità-id, no?

C'è un modo per ottenere un pigro seq (di entità-id) direttamente indietro dalla query, o devono sempre essere caricati in memoria prima, con la pigrizia disponibile solo attraverso l'entità?

+0

Nessuna giustificazione logica che io possa vedere, ma questo sembra un problema sottile. Secondo i documenti, ogni passaggio intermedio in una query deve rientrare nella memoria anche se non è necessario il set di dati sottostante. Questa sembra essere la ragione per cui anche il risultato deve essere contenuto nella memoria. Immagino che abbia qualcosa a che fare con come funziona il datalog o come lo implementano. Non è chiaro se questo requisito e la mancanza di una API di query lazy siano correlati, ma questa è la mia ipotesi migliore. Nota anche che anche le funzionalità di aggregazione sono ancora contrassegnate come beta. –

+0

Per quanto riguarda la seconda domanda, 'datomi' e' seek-datom' sono i più vicini che si ottengono: forniscono un accesso pigro ai dati non elaborati. –

risposta

4

È possibile utilizzare datomic.api/datoms fn per accedere alle entità in modo lazy.

Si noti che è necessario specificare il tipo di indice quando si chiama datoms ei tipi di indici disponibili per voi dipende dal tipo di attributo che ti interessa. Ad esempio, l'indice di :avet è disponibile solo se l'attributo ha :db/index impostato nello schema e l'indice :vaet è disponibile solo se l'attributo è di tipo :db.type/ref.

Usiamo qualcosa di simile al lavoro (nota: l'attributo, ref-attr, deve essere di :db.type/ref per questo lavoro):

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

La documentazione datoms è un po 'scarsa, ma con qualche prova un errore probabilmente puoi capire cosa ti serve. C'è un post by August Lilleaas sull'utilizzo dell'indice :avet (che richiede un indice sull'attributo nello schema datomico) che ho trovato piuttosto utile.

+0

Gli indici disponibili per l'uso con 'datomi' sono elencati nei documenti Datomic qui: http://docs.datomic.com/indexes.html –