2014-07-07 14 views
6

Tôi ngạc nhiên khi thấy rằng kết quả truy vấn trong datomic không phải là lười, khi thực thể là.Truy vấn dữ liệu và sự lười biếng

Có một lý do rõ ràng nào cho lựa chọn này mà tôi đang thiếu không? Nó có vẻ hợp lý mà ai đó có thể muốn muốn (bản đồ một số-fn (mất 100 kết quả truy vấn-chứa-triệu)), nhưng điều này sẽ buộc đánh giá toàn bộ tập hợp các id thực thể, không?

Có cách nào để có được một địa chỉ lười biếng (của các thực thể-id) trực tiếp từ truy vấn, hay chúng luôn phải được nạp vào bộ nhớ trước, với sự lười biếng chỉ có sẵn thông qua thực thể?

+0

Không có lý do rõ ràng mà tôi có thể thấy, nhưng điều này có vẻ như là một vấn đề tinh tế. Theo tài liệu, mọi bước trung gian trong truy vấn phải phù hợp với bộ nhớ ngay cả khi tập dữ liệu cơ bản không cần. Điều này có vẻ là lý do mà kết quả cũng phải phù hợp trong bộ nhớ. Tôi đoán nó có một cái gì đó để làm với cách datalog hoạt động hoặc làm thế nào họ thực hiện nó. Cho dù yêu cầu đó và thiếu một API truy vấn lười biếng có liên quan không rõ ràng, nhưng đó là dự đoán tốt nhất của tôi. Cũng lưu ý rằng ngay cả các tính năng tổng hợp vẫn được đánh dấu là beta. –

+0

Đối với câu hỏi thứ hai của bạn, 'datoms' và' seek-datoms' là gần nhất bạn sẽ nhận được: chúng cung cấp truy cập lười đến các nguyên liệu thô. –

Trả lời

4

Bạn có thể sử dụng số datomic.api/datoms fn để truy cập vào các đối tượng theo cách lười biếng.

Lưu ý rằng bạn phải chỉ định loại chỉ mục khi gọi datoms và các loại chỉ mục có sẵn cho bạn tùy thuộc vào loại thuộc tính bạn quan tâm. Ví dụ: chỉ số :avet chỉ khả dụng nếu thuộc tính của bạn có :db/index được đặt trong giản đồ và chỉ mục :vaet chỉ khả dụng nếu thuộc tính của bạn thuộc loại :db.type/ref.

Chúng tôi sử dụng một cái gì đó như thế này tại nơi làm việc (lưu ý: các thuộc tính, ref-attr, phải có :db.type/ref để làm việc này):

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

Các tài liệu datoms là một chút thưa thớt, nhưng với một số thử nghiệm một lỗi bạn có thể có thể làm việc ra những gì bạn cần. Có một post by August Lilleaas về việc sử dụng chỉ số :avet (yêu cầu chỉ mục trên thuộc tính trong giản đồ dữ liệu) mà tôi thấy có phần hữu ích.

+0

Các chỉ mục có sẵn để sử dụng với 'datoms' được liệt kê trong tài liệu Datomic tại đây: http://docs.datomic.com/indexes.html –

Các vấn đề liên quan