无法在datomic db中实现标记

时间:2017-07-08 19:22:55

标签: clojure datomic datalog

我正在尝试在我的数据库中设置标记系统,我添加了两个attrs来处理这个问题:

{: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 ...]。但拉动的结果在这里并不常用,因为对于每个标签,pull会返回一个包含:db/id以及标签的地图,例如:

[#:arb{:metadata
    [{:db/id 17592186045497,
      :metadata/tags
      [{:db/id 17592186045498, :metadata/tag :tag1}
       {:db/id 17592186045499, :metadata/tag :tag2}],

我认为我仍然可以通过映射?tagset来提取标签关键字,但在地图表达式'?tagset`内部最终超出范围。所以我对如何解决这个问题感到有点难过,我觉得这个问题一定很常见......有什么提示吗?

0 个答案:

没有答案