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/datomsまた、 API を活用してそれを実現します。データログの実装を含む完全なコード サンプルについては、https: //gist.github.com/a2ndrade/5641681 を参照してください。

于 2013-05-24T08:42:34.127 に答える