2014-09-05 11 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 /无效的属性架构的变化必须遵循的:db.install /属性或:db.alter /属性

显然我做错了什么。有人可以帮忙吗?

谢谢!

+0

你的载体嵌套太多了吗?您是否需要执行'@(d/transact conn retract-statements)',而不是'@(d/transact conn [retract-statements]) - 因为缩进语句已经是向量的向量。只是一个想法... – 2014-09-05 11:51:58

+1

我刚刚使用(delete-database uri)和(create-database uri),这对我的目的来说是完美的。似乎没有办法收回属性 - 看来摆脱所有属性的唯一可行方法是重命名。这是一个正确的说法吗? – siphiuel 2014-09-05 12:10:28

+1

是的,我认为你是正确的https://groups.google.com/forum/#!msg/datomic/7-9lUE9Nm4k/fOhAvt-gyOIJ – 2014-09-05 12:12:44

回答

6

无法直接撤回Datomic中的属性。一旦你安装了一个属性,它会一直存在,除非你删除整个数据库。这是有道理的,因为Datomic(除了特殊情况下的删除)从未真正删除任何数据 - 如果您实际上可以删除属性,那么最初针对这些属性进行处理的数据将不可检索。

请注意,您可以重命名属性,但它仍然保留其旧同义词作为同义词,除非您重新使用它的别的东西。