3

我尝试使用下面的代码查找所有用户创建的属性,它返回许多其他默认属性,例如db/uniquefressian/tag.

我想得到一个没有它们的集合,所以我想知道是否有比通过前缀过滤属性更好的方法来获取它。

谢谢

(q {:find '[?ident]
    :where '[[:db.part/db :db.install/attribute ?p]
             [?p :db/ident ?ident]]} db)

或者

(filter (partial instance? datomic.db.Attribute)
      (:elements (p/db)))
4

3 回答 3

6

一种方法是将要过滤或包含的命名空间列入白名单/黑名单。请注意,Datomic 的一些内置属性和用户属性之间没有区别。您可以在任何系统名称空间中自由创建属性,例如db.type,但您当然不应该这样做。

话虽如此,只有少数命名空间用于系统属性,因此您可以简单地过滤掉那些已知的命名空间。例如

(def system-ns #{"db" "db.type" "db.install" "db.part" 
                 "db.lang" "fressian" "db.unique" "db.excise" 
                 "db.cardinality" "db.fn"})

(d/q '[:find ?e ?ident
   :in $ ?system-ns
   :where
   [?e :db/ident ?ident]
   [(namespace ?ident) ?ns]
   [((comp not contains?) ?system-ns ?ns)]]
 (d/db conn) system-ns)
于 2013-08-16T21:55:50.343 回答
1

这就是我最终这样做的方式:

(defn get-user-schema [db]
  (->> (d/q '[:find ?e
              :where
              [?e :db/ident ?ident]
              [(namespace ?ident) ?ns]
              (not (or [(contains? #{"db" "fressian"} ?ns)]
                       [(.startsWith ?ns "db.")]))]
            db)
       (map #(->> % first (d/entity db) d/touch (into {})))))
于 2019-10-12T18:20:27.173 回答
0

显示用户定义的属性:

(clojure.pprint/print-table (->> (d/pull db '{:eid 0 :selector [{:db.install/attribute [*]}]})
                                 :db.install/attribute
                                 (remove (fn [m] (or (clojure.string/starts-with? (namespace (:db/ident m)) "db") (clojure.string/starts-with? (namespace (:db/ident m)) "fressian"))))
                                 (map #(update % :db/valueType :db/ident))
                                 (map #(update % :db/cardinality :db/ident))
                                 (sort-by :db/ident)))

(改编自get-schema这里的函数:Datomicion-starter - GitHub

输出:

| :db/id |    :db/ident |    :db/valueType |      :db/cardinality |
|--------+--------------+------------------+----------------------|
|     74 |   :inv/color | :db.type/keyword |  :db.cardinality/one |
|     80 |   :inv/count |    :db.type/long |  :db.cardinality/one |
|     75 |    :inv/size | :db.type/keyword |  :db.cardinality/one |
|     73 |     :inv/sku |  :db.type/string |  :db.cardinality/one |
|     76 |    :inv/type | :db.type/keyword |  :db.cardinality/one |
|     79 |  :item/count |    :db.type/long |  :db.cardinality/one |
|     78 |     :item/id |     :db.type/ref |  :db.cardinality/one |
|     77 | :order/items |     :db.type/ref | :db.cardinality/many |
于 2021-05-11T22:02:13.170 回答