10

この質問に似ています:clojureの内部結合

いずれかのClojureライブラリのマップのコレクションに対して実行される外部結合(左、右、および完全)の関数はありますか?

のコードを変更することで実行できると思いますがclojure.set/join、これは十分に一般的な要件のように思われるため、すでに存在するかどうかを確認する価値があります。

このようなもの:

(def s1 #{{:a 1, :b 2, :c 3}
          {:a 2, :b 2}})

(def s2 #{{:a 2, :b 3, :c 5}
          {:a 3, :b 8}})


;=> (full-join s1 s2 {:a :a})
;
;   #{{:a 1, :b 2, :c 3}
;     {:a 2, :b 3, :c 5}
;     {:a 3, :b 8}}

nilまた、左右の外部結合に適切な機能。つまり、左側、右側、または両側に結合キーの値(または値)がないエントリを含みます。

4

1 に答える 1

5

( Full Disclojureで有名な) Sean Devlin のtable-utilsには、次の結合タイプがあります。

  • 内部結合
  • 左外部結合
  • 右外部結合
  • 全外部結合
  • 自然結合
  • 交差結合

しばらく更新されていませんが、1.3、1.4、1.5 で動作します。外部依存なしで動作させるには:

  • fn-tupleと置き換えますjuxt
  • (:use )ns 宣言の節全体を次のように置き換えます(require [clojure.set :refer [intersection union]])
  • 以下から関数 map-vals を追加します。

また

(defn map-vals
  [f coll]
  (into {} (map (fn [[k v]] {k (f v)}) coll)))

またはClojure 1.5以降の場合

(defn map-vals
  [f coll]
  (reduce-kv (fn [acc k v] (assoc acc k (f v))) {} coll))

ライブラリの使用法は、結合タイプ、2 つのコレクション (上記の例のようなマップの 2 つのセット、または 2 つの SQL 結果セット) と、少なくとも 1 つの結合 fn です。キーワードはマップ上の関数であるため、通常は結合キーのみで十分です。

=> (full-outer-join s1 s2 :a :a)
   ({:a 1, :c 3, :b 2}
    {:a 2, :c 5, :b 3}
    {:b 8, :a 3})

私の記憶が正しければ、Sean は少し前に table-utils を contrib に入れようとしましたが、うまくいきませんでした。残念なことに、独自のプロジェクト (github/clojars 上) を取得できませんでした。時々、このようなライブラリに関する質問が Stackoverflow または Clojure の Google グループに寄せられます。

もう 1 つのオプションは、datomic から clojure データ構造をクエリするためのデータログ ライブラリを使用することです。Stuart Halloway の gists にいくつかの があります。

于 2012-10-23T13:51:56.173 に答える