2016-12-01 73 views

回答

2

Datomic pull表达式支持反向属性导航。假设你的模式是这样的:

(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}]) 

要创建树:

(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")))]) 

使用查询拉组件父母递归(注意 “_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”,:node/_children [{:db/doc“L1.2”,:node/_children [{:db/doc“L1”}]}]}

+0

为你的答案。这只有在儿童具有相同实体类型时才有可能?如果你在嵌套中有不同的类型,你需要有多个嵌套的pulls? – stuartrexking

+0

Datomic不强加“类型”的概念(如关系数据库中的表)。只要存在相同的关系属性(在本例中为node/children),递归语法就会将所有相关实体拉出(或者如果您指出了这一点,则达到某个级别)。 – rmcv

+0

谢谢。根据你的回答和评论,我添加了一个适用于我的例子。 – stuartrexking

相关问题