Unification Algorithm の解説#

graph_unify_loop_0#

初期状態の graph が以下になる。

_images/graph_unify_loop_02.png

Fig. 34 graph_unify_loop_0#

graph_unify_loop_0 テーブルの作成方法#

WF 内の +extract_and_merge タスクにて、graph_unify_loop_0 テーブルが作成されるが、どのようにして graph が作成されるのかを見ていこう。

canonical_ids:
  - name: person_id
    merge_by_keys: [email, td_ssc_id, td_client_id, td_global_id]    
    merge_iterations: 5

今回、canonical_ids: の設定における merge_by_keys: では、できるだけ普遍な canonical_id が生成されるように、email を最も優先度高くし、その次に td_ssc_id としている。

元のデータに対して、前章と同じのステップで graph_unify_loop_0 テーブルを生成する。

_images/5-1-2.png

Fig. 35 graph_unify_loop_0 テーブルの作成方法#

前回と異なるのは、1つのテーブルに3つ以上のkeyが存在する site_aaa のペアの作られ方である。この時、1つのレコードに対して leader と follower は

  • leader:

    • td_ssc_id

  • follower:

    • td_client_id

    • td_global_id

    • td_ssc_id

となるため、follower ごとにペアを作るため、3つのレコードに展開されることになる。(上図の緑色の箇所)

follower_ns, leader_ns はそれぞれの id がどの key なのかを特定する。 (今回の例では1なら td_client_id、2なら td_global_id、3なら td_ssc_id, 4なら email となる。) 今回の設定では、ns が [4,3,1,2] の順で優先度が高いことになる。

graph_unify_loop_1#

loop_0 の graph を基に、以下のルールに基づいて leader を更新していく。

_images/5-2-2.png

Fig. 36 graph_unify_loop_1 における leader の更新方法1#

前回と異なるのは、

  • ある leader がより優先度の高い leader に接続している場合には、follower に隣接している同じ優先度の leader よりも率先して入れ替わることになる

ところである。

全ての leader に対して、new_leader への置き換え (もちろん自身が最小または最高優先度であれば置き換えられない) を行い、全てをマージしたテーブルが graph_unify_loop_1 テーブルとなる。

_images/5-3-1.png

Fig. 37 graph_unify_loop_1 における leader の更新方法2#

_images/graph_unify_loop_13.png

Fig. 38 graph_unify_loop_1#

以後のループは (前回のループの graph に対して) この繰り返しである。

graph_unify_loop_2#

_images/graph_unify_loop_22.png

Fig. 39 graph_unify_loop_2#

graph_unify_loop_3#

3回目のループで収束することになる。

_images/graph_unify_loop_32.png

Fig. 40 graph_unify_loop_3#