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"}]}]}
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
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
Merci. J'ai ajouté un exemple de ce qui a fonctionné pour moi en fonction de votre réponse et de votre commentaire. – stuartrexking