clojure - db.part/db 的所有字段是什么意思?

标签 clojure datomic

我是 datomic 的新手,我仍在努力弄清楚系统是如何构建的。特别是,我不明白 :db.part/db 扮演什么角色,因为每次安装架构时似乎都需要它。有人可以解释一下这一切意味着什么吗?

(需要 '[datomic.api :as d])
(def uri "datomic:mem://sample")
(d/create-database uri)
(def conn (d/connect uri))

(pprint (seq (d/entity dbval :db.part/db)))

;; =>
;; ([:db/doc "系统分区的名称。系统分区包括datomic的核心,以及用户模式:类型定义、属性定义、分区定义和数据函数定义。"]
;; [:db.install/function #{:db.fn/cas :db.fn/retractEntity}]
;; [:db.install/属性
;; #{:db/noHistory :db.install/partition :db/cardinality
;; :db.install/attribute :db/index :db/unique :db/fulltext
;; :db/txInstant :db/lang :db/doc :db.install/valueType :db/code
;; :db/isComponent :db/fn :db.install/function :db/valueType :db/ident
;; :fressian/标签}]
;; [:db.install/valueType
;; #{:db.type/uuid :db.type/bigint :db.type/uri :db.type/ref
;; :db.type/keyword :db.type/bytes :db.type/string :db.type/instant
;; :db.type/fn :db.type/long :db.type/bigdec :db.type/boolean
;; :db.type/double :db.type/float}]
;; [:db.install/partition #{:db.part/db}]
;; [:db/ident :db.part/db])

最佳答案

:db.part/db是模式实体的分区(请参阅 partitions 上的模式文档)。这些 db.install 属性用于在某些实体的安装上触发 Hook 。他们断言 :db.part/db没有特别的意义(afaik),这只是 Datomic 团队选择的代表安装属性等的约定。

因此,例如,当您提交如下交易时:

[{:db/ident :person/name
  :db/cardinality :db.cardinality/one
  :db/valueType :db.type/string
  :db.install/_attribute :db.part/db
  :db/id #db/id[:db.part/db]}]

这相当于(现在在 Clojure 中而不是 edn 中):
(let [id (datomic.api/tempid :db.part/db)]
  [[:db/add id :db/ident :person/name]
   [:db/add id :db/cardinality :db.cardinality/one]
   [:db/add id :db/valueType :db.type/string]
   [:db/add :db.part/db :db.install/attribute id]])

然后 Datomic 通知您为 :db.part/db 添加了一个值的 :db.install/attribute ,验证您是否提供了属性所需的属性,并将新属性安装到数据库中,以便您可以在事务处理后使用它。

同样,您可以使用 :db.install/_partition :db.part/db安装新分区。请参阅 Installing an attribute definition 上的文档和 Creating new partitions .
:db.install/valueType有一天可以用来安装你自己的自定义值类型,但这个功能还没有准备好。 :db.install/function似乎是供内部使用。我不确定它的目的。记录到 install database functions 的方式是不同的。

这些属性(除了 :db.install/function )也方便查询和检查数据库。例如,我们可以拉出所有已安装值类型的集合,以防我们忘记:
user> (:db.install/valueType (datomic.api/entity db :db.part/db))
#{:db.type/uuid :db.type/bigint :db.type/uri :db.type/ref
  :db.type/keyword :db.type/bytes :db.type/string :db.type/instant
  :db.type/fn :db.type/long :db.type/bigdec :db.type/boolean
  :db.type/double :db.type/float}

或者我们可以编写对现有属性的查询:
user> (datomic.api/q '[:find ?ns (distinct ?attr) :where
                       [:db.part/db :db.install/attribute ?a]
                       [?a :db/ident ?attr]
                       [(namespace ?attr) ?ns]]
                     db)
[["db" #{:db/noHistory :db/cardinality :db/index :db/unique
         :db/fulltext :db/txInstant :db/lang :db/doc
         :db/code :db/isComponent :db/fn :db/valueType
         :db/ident}]
 ["db.install" #{:db.install/partition :db.install/attribute
                 :db.install/valueType :db.install/function}]
 ["fressian" #{:fressian/tag}]]

关于clojure - db.part/db 的所有字段是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14704604/

相关文章:

clojure - Clojure 函数中的参数

clojure - MiniKanren 有 "not"运算符吗?

clojure - 合并原子查询结果中的某些属性

recursion - Datomic 的递归数据日志查询真的很慢

clojure - 在 Clojure 中从字符串创建列表

vim - vim 已经足以编写 clojure 了吗?

css - 重复的花园语法

clojure - 在查询中使用 Datomic pull

algorithm - 为什么 Datomic 没有 EATV 索引?

datomic - 用基数更新值很多