system: [SYSTEM]

user: 4. 映射优化 本节将详细描述交互式映射设计方法的关键部分首先是预处理，其目的是将一个看起来非常庞大的tgd划分为一组逻辑上等效的较小的tgd (本文称之为标准映射)。其次是通过原子优化和连接优化对标准映射进行改进从而简化tgds的左侧。后续本文将在一小节详细解释第一步、二小节详细介绍本文所研究系统的两个核心步骤、而映射优化相关的算法将在三、四小节进行详细的描述。 4.1. 规则的预处理 为了便于后续对规则的优化处理，将初始的映射规则分割为较小的规范化的tgd，这对于映射优化是很有必要的。因为它可以让映射设计人员只关注每个简化的tgd左边所隐含的必要原子。同时本小节还结合前面提到的split-reduced mappings和σ-redundant mappings的概念提出了一个评价映射好坏的标准定义，即每一个在Σ中的tgd都应该具有最小的右边并且在Σ中没有冗余的tgd。 然而在对规则进行分解的时候，我们可能会在集合Σ中得到冗余的tgds。这些冗余的tgd是不必要的，需要删除它们以避免后面系统与映射设计人员无用的交互。最后，我们说(S，T，Σ)是规范化的，当且仅当每一个在Σ中的tgd是split-reduced并且在Σ中没有冗余的tgd。结合前面的实例具体的预处理过程如下： 假设φ = LAT(Idin 1 ， Idin 2 ， Idli) Ù LT(Idli， Name， L) ÙDT(Idk 1 ， Name'， L) Ù BT(Idin 1 ， St 1 ， L， Idk 1 ) ÙBT(Idin 2 ， St 2 ， L'， Idk 1 ) 由以上定义可以导出Σnorm = { φ→$idS 0 ， T3(idS 0 ， Name， L) (1) φ→$idS 1 ， T1(St 1 ， Idin 1 ， idS 1 ) Ù T3(idS 1 ， Name'， L) (2) φ→$idS 3 ， T2(L， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L) (3) φ→$idS 2 ， T1(St 2 ， Idin 2 ， idS 2 ) Ù T3(idS 2 ， Name'， L) (4) φ→$idS 4 ， T2(L'， Idin 2 ， idS 4 ) Ù T3(idS 4 ， Name'， L) (5) } 4.2. 交互式映射设计执行过程 上一小节定义了生成规范化映射的预处理步骤。本小节将介绍交互式映射框架的两个核心优化步骤。首先，本文方法所基于的假设是非专家用户提供一对具体实例(E S ， E T )，其中E T 不是通用解决方案。其次，对由以上实例导出的初始映射规则进行规范化处理。最后，在映射优化步骤中通过与用户进行简单的布尔交互从而得出最终的映射规则集。但同时我们也注意到对于给定的输入对(E S ， E T )，满足它的映射的数量可能很庞大。因此，要想提高本文所述框架的效率，最重要的是提供有效的映射空间探索策略，以减少向系统与用户的交互次数。在本节的其余部分中为了便于说明，本文假设用户只提供了一对范例元组(E S ， E T ))。但是在实际的映射场景中，用户更可能提供的是一组小的实例，例如 ( E S 1 ， E T 1 ) ， ⋯ ， ( E S n ， E T n ) 。由于系统每次向用户提出的问题都集中在一个tgd上，并且由于我们不假定每个( E S j ， E T j )中的E T 都是通用解决方案，因此本文的方法完全适用于实例对的集合。结合上面的阐述这里正式的定义交互式映射设计的具体过程： a. 首先计算和每对( E S j ， E T j )相关的初始映射规则σ i ； b. 将上一步的每个σ i 分解为 Σ norm i ； c. 删除上述结果中冗余的tgds； d. 对上一步的结果集中的每个 Σ norm i 执行原子优化和连接优化。 4.3. 原子优化 正如4.1节中所讨论的，规则预处理就是将初始映射规则集转换为符合split-reduced定义的映射规则集，其中每个tgd的左边都包含多个原子，如φ。然而就实际的映射场景而言，φ中的一些原子可能是多余的并且还可能进一步导致歧义。为了缓和以上歧义和简化规则，本文以前人的研究结果为基础提出如下算法： 这里首先对上述算法1进行简单介绍，更详细的讲解将在下面小节通过具体的例子来说明。首先上述算法第4行根据每个待优化的tgd的左边原子构造候选映射空间，其次算法1第6到15行递归地遍历候选映射空间直到该空间不存在任何原子，最后再将每个优化后的tgd存储到Σ' (16~17行)。 4.3.1. 原子优化中树的应用 算法1采用类树的数据结构来处理数据主要是基于树是一种非线性的数据结构其叶子节点可以存储各种类型的数据元素，并且算法1需要处理的数据类型也并非常规的数据类型。 例1. 考虑4.1节中Σnorm中的规则集，可以看出它们都具有同一个特征那就是具有相同的左边即集合{LAT(Idin 1 ， Idin 2 ， Idli)；LT(Idli， Name， L)；DT(Idk 1 ， Name'， L)；BT(Idin 1 ， St 1 ， L， Idk 1 )；BT(Idin 2 ， St 2 ， L'， Idk 1 )}，对于Σnorm中的每条规则来说以上原子的集合的子集，即为需要探索的全部映射空间同时也代表了树的叶子节点。 接下来将以树为数据载体结合4.1节中的规则3来解释算法1中的第4行代码是如何构造出一棵完整的候选映射空间树的，当然对于4.1节Σnorm中的其它规则来说也有类似处理过程。首先，通过观察我们可以注意到Σnorm中的规则3的右边的是形如∃idS 3 ，T2(L， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L)这样的逻辑表达式，并且其中的原子T2和T3所包含的全部普通变量的集合为{L， Idin 1 ， Name'}。 其次，一个优化后的tgd必须满足一个基本条件，即其左边应该至少包含以上普通变量，就例1中给出的原子的集合来说，假设满足以上条件的最小的子集为如下两个集合： {BT(Idin 1 ， St 1 ， L， Idk 1 )，DT(Idk 1 ， Name'， L)}和{LAT(Idin 1 ， Idin 2 ， Idli)，DT(Idk 1 ， Name'， L)}并且所有不是以上任意一个集合的超集的集合都将被剪枝。 最后综合上述原理构造出的候选映射空间树图1所示： 图1. 例1和例2的候选映射空间树 以上空间树中的原子集：LAT = LAT(Idin 1 ， Idin 2 ， Idli)， LT= LT(Idli， Name， L)， DT = DT(Idk 1 ， Name'， L)， BT 1 = BT(Idin 1 ， St 1 ， L， Idk 1 )，BT 2 = BT(Idin 2 ， St 2 ， L'， Idk 1 ) 4.3.2. 候选映射空间树的遍历 在探索可能的映射空间(也就是对映射空间树进行遍历)的过程中，每经过一个叶子结点系统都会和非专家用户进行一次交互(算法1第8行)，同时选择叶子结点的方式将由算法1的第7行给出的探索策略决定。 例2. 假设这里采用自顶向下宽度优先的探索策略对图1的映射空间树进行遍历。显然依据上一节的描述对图1的遍历就是对4.1节中的规则3进行优化，具体的优化过程如下： 首先当遍历节点{BT 1 ; DT}的时候，系统对用户提出如下问题： “通过BT(1Z#，已发证，沈阳市和平区，K1)和DT(k1，沈阳万科中山置业有限公司，沈阳市和平区)能否导出T2(沈阳市和平区，1Z#，a3)和T3(a3，沈阳万科中山置业有限公司，沈阳市和平区)?”假如用户对这个问题回答为能，那么{BT 1 ; DT}的所有超集都将会被剪枝(也就是图1中的蓝色节点)。系统随后将输出如下规则： BT(Idin 1 ， St 1 ， L， Idk 1 ) Ù DT(Idk 1 ， Name'， L) → $idS 3 ， T2(L， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L) (6) 接下来就是遍历节点{LAT; DT}，此时系统对用户提出如下问题： “通过LAT(1Z#，2016-001，16357)和DT(k1，沈阳万科中山置业有限公司，沈阳市和平区)能否导出T2(沈阳市和平区，1Z#，a3)和T3(a3，沈阳万科中山置业有限公司，沈阳市和平区)?”用户很可能对这个问题回答不能，因为这里存在一定的歧义，即开发商的总部地址必须和其负责开发的楼盘里面的具体住宅楼栋地址相同，显然这样的约束与现实的情况并不相同。 再接下来系统会继续遍历其下层的叶子节点，也就是集合{LAT; DT; LT}和{LAT; DT; BT 2 }。针对这两个集合系统与用户最终的交互结果都是不能，最后对于集合{LAT; DT; LT; BT 2 }采用同样的交互流程所得到的结果显然还是不能。最后算法1将输出最终的结果(6)。 4.4. 连接优化 在关系数据库中，相同值的多次出现并不一定意味着包含该值的属性之间存在相关的语义关系。本文的运行场景中的一个例子是常量“沈阳市和平区”的出现。它既是楼盘项目所在地也是开发商总部所在地，同时还是具体的住宅楼栋所在地。然而，初始映射规则强化了这种可能由于虚假使用同一变量而导致的以上共存现象。因此，初始映射规则可能会在tgds的左侧引入不相关的连接。要想最终生成既满足用户心中所想又没有歧义的相对完美的映射，我们首先需要从这些不相关的连接中区分相关的连接。在正式介绍连接优化之前不得不先引用两个数学概念： 集合的覆盖：若把一个集合A划分成若干叫做块的非空子集使得A中的每个元素至少属于一个分块，则这些分块的全体叫做A的一个覆盖。 集合的划分：给定一个集合A的一个覆盖S，若A中的每个元素属于且仅属于S的一个分块。则将这样的S称作A的一个划分。 在以上概念的基础之上本文又给出了如下两个简单的定义： 定义1：假设集合A的一个划分被表示为P，那么表达式： a ≡ P b 指示集合A中的任意两个不同的元素在一个划分P的同一个块中。 定义2：在定义1的基础上定义偏序 P 0 ≤ P 1 ⇔ ∀ x ， y ∈ A ， ( x ≡ P 0 y ⇒ x ≡ P 1 y ) 。 在数据库的连接查询中，连接通常由变量的多次出现来编码，我们将这些多次重复出现的变量称为连接变量。连接优化的主要原理就是用新的变量取代那些旧的被误用的变量以此来排除不相关的连接。综合以上背景和实际的房地产项目需要本文提出如下算法： 上述算法2的简要执行步骤如下： 1) 对将要进行连接优化的规则初始化为标准的一阶逻辑表达式： φ ( X ¯ ) → ∃ Y ¯ ， ψ ( X ¯ ， Y ¯ ) (算法第3行)。 2) 对每一个属于 x ¯ 的普通变量，只要其满足在φ中的出现次数大于2就对包含该变量的连接进行优化，直到遍历完所有在 X ¯ 的普通变量(5~11行)。 3) 最后就是将结果赋值给Σ'并进行返回(12~15行)。 接下来本文将结合具体的例子进一步解释以上算法的详细执行过程考虑如下例子： 例3. 回顾例2的tgd(6)如下： BT(Idin 1 ， St 1 ， L， Idk 1 ) Ù DT(Idk 1 ， Name'， L) → ∃idS 3 ， T2(L， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L) 通过观察以上tgd可以很容易注意到它存在歧义，那就是在变量L的使用上即它既代表楼盘项目所在地也代表开发商总部所在地，同时还代表具体的住宅楼栋所在地。之所以出现这样的歧义是因为变量L的多次重复使用而造成的。算法2中第9行所包含的子程序VarJoinsRefinemen就完美的解决了这样的歧义。具体的伪代码如下所示： 在介绍算法3的执行原理之前，需要先介绍与之相关的两个定义具体如下： 定义1：合格的划分P 考虑前文例2中的tgd(6)：BT(Idin 1 ， St 1 ， L， Idk 1 ) Ù DT(Idk 1 ， Name'， L) → $idS 3 ， T2(L， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L)，将其中的变量L根据其在规则中多次出现的位置分别用新的变量取代(即L 1 ，L 2 ，L 3 ，L 4 )得到如下规则： BT(Idin 1 ， St 1 ， L 1 ， Idk 1 ) Ù DT(Idk 1 ， Name'， L 2 ) →∃idS 3 ， T2(L 3 ， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L 4 ) 由于本文不考虑在tgd中引入新的存在量词，因此每个出现在ψ中的变量都必须满足至少与一个出现在φ中的变量相绑定。如划分{{L 1 ; L 2 }; {L 3 ; L 4 }}为变量L的一个合格的划分，划分{{L 3 }; {L 1 ; L 2 ; L 4 }}为不合格的划分。综上更正式的定义如下： 考虑一个形如 σ = φ → ψ 的tgd，存在一个变量 x ∈ φ ∪ ψ 且在该tgd中多次出现。我们将变量x的所有划分集合里面，那些满足其所有块里面都至少包含一个在φ中的变量的划分称为一个合格的划分。 定义2：数据的存储结构 算法3和算法1一样同样采用类树的结构来存储数据，唯一不同的就是剪枝叶子节点的理论标准不一样。算法3的主要灵感来自于集合的划分，即给出任意两个不同的划分P和P'，如果P ≤ P'且P是一个合格的划分，那么P'也是一个合格的划分。这些合格的划分的不同的集合构成了树的不同节点最终构成了算法3的探索空间。 接下来本文正式开始讲解算法3： 1) 对每个出现在s中的x都使用一个新的变量去取代它，从而产生σ' (算法第1行)。 2) 参照上面的定义1和定义2初始化树的叶子节点，保留合格划分的节点排除不合格划分的节点。(算法第3行) 3) 算法第6行主要是探索合适的遍历方式，任何有助于提高搜索效率的策略都可以运用在这里。 4) 算法的第7行和17行主要是统一变量，即存在于一个划分的同一个块里的不同名字的变量将被统一为相同名字的变量。 5) 算法第8到13行主要实现系统与用户之间的交互，通过交互的结果来决定后续系统的输出。 下面本文将通过一个具体例子来模拟以其执行过程： 例3. 再次回顾例2中的tgd(6)： BT(Idin 1 ， St 1 ， L， Idk 1 ) Ù DT(Idk 1 ， Name'， L) →$idS 3 ， T2(L， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L) 以上tgd所含的普通变量为 X ¯ = {Idin 1 ， St 1 ， L， Idk 1 ， Name'}根据算法2这里只考虑在φ中出现次数大于2的变量即L和Idk 1 。首先考虑Idk 1 依据算法3将其分别重命名为t 1 和t 2 ，则可推导出如下的tgd： BT(Idin 1 ， St 1 ， L，t 1 ) Ù DT(t 2 ， Name'， L) →$idS 3 ， T2(L， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L) 正如前文所讲此时树中存在两个节点，一个是{{t 1 }; {t 2 }}另外一个是{{t 1 ; t 2 }}。接下来就是遍历这两个节点并且与用户进行交互，判断新引进的变量是否存在相关性。对于节点{{t 1 }; {t 2 }}用户可能会回答不相关此节点将被剪枝，因为此时开发商拥有与其所开发楼盘不相关的标识符。最后显然只剩下节点{{t 1 ; t 2 }}，此tgd不做任何的改变。 然后考虑变量L，经过重命名后导出如下tgd： BT(Idin 1 ， St 1 ， L 1 ， Idk 1 ) Ù DT(Idk 1 ， Name'， L 2 ) →$idS 3 ， T2(L 3 ， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L 4 ) 可以观察到这里存在如下5个合格的划分： {{L 1 ; L 3 }; {L 2 ; L 4 }}， {{L 1 ; L 4 }; {L 2 ; L 3 }}， {{L 1 ; L 3 ; L 4 }; {L 2 }}， {{L 1 }; {L 2 ; L 3 ; L 4 }}， {{L 1 ; L 2 ; L 3 ; L 4 }}同时以上划分组成了四颗不同的树具体如下图2所示： 图2. 例3的划分图 首先遍历第一颗树，对于节点{{L 1 ; L 3 }; {L 2 ; L 4 }}来讲系统将对用户提出如下问题： “通过BT(1Z#，已发证，沈阳市和平区 1 ，K1)和DT(k1，沈阳万科中山置业有限公司，沈阳市和平区 2 )是否足够导出T2(沈阳市和平区 1 ，1Z#，a3)和T3(a3，沈阳万科中山置业有限公司，沈阳市和平区 2 )?”显然以上划分对用户来说是可以接受的，即这些新引进的变量之间存在相关性。此时节点{{L1; L3}; {L2; L4}}的叶子节点将被剪枝，最后经过变量的统一得出如下tgd： BT(Idin 1 ， St 1 ， L 1 ， Idk 1 ) Ù DT(Idk 1 ， Name'， L 2 ) → $idS 3 ， T2(L 1 ， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L 2 ) (7) 接下来同理遍历后面的树，然而剩下的划分无一例外全都将楼栋的具体地址与开发商的总部地址关联起来，这在现实环境中太过于具体了。因此用户将持续回答不相关最后系统输出最终结果tgd(7)。 4.5. 最终的映射 最后对于本文所给定的一对范例元组来说，经过初始规则的生成、规则的预处理、原子优化、连接优化后得出的最终映射规则如下： LT(Idli， Name， L) → $idS 0 ， T3(idS 0 ， Name， L) BT(Idin 1 ， St 1 ， L 1 ， Idk 1 ) Ù DT(Idk 1 ， Name'， L 2 ) → $idS 1 ， T1(St 2 ， Idin 2 ， idS 1 ) Ù T3(idS 1 ， Name'， L 2 ) BT(Idin 1 ， St 1 ， L 1 ， Idk 1 ) Ù DT(Idk 1 ， Name'， L 2 ) → $idS 3 ， T2(L 1 ， Idin 1 ， idS 3 ) Ù T3(idS 3 ， Name'， L 2 ) BT(Idin 2 ， St 2 ， L'， Idk 1 ) Ù DT(Idk 1 ， Name'， L) → $idS 2 ， T1(St 2 ， Idin 2 ， idS 2 ) Ù T3(idS 2 ， Name'， L) BT(Idin 2 ， St 2 ， L'， Idk 1 ) Ù DT(Idk 1 ， Name'， L) → $idS 4 ， T2(L'， Idin 2 ， idS 4 ) Ù T3(idS 4 ， Name'， L)