2013-04-26 1 views
7

En utilisant Datomic, j'essaie de penser à comment puis-je imbriquer une liste dans une liste? Un exemple de structure de données Clojure serait quelque chose (voir , figure 1). Je sais que Datomic a la notion de références (ex: fig.2). Mais ceux-ci ressemblent à des types scalaires, pas à des objets (en soi).Imbrication de structures avec Datomic

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

fig.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] 

fig.2

[EDIT]

En fait, je pense que je pourrais avoir trouvé la réponse here. Je passais par la base de code Day-Of-Datomic, et j'ai trouvé l'exemple ci-dessous. Mais je ne suis toujours pas clair sur ce qui lie explicitement la : commentaires espace de noms à la : commentaire/body (ou : commentaire/auteur) espace (s). Est-ce que Datomic utilise simplement la convention pour lier : commentaires à : 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}] 

fig.1

+0

Rien ne lie: commentaires et: commentaire/corps. C'est juste une convention de nommage. Pour un exemple de la façon de conserver une liste de listes, voir ma réponse ci-dessous. J'ai utilisé deux définitions d'attributs aléatoires pour conserver l'équivalent de [["a" "b" "c"] ["d" "e" "f"]] dans Clojure. – a2ndrade

Répondre

10

Vous ne pouvez pas persister directement des listes multidimensionnels/vecteurs, mais vous pouvez utiliser une entité de liaison pour accomplir quelque chose de similaire:

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

Remarque que vous pouvez utiliser des nombres négatifs pour lier des entités ensemble. Ils seront remplacés par des identifiants d'entité réelle lorsque vous les traitez.

EDIT: A partir de la version 0.8.4020, Datomic prend en charge component entities imbriquées (relations de confinement spécifiées par :db/isComponent) dans le cadre des données de transaction. par exemple.

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

Les cartes imbriquées se dilatent en deux sous-entités, créées dans la même partition que l'entité conteneur/parent. Pour un exemple de code complet, voir https://gist.github.com/a2ndrade/5820364

+0

Ahh, je vois que je vois. Merci beaucoup. – Nutritioustim

+1

J'ai mis à jour ma réponse pour utiliser une nouvelle fonctionnalité de Datomic qui semble beaucoup plus proche (sinon exactement) de ce que vous cherchiez. J'espère que cela aide. – a2ndrade