2

我有一堆包含公司名称的记录,我希望进行查询以查找所有重复项。如何才能做到这一点?

{:business/name "<>"}
4

1 回答 1

4

如果您尝试对属性值强制执行唯一性,则应该查看:db/unique 架构属性

要查找重复值及其重复频率,请使用:

(->> (d/datoms db :aevt :business/name)
   (map :v)
   (frequencies)
   (filter #(> (second %) 1)))

它使用datomic.api/datomsAPI 访问原始 AEVT 索引以流式传输:business/name属性值、计算它们的频率并根据某些标准(即不止一次出现)过滤它们。您还可以使用数据记录和聚合函数实现相同的结果:

(->> (d/q '[:find (frequencies ?v)
      :with ?e
      :in $ ?a
      :where [?e ?a ?v]]
    db :business/name)
 (ffirst)
 (filter #(> (second %) 1)))

要查找具有重复属性值的实体,请使用:

(->> (d/datoms db :aevt :business/name)
   (group-by :v)
   (filter #(> (count (second %)) 1))
   (mapcat second)
   (map :e))

它还利用d/datomsAPI 来完成它。有关完整的代码示例,包括数据记录实现,请参阅https://gist.github.com/a2ndrade/5641681

于 2013-05-24T08:42:34.127 回答