2013-04-26 74 views
7

使用Datomic,我試圖想到如何在列表中嵌套列表?使用Datomic嵌套結構

一個Clojure數據結構的例子可能是(參見圖1)。我知道Datomic具有參考的概念(例如圖2)。但是這些看起來像標量類型,而不是對象(本身)。

[{: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}]}] 

圖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] 

圖2

[編輯]

其實,我想我可能已經找到了答案here。我正在通過Day-Of-Datomic代碼庫,並找到下面的示例。但我仍然沒有什麼明確的聯繫在一起明確:評論命名爲:評論/體(或:評論/作者)命名空間(S)。 Datomic是否只使用約定來鏈接:評論:評論

;; 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}] 

圖1

+0

沒有任何聯繫:評論和:評論/正文。這只是一個命名約定。有關如何保存列表列表的示例,請參閱下面的答案。我使用了兩個隨機屬性定義來在Clojure中保留等價於[[「a」「b」「c」] [「d」「e」「f」]]]。 – a2ndrade 2013-04-26 20:17:31

回答

10

您不能直接堅持多維列表/向量,但你可以使用一個連接實體來完成類似的東西:

;; 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]]}] 

注您可以使用負數將實體鏈接在一起。處理它們時,它們將由真實實體ID替換。

EDIT:與0.8.4020版本開始,Datomic支持嵌套component entities(由:db/isComponent指定包含關係)作爲交易數據的一部分。例如

;; [["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"]}]}] 

嵌套映射擴展到兩個子實體,無論是在相同的分區容器/父實體創建。有關完整的代碼示例,請參閱https://gist.github.com/a2ndrade/5820364

+0

啊,我明白了。非常感謝。 – Nutritioustim 2013-04-26 21:35:59

+1

我更新了我的答案,使用了一種新的Datomic功能,它看起來更接近(如果不是完全)您正在尋找的內容。希望能幫助到你。 – a2ndrade 2013-06-20 04:57:08