2016-12-01 3 views

Répondre

2

L'expression d'extraction de données prend en charge la navigation par attribut inverse. En supposant que votre schéma est comme ceci:

(d/transact conn [{:db/id     (d/tempid :db.part/db) 
        :db/ident    :node/children 
        :db/valueType   :db.type/ref 
        :db/cardinality  :db.cardinality/many 
        :db.install/_attribute :db.part/db}]) 

Pour créer un arbre:

(defn node [name & children] 
    (cond-> {:db/id (d/tempid :db.part/user) 
      :db/doc name} 
    children (assoc :node/children children))) 

(d/transact conn [(node "L1" 
         (node "L1.1" 
           (node "L1.1.1") 
           (node "L1.1.2")) 
         (node "L1.2" 
           (node "L1.2.1")))]) 

Utilisez requête pour tirer les parents des composants récursive (notez le "_children"):

(d/q '[:find (pull ?e [:db/doc {:node/_children ...}]) . 
     :where [?e :db/doc "L1.2.1"]] 
    (d/db conn)) 

=> {: db/doc "L1.2.1",: noeud/_children [{: db/doc "L1.2",: noeud/_children [{: db/doc "L1"}]}]}

+0

Merci pour ta réponse. Est-ce seulement possible si les enfants sont du même type Entité? Si vous avez différents types à travers votre imbrication devez-vous avoir plusieurs tirages imbriqués? – stuartrexking

+0

Datomic n'impose pas le concept de "type" (comme table dans la base de données relationnelle). Tant que le même attribut relationnel existe (: node/children dans le cas), la syntaxe récursive avec toutes les entités liées (ou jusqu'à un niveau si vous l'avez indiqué). – rmcv

+0

Merci. J'ai ajouté un exemple de ce qui a fonctionné pour moi en fonction de votre réponse et de votre commentaire. – stuartrexking