2

对不起,如果我有点数学的话:

我有两个集合,X 和 Y,以及多对多关系ℜ⊆ X✗Y。

  • 对于所有 x ∈ X,令 xℜ = { y | (x,y) ∈ ℜ } ⊆ Y,Y 的子集与 x 关联 ℜ。
  • 对于所有 y ∈ Y,令 ℜy = { x | (x,y) ∈ ℜ } ⊆ X,X 的子集与 y 通过 ℜ 关联。

将查询定义为 Y 的一组子集,Q ⊆ ℘(Y)。

让查询的图像是 Q 中子集的并集:

图像(Q) = U q∈Q q

假设 X x 的一个元素满足查询 Q 如果对于所有 q ∈ Q,q ∩ xℜ ≠ ∅,即如果 Q 中的所有子集与 Y 的与 x 关联的子集重叠。

定义满足查询 Q 的元素 x 的证据,使得:

证据(x,Q) = xℜ ∩ 图像(Q)
也就是说,Y 中与 x 相关联并用于匹配 Q 的某些部分的部分。这可以用来验证 x 是否满足 Q。

我的问题是我应该如何存储我的关系 ℜ 以便我可以有效地报告哪些 x∈X 满足查询,并且最好报告满足的证据?

这种关系并不太大,因为 csv 它只有大约 6GB。我有几个想法,但都不是我特别满意的:

  1. 我可以存储 { (x, xℜ) | ∀ x∈X } 只是在一个平面文件中,然后做 O(|X||Q||Y|) 工作检查每个 x 以查看它是否满足查询。这可以并行化,但感觉不对。
  2. 我可以将ℜ存储在以 Y 为索引的数据库表中,检索 { (y, ℜy) | ∀ y∈image(Q) },然后将其反转得到 { (x, evidence(x,Q)) | ∀ x st evidence(x,Q) ≠ ∅ },然后仅检查以找到满足 Q 的 x 和证据。这似乎好一点,但我觉得自己倒置它可能会做一些我可以要求我的 RDBMS 做的事情。

我怎么能做得更好?

4

1 回答 1

1

我认为#2是要走的路。此外,如果 Q 可以在 CNF 中表示,您可以使用多个查询加上 INTERSECT 来让 RDBMS 完成一些繁重的工作。(与 DNF 和 UNION 类似。)

这看起来也有点像您想要一些 RDBMS 支持的“反向索引”。X = 文档集,Y = 词集,q = 匹配 glob "a*c" 的词集。

高温高压

于 2013-04-24T04:01:19.137 回答