clojure - 如何在 Datomic 中收回属性?

标签 clojure datomic

我在 Datomic 模式中创建了一组属性。它们的 :db/idents 分为三个命名空间::name、:tree、:node。现在我想删除所有这些并重新开始。我已找到所有必需的属性:

(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

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

谢谢!

最佳答案

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

请注意,您可以重命名属性,但它仍然保留其旧标识作为同义词,除非您将其重新用于其他用途。

关于clojure - 如何在 Datomic 中收回属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25684750/

相关文章:

clojure - 如何在 Clojure 和 ClojureScript 之间共享协议(protocol)

clojure - 带父指针的纯函数树

scalability - 数据原子和写入可扩展性

join - Datomic - 没有引用的实体之间的连接

database - 底层数据库 datomic 是在什么地方实现的?

Clojure:前置后置函数

clojure - 相当于Clojure中的reduce,它的函数有3个参数?

clojure - 启用-如果属性具有指定值,则提取标签的内容

datomic - 数据数据库的第一次查询

clojure - 有没有一种规范的方法可以从特定的原子命名空间中获取所有标识?