2013-04-26 5 views
7

Datomicを使用して、リスト内のリストをどのように入れ子にすることができるか考えていますか?Datomicでネスト構造

例Clojureのデータ構造は何かになります(fig.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

[EDIT]

は実は、私は答えを見つけたかもしれないと思う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 "]]に相当するものを保持するために2つのランダムな属性定義を使用しました。 – a2ndrade

答えて

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

+1

新しいDatomic機能を使用するように私の回答が更新されました。それが役に立てば幸い。 – a2ndrade