我有一堆包含公司名称的记录,我希望进行查询以查找所有重复项。如何才能做到这一点?
{:business/name "<>"}
如果您尝试对属性值强制执行唯一性,则应该查看:db/unique
架构属性。
要查找重复值及其重复频率,请使用:
(->> (d/datoms db :aevt :business/name)
(map :v)
(frequencies)
(filter #(> (second %) 1)))
它使用datomic.api/datoms
API 访问原始 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/datoms
API 来完成它。有关完整的代码示例,包括数据记录实现,请参阅https://gist.github.com/a2ndrade/5641681