7

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

[編集]

実は、ここで答えを見つけたかもしれないと思います。私はDay-Of-Datomicコード ベースを調べていて、以下の例を見つけました。しかし、何が:comments名前空間を:comment/body (または:comment/author ) 名前空間に明示的に結び付けているのか、まだはっきりしていません。Datomic は:comments:commentにリンクするために規約を使用しているだけですか?

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

4

1 に答える 1

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 はトランザクション データの一部として、ネストされたコンポーネント エンティティ(によって指定された包含関係) をサポートします。: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"]}]}]

ネストされたマップは 2 つのサブエンティティに展開され、両方ともコンテナー/親エンティティと同じパーティションに作成されます。完全なコード サンプルについては、https://gist.github.com/a2ndrade/5820364を参照してください。

于 2013-04-26T19:24:50.057 に答える