2016-12-01 4 views

답변

2

데이터 풀 식은 역방향 속성 탐색을 지원합니다. 스키마를 가정하면 다음과 같이이다 : (이하 "_children"를 참고) 재귀 적 구성 요소의 부모를 뽑아

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

를 사용하여 쿼리 :

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

트리를 만들려면

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

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

+0

당신의 대답을 위해. 자식이 같은 엔티티 형인 경우에만 가능합니까? 중첩 전체에 다른 유형이있는 경우 여러 중첩 된 당김이 필요합니까? – stuartrexking

+0

Datomic은 "유형"(관계형 데이터베이스의 테이블과 같은) 개념을 부과하지 않습니다. 동일한 관계형 속성이 존재하는 한 (: 노드/자식 경우), 재귀 구문은 모든 관련 엔티티를 제거합니다 (또는 그렇게 지정한 경우 레벨까지). – rmcv

+0

감사합니다. 나는 당신의 대답과 논평에 기초하여 나를 위해 일한 것을 보여 주었다. – stuartrexking