2013-04-26 44 views
7

Sử dụng Datomic, tôi đang cố gắng nghĩ về làm thế nào tôi có thể lồng một danh sách trong một danh sách?Cấu trúc lồng nhau Với Datomic

Ví dụ về cấu trúc dữ liệu Clojure sẽ là một cái gì đó (xem fig.1). Tôi biết rằng Datomic có khái niệm tham chiếu (ví dụ: fig.2). Nhưng những thứ đó trông giống như các loại vô hướng, không phải là vật thể (mỗi lần).

[{:id 0, 
    :symbol DDD, 
    :company 3D Systems Corporation, 
    :price-difference 1.3100000000000023, 
    :event-list [{high 35.11, 
        tickerId 0, 
        WAP 34.491, 
        open 35.07, 
        date 20130426, 
        count 3403, 
        low 33.8, 
        hasGaps false, 
        close 34.53, 
        field historicalData, 
        volume 8667, 
        type historicalData}]}] 

Hình 1

{:db/id #db/id[:db.part/db] 
    :db/ident :district/region 
    :db/valueType :db.type/ref 
    :db/cardinality :db.cardinality/one 
    :db/doc "A district region enum value" 
    :db.install/_attribute :db.part/db} 

;; district/region enum values 
[:db/add #db/id[:db.part/user] :db/ident :region/n] 
[:db/add #db/id[:db.part/user] :db/ident :region/ne] 
[:db/add #db/id[:db.part/user] :db/ident :region/e] 
[:db/add #db/id[:db.part/user] :db/ident :region/se] 
[:db/add #db/id[:db.part/user] :db/ident :region/s] 
[:db/add #db/id[:db.part/user] :db/ident :region/sw] 
[:db/add #db/id[:db.part/user] :db/ident :region/w] 
[:db/add #db/id[:db.part/user] :db/ident :region/nw] 

hình 2

[EDIT]

Thực ra, tôi nghĩ rằng tôi có thể đã tìm thấy câu trả lời here. Tôi đã đi qua cơ sở mã Day-Of-Datomic và tìm thấy ví dụ bên dưới. Nhưng tôi vẫn không rõ ràng về những gì gắn một cách rõ ràng : namespace comments đến : comment/body (hoặc : comment/tác giả) namespace (s). Datomic có sử dụng quy ước để liên kết : nhận xét đến : nhận xét?

;; comments 
    [{:db/id #db/id[:db.part/db] 
    :db/ident :comments 
    :db/valueType :db.type/ref 
    :db/cardinality :db.cardinality/many 
    :db/isComponent true 
    :db.install/_attribute :db.part/db} 
    {:db/id #db/id[:db.part/db] 
    :db/ident :comment/body 
    :db/valueType :db.type/string 
    :db/cardinality :db.cardinality/one 
    :db.install/_attribute :db.part/db} 
    {:db/id #db/id[:db.part/db] 
    :db/ident :comment/author 
    :db/valueType :db.type/ref 
    :db/cardinality :db.cardinality/one 
    :db.install/_attribute :db.part/db}] 

Hình 1

+0

Không có mối quan hệ nào: nhận xét và: nhận xét/nội dung. Nó chỉ là một quy ước đặt tên. Để biết ví dụ về cách duy trì danh sách danh sách, hãy xem câu trả lời của tôi bên dưới. Tôi đã sử dụng hai định nghĩa thuộc tính ngẫu nhiên để duy trì tương đương với [["a" "b" "c"] ["d" "e" "f"]] trong Clojure. – a2ndrade

Trả lời

10

Bạn có thể không trực tiếp kéo dài đa chiều danh sách/vectơ nhưng bạn có thể sử dụng một thực thể liên kết để thực hiện một cái gì đó tương tự:

;; sample attributes 
[{:db/id #db/id[:db.part/db] 
    :db/ident :some/ref-value 
    :db/valueType :db.type/ref 
    :db/isComponent true 
    :db/cardinality :db.cardinality/many 
    :db.install/_attribute :db.part/db} 
    {:db/id #db/id[:db.part/db] 
    :db/ident :some/list-value 
    :db/valueType :db.type/string 
    :db/cardinality :db.cardinality/many 
    :db.install/_attribute :db.part/db}] 

;; [["a" "b" "c"]["d" "e" "f"]] 
[{:db/id #db/id[:db.part/user -1] 
:some/list-value ["a" "b" "c"]} 
{:db/id #db/id[:db.part/user -2] 
:some/list-value ["d" "e" "f"]} 
{:db/id #db/id[:db.part/user] 
:some/ref-value [#db/id[:db.part/user -1] #db/id[:db.part/user -2]]}] 

Note bạn có thể sử dụng số âm để liên kết các thực thể với nhau. Chúng sẽ được thay thế bằng id thực thể thực khi bạn giao dịch chúng.

EDIT: Bắt đầu với phiên bản 0.8.4020, Datomic hỗ trợ (mối quan hệ ngăn chặn theo quy định của :db/isComponent) component entities lồng nhau như một phần của dữ liệu giao dịch. ví dụ.

;; [["a" "b" "c"]["d" "e" "f"]] 
[{:db/id #db/id[:db.part/db] 
    :some/ref-value [{:some/list-value ["a" "b" "c"]} 
        {:some/list-value ["d" "e" "f"]}]}] 

Bản đồ lồng nhau mở rộng thành hai thực thể con, cả hai được tạo trong cùng phân vùng với thực thể vùng chứa/cấp độ gốc. Để có mẫu mã đầy đủ, hãy xem https://gist.github.com/a2ndrade/5820364

+0

Ahh, tôi hiểu rồi. Cảm ơn rất nhiều. – Nutritioustim

+1

Tôi đã cập nhật câu trả lời của mình để sử dụng tính năng Datomic mới có vẻ gần hơn (nếu không chính xác) với những gì bạn đang tìm kiếm. Hy vọng nó giúp. – a2ndrade

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