如何列出所有用户创建的属性? [英] How can I list all user-created attributes?
问题描述
我试图找到所有用户创建的属性与下面的代码,它返回许多其他默认属性,如 db / unique
和 fressian /标签
。
我想得到一个没有他们的集合,所以我想知道是否有一个更好的方式来获得它比过滤出属性的前缀。 p>
感谢
(q {:find'[?ident]
:where'[[:db.part / db:db.install / attribute?p]
[?p:db / ident?ident]]} db)
或
datomic.db.Attribute)
(:elements(p / db)))
一种方法是白/黑列出要过滤或包含的命名空间。请注意,一些Datomic的内置属性和用户属性之间没有差别。您可以在任何系统命名空间中自由创建属性,例如 db.type
但是当然你不应该这样做。
说到这里,只有几个命名空间用于系统属性,所以你可以简单地过滤掉这些已知的命名空间。例如
(def system-ns#{dbdb.typedb.installdb.part
pre>
db.langfressiandb.uniquedb.excise
db.cardinalitydb.fn})
'[:find?e?ident
:in $?system-ns
:其中
[?e:db / ident?ident]
[(namespace?ident)? ns]
[((comp不包含?)?system-ns?ns]]]
(d / db conn)system-ns)
I tried to find all user-created attributes with the code below and it returns many other default attributes, like
db/unique
andfressian/tag
.I'd like to get a set without them, so I was wondering if there is a better way to get it than filtering out the attributes by their prefixes.
Thanks
(q {:find '[?ident] :where '[[:db.part/db :db.install/attribute ?p] [?p :db/ident ?ident]]} db)
or
(filter (partial instance? datomic.db.Attribute) (:elements (p/db)))
解决方案One way to do it is to white/black list the namespaces you want to filter out or include. Note there's no difference between some of Datomic's built-in attributes and user attributes. You can freely create attributes in any of the system namespaces e.g.
db.type
but of course you're not supposed to do it.Having said that, there's only a few namespaces used for system attributes so you could simply filter out those known namespaces. e.g.
(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)
这篇关于如何列出所有用户创建的属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!