2016-12-01 69 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

相關問題