少し数学を理解できたらすみません:
X と Y の2 つのセットと、多対多の関係ℜ ⊆ X✗Y があります。
- すべての x ∈ X に対して、xℜ = { y | (x,y) ∈ ℜ } ⊆ Y、ℜ によって x に関連付けられた Y のサブセット。
- すべての y ∈ Y について、ℜy = { x | (x,y) ∈ ℜ } ⊆ X、ℜ によって y に関連付けられた X のサブセット。
クエリを Y, Q ⊆ ℘(Y) のサブセットのセットとして定義します。
クエリのイメージを Q のサブセットの結合とします。
image(Q) = U q∈Q qすべての q ∈ Q について q ∩ xℜ ≠ ∅ である場合、つまり、Q のすべてのサブセットが x に関連付けられた Y のサブセットと重複する場合、X x の要素がクエリ Q を満たすとします。
次のようなクエリ Q の要素 x の満足の証拠を定義します。
証拠(x,Q) = xℜ ∩ 画像(Q)つまり、x に関連付けられ、Q の一部と一致するために使用された Y の部分です。これは、x が Q を満たすかどうかを検証するために使用できます。
私の質問は、クエリを満たす x∈X を効率的に報告し、できれば満足の証拠を報告できるように、関係 ℜ をどのように保存すればよいかということです。
csvは約6GBしかないので、関係はそれほど大きくありません。いくつかのアイデアがありますが、どちらも特に満足していません。
- { (x, xℜ) | ∀ x∈X } をフラット ファイルで実行すると、O(|X||Q||Y|) が各 x をチェックして、クエリを満たすかどうかを確認します。これは並列化できますが、間違っているように感じます。
- Y でインデックス付けされた DB テーブルに ℜ を格納し、{ (y, ℜy) | を取得できます。∀ y∈image(Q) }、次にそれを反転して { (x, 証拠(x,Q)) | を取得します。∀ x stevidence(x,Q) ≠ ∅ } ならば、それをチェックして、Q と証拠を満たす x を見つけます。これは少し良いように思えますが、自分で逆にすることで、RDBMS に依頼できることを行うことができるように感じます。
どうすればこれをより良く行うことができますか?