2014-09-05 2 views
4

나는 Datomic 스키마에 일련의 속성을 만들었습니다. 그들의 : db/idents는 : name, : tree, : node라는 세 개의 네임 스페이스로 그룹화됩니다. 이제 나는이 모든 것을 지우고 신선한 것을 시작하고 싶다. Datomic에서 속성을 철회하는 방법?

(def results 
    (q '[:find ?e 
     :where [?e :db/ident ?v] 
       [(namespace ?v) ?res] 
       [(contains? #{"task", "node", "tree"} ?res)] 
    ] 
    (db conn))) 

그런 다음 retractEntity 문장의 집합 생성 :

(def retract-statements 
    (into [] (map #(vector :db.fn/retractEntity (first %1)) results))) 

을 지금은 트랜잭션 호출하려고 해요 :

@(d/transact conn [retract-statements]) 

를 내가 필요한 모든 속성을 발견했습니다 그것은 나를 준다 : : db.error/invalid-attribute 스키마 변경은 db.install/attribute 또는 : db.alter/attribute 다음에 와야한다.

분명히 뭔가 잘못하고 있습니다. 누군가 제발 도와 줄 수 있니?

감사합니다.

+0

벡터가 너무 많이 중첩되어 있습니까? retract-statements는 이미 벡터의 벡터이기 때문에'@ (d/transact conn [retract-statements]) 대신 '@ (d/transact conn retract-statements)'를 수행해야합니까? 그냥 생각했는데 ... –

+1

방금 ​​(delete-database uri)와 (create-database uri)를 사용했습니다. 속성을 철회 할 수있는 방법이 없다 - 모든 속성을 없애는 유일한 방법은 이름을 바꾸는 것입니다. 그 말이 맞습니까? – siphiuel

+1

네가 맞다고 생각한다. https://groups.google.com/forum/#!msg/datomic/7-9lUE9Nm4k/fOhAvt-gyOIJ –

답변

6

Datomic에서 속성을 직접 철회 할 수있는 방법이 없습니다. 일단 속성을 설치하면 전체 데이터베이스를 삭제하지 않으면 영원히 사라집니다. Datomic (절제의 특별한 경우 제외)이 실제로 모든 데이터를 절대로 삭제하지 않는다는 점을 감안할 때 이는 의미가 있습니다. 실제로 속성을 제거 할 수 있다면 원래 이러한 속성에 대해 처리 된 데이터는 검색 할 수 없습니다.

수 있습니다. 속성의 이름을 바꾸지 만 다른 용도로 사용하지 않는 한 이전 ID도 동의어로 유지된다는 점에 유의하십시오.