2013-04-26 146 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