我正在尝试在我的数据库中设置标记系统,我添加了两个属性来处理这个问题:
{:db/ident :metadata/tags
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db/isComponent true}
{:db/ident :metadata/tag
:db/valueType :db.type/keyword
:db/cardinality :db.cardinality/one
:db/index true}
这在分配标签方面或多或少起作用,但是我在过滤标签时遇到了一些问题。我认为这样做时,我假设我能够以一种身份的方式引用标签,作为关键字,例如:tag1
. 但事实证明它更具挑战性。
我的第一种方法是使用查询过滤器表达式,如下所示(非工作尝试):
'[:find (pull ?doc [*])
:in $ ?tags
:where [?doc :arb/metadata ?meta]
[?doc :metadata/tags ?tagset]
[(every? (set ?tags) ?tagset)]]
其中 :tags 是提供的标签关键字列表,例如[:tag1 :tag2 ...]
. 但是拉取的结果在这里并不完全有效,因为对于每个标签,拉取都会返回一个地图,其中包括:db/id
标签以及标签,例如:
[#:arb{:metadata
[{:db/id 17592186045497,
:metadata/tags
[{:db/id 17592186045498, :metadata/tag :tag1}
{:db/id 17592186045499, :metadata/tag :tag2}],
我认为我仍然可以通过映射?tagset
来仅提取标签关键字来处理这个问题,但是在映射表达式中,'?tagset` 最终超出了范围。所以我对如何解决这个问题有点困惑,我觉得这一定有点普遍......有什么建议吗?