原文
3.1. \textbf{3.1. } 3.1. 关于 Datalog \textbf{Datalog} Datalog
3.1.1. \textbf{3.1.1. } 3.1.1. Datalog \textbf{Datalog} Datalog基本结构
1️⃣事实 (Fact) \text{(Fact)} (Fact)
- 事实:数据库中现存的数据(即具体的一行元组),写作
关系名('常量1', '常量2', ...)
- 推导事实:即不存在于数据库当中,但是可以从现有事实按照规则推导出来
- 补充:存放事实的数据库叫外延数据库,存放推导事实的叫内涵数据库
2️⃣规则 (Rule) \text{(Rule)} (Rule)
- 含义:从事实(现存于数据库中的 / / /从已知事实推导而来的)中,推导出新事实的逻辑
- 结构:
Head:-Body
或Head:-atom1,atom2,...
Head
是想要输出的结果,如EmpDept(Name, DeptName)
atom
是查询条件,相邻atom
有相同变量可实现join
,如E(Eid,Name,Did),D(Did,Dpt)
3️⃣谓词 (Predicates) \text{(Predicates)} (Predicates)
- 含义:就是关系名,如
EmpDept(Name, DeptName)
中的EmpDept
- 种类:按照是否作为数据库中的数据源
- EDB \text{EDB} EDB谓词:从不出现在任何规则的
head
部分的谓词,充当纯粹的数据源- IDB \text{IDB} IDB谓词:至少在一条规则的
head
部分出现过,代表了被推导而出的规则3.1.2. Datalog \textbf{3.1.2. }\textbf{Datalog} 3.1.2. Datalog的两种查询
1️⃣非递归:合取查询 (ConjunctiveQuery) \text{(ConjunctiveQuery)} (ConjunctiveQuery)
- 自然连接:若 A A A表中有 n n n列分别和 B B B表中的 n n n列同名,则当两表中这 n n n列都相同时才进行连接
Eid Name Did 1 张三 101 2 李四 102 3 王五 104 ⋈ Did Dpt 101 市场部 102 技术部 → Did Eid Name Dpt 101 1 张三 市场部 102 2 李四 技术部 \begin{array}{|c|c|c|}\hline\text{\textbf{Eid}}&\text{\textbf{Name}}&\text{\textbf{Did}}\\\hline1&\text{张三}&101\\2&\text{李四}&102\\3&\text{王五}&104\\\hline\end{array}{\,\bowtie\,}\begin{array}{|c|c|}\hline\text{\textbf{Did}}&\text{\textbf{Dpt}}\\\hline101&\text{市场部}\\102&\text{技术部}\\\hline\end{array}{\,\to\,}\begin{array}{|c|c|c|c|}\hline\text{\textbf{Did}}&\text{\textbf{Eid}}&\text{\textbf{Name}}&\text{\textbf{Dpt}}\\\hline101&1&\text{张三}&\text{市场部}\\102&2&\text{李四}&\text{技术部}\\\hline\end{array} Eid123Name张三李四王五Did101102104⋈Did101102Dpt市场部技术部→Did101102Eid12Name张三李四Dpt市场部技术部- 合取查询结构:
Head:-Body
或Head:-atom1,atom2,...
即同时满足若干原子条件时,输出结果- 合取查询示例:合取查询除了囊括了自然连接,还可以隐式地进行选择和投影
操作 合取查询 同自然连接 R(Eid,Name,Did,Dpt):-E(Eid,Name,Did),D(Did,Dpt)
对结果投影 R(Name):-E(Eid,Name,Did),D(Did,Dpt)
对原子选择 R(Eid,Name,Did,Dpt):-E(Eid,Name,Did),D(Did,Dpt),Did>100
更复杂( θ \theta θ)连接 R(Eid,Name,Did,Dpt):-E(Eid,Name,Did),D(Did,Dpt),Eid
- 对于
head
只能进行投影操作,而对body
中的每个atom
只能进行选择操作(当然还包括连接)- 对结果不进行任何投影的叫完全合取查询,对结果投影去除某些列的即为非完全合取查询
2️⃣递归查询:对合取查询的深化
- 基本思想:允许头部定义的谓词再次出现在规则的体部,示例如下‘
Anc(x,y):-Dad(x,y). %一个合取查询,如果x是y的父母,那么x就是y的祖先 Anc(x,y):-Dad(x,z),Anc(z,y). %开始递归,body部分出现了head中定义的谓词,即如果x是z父母及z是y祖先,则x也是y祖先
- 递归计算:迭代与不动点,以免陷入死循环
轮次 输入 操作(应用什么规则) Anc
表0 0 0 N/A \text{N/A} N/A N/A \text{N/A} N/A Anc-0
(空)1 1 1 Anc-0
基础 Anc(x,y):-Dad(x,y)
Anc-1
(新增父子关系)2 2 2 Anc-1
递归 Anc(x,y):-Dad(x,y),Anc-1(x,y)
Anc-2
(新增祖父子关系)3 3 3 Anc-2
递归 Anc(x,y):-Dad(x,y),Anc-2(x,y)
Anc-3
(新增曾祖父子关系)
- 迭代终止:一直到
Anc
表内不再新增元素时迭代结束,此时的Anc
表叫做不动点3.1.3. Datalog \textbf{3.1.3. }\textbf{Datalog} 3.1.3. Datalog的两种等价语义
1️⃣证明论语义:从结论倒推证明过程
- 推导树:根是等待被证明的结论,叶子是基础事实 EDB \text{EDB} EDB,中间结构反应了按照规则推导的过程
规则: Grandparent('A','C') :- Parent('A','B'), Parent('B','C') 推导: Grandparent('A','C') <-- 结论(根) / \ Parent('A','B') Parent('B','C') <-- 证据集合(叶子) (证据1) (证据2)
- 整体而言,一颗推导树代表了从基础事实(叶节点),推导到最终结论(根节点)的全部过程
- 推导:推导树中自上而下的过程
- 开始:从根节点处的给定事实 R ( A 1 , A n ) R(A_1,A_n) R(A1,An)出发
- 倒推:反向应用规则,直到所有分支都归结为基础事实(叶节点)为止
- 语义:事实 R ( A 1 , A n ) R(A_1,A_n) R(A1,An)成立,当且仅当至少存在一颗 A 1 A_1 A1到 A n A_n An的推导树
2️⃣不动点语义:从起点试图推导到结论
- 要素:外延数据库 EDB \text{EDB} EDB(基础事实),内涵数据库 IDB \text{IDB} IDB(导出事实),立即后果算子 T P T_P TP(每部的推导)
- 推导:给定基础事实 EDB \text{EDB} EDB, IDB k + 1 = IDB k ∪ T P ( EDB ∪ IDB k ) \text{IDB}_{k+1}{=}\text{IDB}_k{\cup}T_P(\text{EDB}{\cup}\text{IDB}_k) IDBk+1=IDBk∪TP(EDB∪IDBk)
- 开始:推导事实集初始为空,即 IDB 0 = ∅ \text{IDB}_0{=}\varnothing IDB0=∅
- 一轮:输入所有已知的事实的可达点,即 IDB 1 = T P ( EDB ) \text{IDB}_1{=}T_P(\text{EDB}) IDB1=TP(EDB)
- 二轮:上轮结果 + + +(上轮结果 ∪ \cup ∪基础点)的可达点,即 IDB 2 = IDB 1 ∪ T P ( EDB ∪ IDB 1 ) \text{IDB}_{2}{=}\text{IDB}_1{\cup}T_P(\text{EDB}{\cup}\text{IDB}_1) IDB2=IDB1∪TP(EDB∪IDB1)
- 三轮:上轮结果 + + +(上轮结果 ∪ \cup ∪基础点)的可达点,即 IDB 3 = IDB 2 ∪ T P ( EDB ∪ IDB 2 ) \text{IDB}_{3}{=}\text{IDB}_2{\cup}T_P(\text{EDB}{\cup}\text{IDB}_2) IDB3=IDB2∪TP(EDB∪IDB2)
- n n n轮:一直迭代到 IDB k + 1 = IDB k \text{IDB}_{k+1}{=}\text{IDB}_{k} IDBk+1=IDBk,输出最终收敛的 IDB k \text{IDB}_{k} IDBk,即最小不动点
- 语义:从基础事实出发,不断地利用规则推导,得到所有可能推导出的事实
3.2. K - \textbf{3.2. }\boldsymbol{K\textbf{-}} 3.2. K-关系上的 Datalog \textbf{Datalog} Datalog
3.2.1. Datalog \textbf{3.2.1. }\textbf{Datalog} 3.2.1. Datalog的证明论半环语义
1️⃣ ω - {\omega}\textbf{-} ω-连续半环是什么:具备完备性和连续性的半环
- 前置分析:为何要 ω - {\omega}\textbf{-} ω-连续半环 → {\to} →能处理无穷推导,并能囊括包语义
- 无穷推导:当 Datalog \text{Datalog} Datalog出现递归时,可能会产生无穷推导,进而结果的注释值等于无穷 ∉ K {\notin}K ∈/K
- 封闭半环:可以处理无限和,但加法必须是幂等的(如 a ⊕ a = a a{\oplus}a{=}a a⊕a=a),这与包语义的如 1 + 1 = 2 1{+}1{=}2 1+1=2冲突
- 前置概念:考虑半环 ( K , ⊕ , ⊗ , 0 , 1 ) (K,{\oplus},{\otimes},0,1) (K,⊕,⊗,0,1),以及 a 1 , a 2 , . . . ∈ K a_1,a_2,...{\in}K a1,a2,...∈K
- 序的定义:对于 a 1 , a 2 ∈ K a_1,a_2{\in}K a1,a2∈K, a 1 ≤ a 2 a_1{\leq}a_2 a1≤a2等价于存在 x ∈ K x{\in}K x∈K使 a 1 ⊕ x = a 2 a_1{\oplus}x{=}a_2 a1⊕x=a2
- ω - {\omega}\textbf{-} ω-链是啥:由序关系 ≤ \leq ≤链接的无限序列 ⟨ a 0 , a 1 , . . . ⟩ \langle{}a_0,a_1,...\rangle{} ⟨a0,a1,...⟩,即满足 a 0 ≤ a 1 ≤ . . . a_0{\leq}a_1{\leq}... a0≤a1≤...的链
- ω - {\omega}\textbf{-} ω-完备性:保证半环 ( K , ⊕ , ⊗ , 0 , 1 ) (K,{\oplus},{\otimes},0,1) (K,⊕,⊗,0,1)上无限递归的过程,也有一个确定的(包括 ∞ \infty ∞)结果
- 完备:半环 K K K是完备的,即任意 ω - {\omega}\textbf{-} ω-链 ⟨ a 0 , a 1 , . . . ⟩ \langle{}a_0,a_1,...\rangle{} ⟨a0,a1,...⟩都有一最小上界 a sup ∈ K a_{\text{sup}}{\in}K asup∈K,即 lim i → ∞ a i = a sup \displaystyle\lim_{i{\to}\infty}a_i{=}a_{\text{sup}} i→∞limai=asup
- 反例:包 ( N , + , × , 0 , 1 ) (\mathbb{N},{+},{\times},0,1) (N,+,×,0,1)中自然数 N \mathbb{N} N不具备完备性,如构造 ω - {\omega}\textbf{-} ω-链 ⟨ 0 , 1 , 2 , . . . ⟩ \langle{}0,1,2,...\rangle{} ⟨0,1,2,...⟩不可能存在上界
- 转化:对于那些没有上界的的 ω - {\omega}\textbf{-} ω-链,强行让 ∞ ∈ K \infty{\in}K ∞∈K于是 ∞ \infty ∞就是其最小上界
- ω - {\omega}\textbf{-} ω-连续性:可将 ⊗ \otimes ⊗分配到无限求和中 a ⊗ ( ∑ i = 0 ∞ b i ) = ∑ i = 0 ∞ ( a ⊗ b i ) \displaystyle{}a{\otimes}\left(\sum_{i=0}^{\infty} b_i\right){=}\sum_{i=0}^{\infty}\left(a{\otimes}b_i\right) a⊗(i=0∑∞bi)=i=0∑∞(a⊗bi),即分配律在处理无穷和时仍有效
- 示例:几个主要的 ω - {\omega}\textbf{-} ω-连续半环
半环类型 ( K , ⊕ , ⊗ , 0 , 1 ) \boldsymbol{(K,{\oplus},{\otimes},0,1)} (K,⊕,⊗,0,1) 为何是 ω - \boldsymbol{\omega}\textbf{-} ω-连续 布尔 ( B , ∨ , ∧ , false , true ) (B,{\lor},{\land},\text{false},\text{true}) (B,∨,∧,false,true) false ≤ true \text{false}{\leq}\text{true} false≤true就是所有的 ω - {\omega}\textbf{-} ω-链,必有上界 布尔式 ( PosB ( B ) , ∨ , ∧ , false , true ) (\text{PosB}(B),{\lor},{\land},\text{false},\text{true}) (PosB(B),∨,∧,false,true) 假定布尔变量 B B B有限, PosB ( B ) \text{PosB}(B) PosB(B)也有限(有上界) 包 ( N ∞ , + , × , 0 , 1 ) (\mathbb{N}^{\infty},{+},{\times},0,1) (N∞,+,×,0,1) N \mathbb{N} N本身是不完备的,但是如上所说强行加入了 ∞ \infty ∞ 热带 ( N ∞ , min , + , ∞ , 0 ) (\mathbb{N}^{\infty},{\min},{+},{\infty},0) (N∞,min,+,∞,0) 同上,此外这个环描述的其实是最短路径优化 幂集 ( P ( Ω ) , ∪ , ∩ , ∅ , Ω ) (P(\Omega),{\cup},{\cap},{\varnothing},\Omega) (P(Ω),∪,∩,∅,Ω) 若事件空间 Ω \Omega Ω有限,其幂集 P ( Ω ) P(\Omega) P(Ω)也有限(有上界) 模糊 ( [ 0 , 1 ] , max , min , 0 , 1 ) ([0,1],{\max},{\min},{0},1) ([0,1],max,min,0,1) [ 0 , 1 ] [0,1] [0,1]必定有最小上界 1 1 1,该环可用来描述可能性 2️⃣ Datalog \text{Datalog} Datalog的证明论半环语义: q ( R ) ( t ) = ∑ τ yields t ( ∏ t ′ ∈ leaves ( τ ) R ( t ′ ) ) \displaystyle{}q(R)(t){=}\sum_{\tau\text { yields } t}\left(\prod_{t^{\prime}{\in}\text { leaves }(\tau)} R\left(t^{\prime}\right)\right) q(R)(t)=τ yields t∑ t′∈ leaves (τ)∏R(t′)
- 含义:在 ω - {\omega}\textbf{-} ω-连续半环上,求一个输出元组 t t t的注释值时,遵循以下步骤
- 第一步:先找出所有能推导出 t t t的语法树,记录每个推导树的所有叶子节点的注释值
- 第二步:求每个推导树的叶节点注释值的积,再将所有语法树的积相加,极为 t t t的注释值
- 非递归:在环 ( N ∞ , + , × , 0 , 1 ) (\mathbb{N}^{\infty},{+},{\times},0,1) (N∞,+,×,0,1)上,非递归规则 Q ( x , y ) :- R ( x , z ) , R ( z , y ) Q(x,y)\text{:-}R(x,z),R(z,y) Q(x,y):-R(x,z),R(z,y),即 Q = R ⋈ R Q{=}R{\bowtie}R Q=R⋈R
x z Anno. a a 2 a b 3 b b 4 ⋈ z y Anno. a a 2 a b 3 b b 4 = x y Anno. a a 2 × 2 a b 2 × 3 + 3 × 4 b b 4 × 4 \begin{array}{|c|c|c|}\hline \textbf{x}&\textbf{z}&\textbf{Anno.}\\\hline\hline a&a&2\\\hline a&b&3\\\hline b&b&4\\\hline \end{array}{\,\bowtie\,}\begin{array}{|c|c|c|}\hline \textbf{z}&\textbf{y}&\textbf{Anno.}\\\hline\hline a&a&2\\\hline a&b&3\\\hline b&b&4\\\hline \end{array}{\,=\,}\begin{array}{|c|c|l|}\hline \textbf{x}&\textbf{y}&\textbf{Anno.}\\\hline\hline a&a&2{\times}2\\\hline a&b&2{\times}3{+}3{\times}4\\\hline b&b&4{\times}4\\\hline \end{array} xaabzabbAnno.234⋈zaabyabbAnno.234=xaabyabbAnno.2×22×3+3×44×4
- 考虑 Q ( a , b ) :- R ( a , a ) , R ( a , b ) Q(a,b)\text{:-}R(a,a),R(a,b) Q(a,b):-R(a,a),R(a,b)所代表的推导树, R ( a , a ) , R ( a , b ) R(a,a),R(a,b) R(a,a),R(a,b)注释之积为 2 × 3 2{\times}3 2×3
- 考虑 Q ( a , b ) :- R ( a , b ) , R ( b , b ) Q(a,b)\text{:-}R(a,b),R(b,b) Q(a,b):-R(a,b),R(b,b)所代表的推导树, R ( a , b ) , R ( b , b ) R(a,b),R(b,b) R(a,b),R(b,b)注释之积为 3 × 4 3{\times}4 3×4
- 递归:在环 ( N ∞ , + , × , 0 , 1 ) (\mathbb{N}^{\infty},{+},{\times},0,1) (N∞,+,×,0,1)上,递归规则 { Q ( x , y ) :- R ( x , y ) Q ( x , y ) :- Q ( x , z ) , Q ( z , y ) \begin{cases}Q(x,y)\text{:-}R(x,y)\\Q(x,y)\text{:-}Q(x,z),Q(z,y)\end{cases} {Q(x,y):-R(x,y)Q(x,y):-Q(x,z),Q(z,y),即 Q = R n Q{=}R^n Q=Rn(自 Join \text{Join} Join无数次)
x z Anno. a a 2 a b 3 b b 4 ⋈ z y Anno. a a 2 a b 3 b b 4 ⋈ . . . = x y Anno. a a ∞ a b ∞ b b ∞ \begin{array}{|c|c|c|}\hline \textbf{x}&\textbf{z}&\textbf{Anno.}\\\hline\hline a&a&2\\\hline a&b&3\\\hline b&b&4\\\hline \end{array}{\,\bowtie\,}\begin{array}{|c|c|c|}\hline \textbf{z}&\textbf{y}&\textbf{Anno.}\\\hline\hline a&a&2\\\hline a&b&3\\\hline b&b&4\\\hline \end{array}{\,\bowtie\,}...{\,=\,}\begin{array}{|c|c|c|}\hline \textbf{x}&\textbf{y}&\textbf{Anno.}\\\hline\hline a&a&{\infty}\\\hline a&b&{\infty}\\\hline b&b&{\infty}\\\hline \end{array} xaabzabbAnno.234⋈zaabyabbAnno.234⋈...=xaabyabbAnno.∞∞∞
- Q ( a , b ) Q(a,b) Q(a,b)利用规则 Q ( x , y ) :- Q ( x , z ) , Q ( z , y ) Q(x,y)\text{:-}Q(x,z),Q(z,y) Q(x,y):-Q(x,z),Q(z,y),得到推导树倒数第二层节点
Q(a,b) | Q(a,b) Q(a,a),Q(a,b) | Q(a,b),Q(b,b) Q(a,a),Q(a,a),Q(a,b) | Q(a,b),Q(b,b),Q(b,b) Q(a,a),Q(a,a),Q(a,a),Q(a,b) | Q(a,b),Q(b,b),Q(b,b),Q(b,b) ........ | ........
- 再利用规则 Q ( x , y ) :- R ( x , y ) Q(x,y)\text{:-}R(x,y) Q(x,y):-R(x,y),得到推导树的叶子节点
R(a,b) | R(a,b) R(a,a),R(a,b) | R(a,b),R(b,b) R(a,a),R(a,a),R(a,b) | R(a,b),R(b,b),R(b,b) R(a,a),R(a,a),R(a,a),R(a,b) | R(a,b),R(b,b),R(b,b),R(b,b) ........ | ........
- 合并每个推导树叶节点注释的累积,结果必定是 ∞ \infty ∞,然而这在 ω - {\omega}\textbf{-} ω-连续半环中是合法的结果
3️⃣ Datalog \text{Datalog} Datalog的证明论半环语义的性质
- 合理性保证:对一个行数有限的数据库 R R R,进行 Datalog \text{Datalog} Datalog查询的结果 q ( R ) q(R) q(R)的行数也有限
- 非递归等价性:对于 K - K\text{-} K-关系上的查询,以下两者得到的计算结果相同
- R A + \mathcal{RA}^+ RA+视角:视查询为 Join/Union \text{Join/Union} Join/Union等算子构成的算式,用关系代数半环语义计算注释值
- Datalog \text{Datalog} Datalog视角:将查询视作若干非递归的 Datalog \text{Datalog} Datalog规则,用 Datalog \text{Datalog} Datalog半环语义计算注释值
- 语义一致性:以下两种方式查询结果一致
- 本文 Datalog \text{Datalog} Datalog语义:用布尔半环注释数据库,用 Datalog \text{Datalog} Datalog半环语义计算注释,保留为 true \text{true} true者
- 传统 Datalog \text{Datalog} Datalog语义:普通的 Datalog \text{Datalog} Datalog的执行所得到的元组
4️⃣ Datalog \text{Datalog} Datalog的证明论半环语义的局限
- 局限:虽然这种半环语义是良定义的,但执行层面不可能枚举无限种可能的推导树
- 解决:引入完全等价的不动点语义,将 Datalog \text{Datalog} Datalog规则翻译成代数方程,自底向上求解不动点
3.2.2. Datalog \textbf{3.2.2. }\textbf{Datalog} 3.2.2. Datalog的不动点论半环语义
1️⃣将 Datalog \text{Datalog} Datalog的逻辑规则转化为方程组(代数系统)
- 已知量 & \& &未知数分配:已知量即基础事实 R R R中所有的注释值,未知量即求解结果 Q Q Q的所有注释值
- 依据 Datalog \text{Datalog} Datalog规则建立方程:在环 ( N ∞ , + , × , 0 , 1 ) (\mathbb{N}^{\infty},{+},{\times},0,1) (N∞,+,×,0,1)上,考虑规则 { Q ( x , y ) :- R ( x , y ) Q ( x , y ) :- Q ( x , z ) , Q ( z , y ) \begin{cases}Q(x,y)\text{:-}R(x,y)\\Q(x,y)\text{:-}Q(x,z),Q(z,y)\end{cases} {Q(x,y):-R(x,y)Q(x,y):-Q(x,z),Q(z,y)
R = a b m a c n c b p b d r d d s 和 Q = a b x a c y c b z b d u d d v a d w ⇒ { x = m + y z y = n z = p u = r + u v v = s + v 2 w = x u + w v R{\,=\,}\begin{array}{|c|c|c|}\hline \hline a&b&m\\\hline a&c&n\\\hline c&b&p\\\hline b&d&r\\\hline d&d&s\\\hline \end{array}{\,和\,}Q{\,=\,}\begin{array}{|c|c|c|}\hline \hline a&b&\textbf{x}\\\hline a&c&\textbf{y}\\\hline c&b&\textbf{z}\\\hline b&d&\textbf{u}\\\hline d&d&\textbf{v}\\\hline a&d&\textbf{w}\\\hline \end{array}{\,\xRightarrow{}}\begin{cases} \mathbf{x}{=}m{+}\mathbf{y} \mathbf{z} \\ \mathbf{y}{=}n \\ \mathbf{z}{=}p \\ \mathbf{u}{=}r{+}\mathbf{u} \mathbf{v} \\ \mathbf{v}{=}s{+}\mathbf{v}^2 \\ \mathbf{w}{=}\mathbf{x} \mathbf{u}{+}\mathbf{w} \mathbf{v}\end{cases} R=aacbdbcbddmnprs和Q=aacbdabcbdddxyzuvw⎩ ⎨ ⎧x=m+yzy=nz=pu=r+uvv=s+v2w=xu+wv
- 考虑 Q ( x , y ) :- R ( x , y ) Q(x,y)\text{:-}R(x,y) Q(x,y):-R(x,y):则 Q ( a , b ) Q(a,b) Q(a,b)可由 R ( a , b ) R(a,b) R(a,b)生成,于是 x = m + ⋯ \mathbf{x}{=}m{+}{\cdots} x=m+⋯
- 考虑 Q ( x , y ) :- Q ( x , z ) , Q ( z , y ) Q(x,y)\text{:-}Q(x,z),Q(z,y) Q(x,y):-Q(x,z),Q(z,y):则 Q ( a , b ) Q(a,b) Q(a,b)可由 Q ( a , c ) Q(a,c) Q(a,c)和 Q ( c , b ) Q(c,b) Q(c,b)生成,于是 x = m + y z \mathbf{x}{=}m{+}\mathbf{yz} x=m+yz
2️⃣方程的求解:不动点迭代法
- 初始化: ( x , y , z , u , v , w ) = ( 0 , 0 , 0 , 0 , 0 , 0 ) (\textbf{x},\textbf{y},\textbf{z},\textbf{u},\textbf{v},\textbf{w}){=}(0,0,0,0,0,0) (x,y,z,u,v,w)=(0,0,0,0,0,0)
- 第一轮: ( x , y , z , u , v , w ) = ( 0 , 0 , 0 , 0 , 0 , 0 ) (\textbf{x},\textbf{y},\textbf{z},\textbf{u},\textbf{v},\textbf{w}){=}(0,0,0,0,0,0) (x,y,z,u,v,w)=(0,0,0,0,0,0)带入右边 → {\to} →左边 ( x , y , z , u , v , w ) = ( m , n , p , r , s , 0 ) (\textbf{x},\textbf{y},\textbf{z},\textbf{u},\textbf{v},\textbf{w}){=}(m,n,p,r,s,0) (x,y,z,u,v,w)=(m,n,p,r,s,0)
- 第二轮: ( x , y , z , u , v , w ) = ( m , n , p , r , s , 0 ) (\textbf{x},\textbf{y},\textbf{z},\textbf{u},\textbf{v},\textbf{w}){=}(m,n,p,r,s,0) (x,y,z,u,v,w)=(m,n,p,r,s,0)带入右边 → {\to} →左边 ( x , y , z , u , v , w ) = ( m + n p , n , . . . ) (\textbf{x},\textbf{y},\textbf{z},\textbf{u},\textbf{v},\textbf{w}){=}(m{+}np,n,...) (x,y,z,u,v,w)=(m+np,n,...)
- 第 n n n轮:不断用方程组迭代,至 ( x , y , z , u , v , w ) (\textbf{x},\textbf{y},\textbf{z},\textbf{u},\textbf{v},\textbf{w}) (x,y,z,u,v,w)不变(即为不动点),结果如下
Q = a b m + n p a c n c b p b d r ( 1 + v + v 2 + ⋯ ) d d s + s 2 + 2 s 3 + 5 s 4 + ⋯ a d r ( m + n p ) ( 1 + v + v 2 + ⋯ ) 2 → 克林闭包 v ∗ = 1 + v + v 2 + ⋯ Q = a b m + n p a c n c b p b d r v ∗ d d s + s 2 + 2 s 3 + 5 s 4 + ⋯ a d r ( m + n p ) ( v ∗ ) 2 Q{\,=\,}\begin{array}{|c|c|l|}\hline \hline a&b&m{+}np\\\hline a&c&n\\\hline c&b&p\\\hline b&d&r(1{+}v{+}v^2{+}{\cdots})\\\hline d&d&s{+}s^2{+}2s^3{+}5s^4{+}{\cdots}\\\hline a&d&r(m{+}np)(1{+}v{+}v^2{+}{\cdots})^2\\\hline \end{array}{\,\xrightarrow[克林闭包]{v^*{=}1{+}v{+}v^2{+}{\cdots}}\,}Q{\,=\,}\begin{array}{|c|c|l|}\hline \hline a&b&m{+}np\\\hline a&c&n\\\hline c&b&p\\\hline b&d&rv^*\\\hline d&d&s{+}s^2{+}2s^3{+}5s^4{+}{\cdots}\\\hline a&d&r(m{+}np)(v^*)^{2}\\\hline \end{array} Q=aacbdabcbdddm+npnpr(1+v+v2+⋯)s+s2+2s3+5s4+⋯r(m+np)(1+v+v2+⋯)2v∗=1+v+v2+⋯克林闭包Q=aacbdabcbdddm+npnprv∗s+s2+2s3+5s4+⋯r(m+np)(v∗)23️⃣对不动点语义的分析
- 语义等价性:由 Datalog \text{Datalog} Datalog两种语义(证明论和不动点)得到的查询结果是完全等价的
- 迭代的保证:在 ω - \omega\text{-} ω-连续半环上,为何不动点迭代法是有效的
- 单调性:由于是正关系代数,方程中只有加乘,故每轮不动点迭代都递增(如 x 1 ≤ x 2 ≤ x 3 . . . \textbf{x}_1{\leq}\textbf{x}_2{\leq}\textbf{x}_3... x1≤x2≤x3...)
- 完备性:保证了变量在不动点迭代过程中,即使不断递增但还是会有一个最小上界(最小不动点)
- 连续性:应用克林(克林闭包的克林)不动点定理的关键,即迭代停止处就是索要的最小不动点
- 解的含义:以一个半环的视角,以 Q ( a , b ) Q(a,b) Q(a,b)的注释 m + n p m{+}np m+np为例
- 包半环: m / n / p m/n/p m/n/p来自 a → b / a → c / c → b a{\to}b/a{\to}c/c{\to}b a→b/a→c/c→b的路径数, n p np np积则为 a → c → b a{\to}c{\to}b a→c→b的路径数
- 溯源半环: m m m表示 Q ( a , b ) Q(a,b) Q(a,b)一部分直接来自 R ( a , b ) R(a,b) R(a,b), n p np np表示另一部分来自 R ( a , c ) ⋈ R ( c , b ) R(a,c){\bowtie}R(c,b) R(a,c)⋈R(c,b)
- 关于无穷大:良性与恶性的递归
递归 含义 解结构 线性 左边只以一次方出现在右边,如 u = r + u v \mathbf{u}{=}r{+}\mathbf{u} \mathbf{v} u=r+uv 链式结构,解呈几何级数 非线性 左边以更高次方出现在右边,如 v = s + v 2 \mathbf{v}{=}s{+}\mathbf{v}^2 v=s+v2 组合结构 (如二叉树),解呈复杂级数 4️⃣ Datalog \text{Datalog} Datalog上的因子分解定理
- 内容: q ( h ( R ) ) = h ( q ( R ) ) q\left( {h\left( R\right) }\right){=}h\left( {q\left( R\right) }\right) q(h(R))=h(q(R))
- 要素: R R R为原始数据库(注释为溯源多项式), h h h为同态函数(翻译多项式), q q q为 Datalog \text{Datalog} Datalog查询
- 含义:先翻译注释再查询即 q ( h ( R ) ) q\left( {h\left( R\right) }\right) q(h(R)),等价于先查询再翻译查询结果注释即 h ( q ( R ) ) h\left( {q\left( R\right) }\right) h(q(R))
- 意义:一种通用性的宣言,即溯源半环上的 Datalog \text{Datalog} Datalog查询是一种通用模型
3.3. \textbf{3.3. } 3.3. 从溯源多项式 → \textbf{→} →溯源正式幂级数
3.3.1. \textbf{3.3.1. } 3.3.1. 为何溯源多项式不够
1️⃣无限系数情形:考虑单位循环递归(一种特殊的线性递归)
- 示例:考虑单位规则循环 { Q ( x , y ) :- R ( x , y ) R ( x , y ) :- Q ( x , y ) \begin{cases}Q(x,y)\text{:-}R(x,y)\\R(x,y)\text{:-}Q(x,y)\end{cases} {Q(x,y):-R(x,y)R(x,y):-Q(x,y), Q ( a , b ) Q(a,b) Q(a,b)推导树如下
Q(a, b) <- R(a, b) Q(a, b) <- R(a, b) <- Q(a, b) <- R(a, b) Q(a, b) <- R(a, b) <- Q(a, b) <- R(a, b) <- Q(a, b) <- R(a, b) ......
- 特点:有无穷多颗推导树,每颗推导树的叶节点的积都一样,也就是 ∞ × N \infty{\times}N ∞×N结构(系数为无穷)
- 局限:对于多项式的一项,其系数并不能无限
2️⃣无限项数情形:线性或非线性递归
- 示例:之前讨论的例子中解得的 v = s + s 2 + 2 s 3 + 5 s 4 + ⋯ \textbf{v}{=}s{+}s^2{+}2s^3{+}5s^4{+}{\cdots} v=s+s2+2s3+5s4+⋯及 u = r ( 1 + v + v 2 + ⋯ ) \textbf{u}{=}r(1{+}v{+}v^2{+}{\cdots}) u=r(1+v+v2+⋯)
- 局限:多项式并不允许表示无限多个项,除非用级数
3.3.2. \textbf{3.3.2. } 3.3.2. 形式幂级数半环
1️⃣ Datalog \text{Datalog} Datalog溯源半环
- 是啥:将溯源多项式半环 ( N [ X ] , + , × , 0 , 1 ) (\mathbb{N}[X],+,\times,0,1) (N[X],+,×,0,1)的 N [ X ] \mathbb{N}[X] N[X]换成 N ∞ [ [ X ] ] {\mathbb{N}^{\infty}[[X]]} N∞[[X]]
结构 含义 X X X 数据库中每个元组的 ID \text{ID} ID,在溯源数据库中就是元组的注释,记录参与贡献的元组 [ [ ] ] [[\,]] [[]] 表示可以放入无穷多的项,区别于多项式的 [ ] [\,\,] []只能放入有限多的项 N ∞ \mathbb{N}^{\infty} N∞ 对自然数的扩展,认为无穷也是一种自然数,一起可以作为每一项的系数 - 性质:任然是一个 ω - {\omega}\textbf{-} ω-连续半环,故不动点求解任然适用
2️⃣ N ∞ [ [ X ] ] {\mathbb{N}^{\infty}[[X]]} N∞[[X]]的理论保证
- 向下兼容:形式幂级数囊括了多项式,在 N [ X ] \mathbb{N}[X] N[X]上执行与按同样方式在 N ∞ [ [ X ] ] {\mathbb{N}^{\infty}[[X]]} N∞[[X]]上执行结果一样
- 因子分解:和溯源多项式半环上的 Datalog \text{Datalog} Datalog因子分解一样, q ( h ( R ) ) = h ( q ( R ) ) q\left( {h\left( R\right) }\right){=}h\left( {q\left( R\right) }\right) q(h(R))=h(q(R))
- 要素: R R R为原始数据库(注释为溯源形式幂级数), h h h为同态函数(翻译幂级数), q q q为 Datalog \text{Datalog} Datalog查询
- 保证:一定存在至少一个 h h h,可将溯源形式幂级数,翻译成其它注释值(如布尔 / / /数目等)
- 含义:先翻译注释再查询即 q ( h ( R ) ) q\left( {h\left( R\right) }\right) q(h(R)),等价于先查询再翻译查询结果注释即 h ( q ( R ) ) h\left( {q\left( R\right) }\right) h(q(R))
- 可分析性:只有一种情况溯源形式幂级数才会出现无穷系数,即单位规则循环
- 所谓单位:
Body
只有一个atom
,例如P:-Q
- 所谓循环:即所有规则最后会成为一个环,如下三个例子
R1 :- R2 | R1 :- R2 | R1 :- R2 R2 :- R1 | R2 :- R3 | R2 :- R3 R3 :- R1 | R3 :- R2 | R2 :- R1
4.1. \textbf{4.1. } 4.1. 溯源级数计算
1️⃣ All-Trees \text{All-Trees} All-Trees算法:通过让推导树自底向上构建实现的不动点计算,并判断溯源是否无限
- 初始:构建两个数据结构
结构 作用 初始化输入什么 白名单 T T T 存放当前已知的有限推导树 所有已知元组(只有一节的推导树) 黑名单 T ∞ T^{\infty} T∞ 存放已经确定的拥有无限推导树的元组 空 - 迭代:自底向上的搭建
输入对象 操作 如果某元组匹配成功… T T T中所有树的根 匹配 Datalog \text{Datalog} Datalog规则 原有推导树的根找到其父节点,再向上生长一层 T ∞ T^{\infty} T∞中所有元组 匹配 Datalog \text{Datalog} Datalog规则 原有元组就能无限推导,其父节点也必定可以无限推导
- 二者迭代的结果,共同构成待筛选的推导树集(即使由 T ∞ T^{\infty} T∞迭代出来的仅两层的推导树必被简剪枝)
- 审查:对所有待筛选的推导树,自顶向下的检查
检查对象 什么情况下推导树不能过审 解释 根直接子节点 某树至少有一个根的直接子节点在 T ∞ T^{\infty} T∞中 子节点可无穷推导,父节点也可 每一层节点 在任意深度发现了与根节点一致的元组 构成循环,自身不断导出自身
- 更新:将过审的推导树加入 T T T,不能过审的推导树的根节点加入到 T ∞ T^{\infty} T∞中
- 停止:当 T / T ∞ T/T^{\infty} T/T∞的成员都不变化时
- 输出:计算出元组的溯源多项式
条件 元组的溯源结果(多项式) 元组在 T ∞ T^{\infty} T∞中 ∞ \infty ∞ 元组为 T T T中树的根 找到所有以该元组为根的推导树,计算每棵树叶子累乘,再将累乘累加 - 补充:对于在 T ∞ T^{\infty} T∞中的元组,检测其溯源结果的无穷是哪一种
无穷类型 环路的种类 无穷多的项 元组对应推导树必定有环路,而且环路包含非单位规则(如 a:-b,c
及c:-a
)无穷的系数 元组对应推导树必定有环路,而且环路全为单位规则(如 a:b
及b:-a
)2️⃣ M-C \text{M-C} M-C算法:深入某无限推导的元组 t t t,弄清其特定的单项式 μ \mu μ对注释值贡献了多少次(系数)
- 前置:用元组 - \text{-} -单项式对 ( t , μ ) (t,\mu) (t,μ)描述一类推导树
- 结构: μ \mu μ是一个单项式,为推导树的叶节点的累乘,这些叶节点最终可导出 t t t
- 种类:按照 μ \mu μ所代表的叶节点组合,有多少种方法可以推导出元组 t t t
类型 特点 备注 普通 ( t , μ ) (t,\mu) (t,μ) μ \mu μ的叶节点组合,仅有有限种方法导出 t t t t t t的注释中, μ \mu μ项系数有限 无穷 ( t ′ , μ ′ ) (t',\mu') (t′,μ′) μ ’ \mu’ μ’的叶节点组合,可有无限种方法导出 t ′ t' t′ t ′ t' t′的注释中, μ ’ \mu’ μ’项系数为 ∞ \infty ∞ - 补充:上章讨论过,只有出现单位规则循环时,幂级数才会有无穷系数,即才会有无穷 ( t ′ , μ ′ ) (t',\mu') (t′,μ′)
- 初始:对某可无穷推导元组的溯源幂级数,输入其中目标单项式 μ \mu μ,构建两个数据结构
结构 存放内容 初始化输入什么 白名单 T T T 自底向上生长,有潜力得到 μ \mu μ的推导树的集合 μ \mu μ的组成,如 μ = r s 2 \mu{=}rs^2 μ=rs2则 T = { r , s } T{=}\{r,s\} T={r,s} 黑名单 P ∞ P^{\infty} P∞ 目前已经发现的无穷元组 - \text{-} -单项式对 ( t ′ , μ ′ ) (t',\mu') (t′,μ′) 空 - 迭代:与 All-Trees \text{All-Trees} All-Trees类似
- 生成:让 T T T中所有推导树根节点匹配 Datalog \text{Datalog} Datalog规则向上生长,可能引入不存在于 μ \mu μ中的叶节点
情形 匹配的规则时… 不引入新叶节点 规则的所有 atom
仅需 T T T中推导树的根节点需引入新叶节点 规则有的 atom
需要 T T T中推导树的根节点外的结点- 剪枝:处理引入的不存在于 μ \mu μ中的叶节点,以及过度引入的 μ \mu μ中的叶节点
情形 剪枝条件 示例 无中生有 推导树叶节点中有 μ \mu μ不包含的元素 当 μ = r s 2 \mu{=}rs^2 μ=rs2时,推导树叶节点含 p p p 种类越界 推导树叶节点中某元素数量超过 μ \mu μ中的 当 μ = r s 2 \mu{=}rs^2 μ=rs2时,推导树叶节点含三个 s s s - 检测:哪些元组的注释具有无穷系数
检测方式 对于某推导树 ( t 0 , μ 0 ) \boldsymbol{(t_0,\mu_0)} (t0,μ0) 对 P ∞ \boldsymbol{P^{\infty}} P∞操作 继承检测 若其有某颗子树为 ( t ′ , μ ′ ) ∈ P ∞ (t',\mu'){\in}P^{\infty} (t′,μ′)∈P∞ 将 ( t 0 , μ 0 ) (t_0,\mu_0) (t0,μ0)塞入 环路检测 若其从根结点 t 0 t_0 t0往下也有 t 0 t_0 t0(成环) 将 ( t 0 , μ 0 ) (t_0,\mu_0) (t0,μ0)塞入 - 终止:由于搜索空间被 μ \mu μ严格限制算法必有限步终止,输出系数 C C C( t t t的注释中项 μ \mu μ的系数)
情形 返回 C \boldsymbol{C} C的值 目标 ( t , μ ) (t, \mu) (t,μ)不在 P ∞ P^\infty P∞中 C = T C{=}T C=T中所有符合 ( t , μ ) (t, \mu) (t,μ)的推导树的总数 目标 ( t , μ ) (t, \mu) (t,μ)在 P ∞ P^\infty P∞中 C = ∞ C{=}{\infty} C=∞ 4.2. \textbf{4.2. } 4.2. 要点的补充(从这开始放水了,都是些啥啊)
4.2.1. \textbf{4.2.1. } 4.2.1. 对 All-Tree \textbf{All-Tree} All-Tree的再思考
1️⃣ All-Trees \text{All-Trees} All-Trees算法对几种具体语义的处理
- 对包语义:天然可处理包语义,因为包的注释是自然数,对自然数进行无穷运算后得到的就是无穷
- 对其它语义:存在一定偏差,本质上源于幂等性
- 对于布尔半环:由于布尔值 x ∨ x = x x{\lor}x{=}x x∨x=x,所以对布尔值的无穷运算还是布尔值,并不能用无穷表示
- 对于幂集半环:由于事件 A ∪ A = A A{\cup}A{=}A A∪A=A,所以对事件的无穷运算还是事件,并不能用无穷表示
2️⃣ All-Trees \text{All-Trees} All-Trees算法的修改:使之能处理具有幂等性的语义
- 核心修改:重新定义新的推导树,考虑一类推导树 ( t , μ ) (t,\mu) (t,μ)
- 修改前:根 t t t相同且叶累积 μ \mu μ相同但内部结构(推导路径)不同,则视作新的推导树
- 修改后:根 t t t相同且叶累积 μ \mu μ相同则视作一类;仅 μ \mu μ更小(如 x y xy xy小于 x y z xyz xyz)才视作新(更好)的推导树
- 为何有效:吸收律 a + a × b = a a{+}a{\times}b{=}a a+a×b=a的体现
- 去除冗余:选择尽可能小的 μ \mu μ以去除冗余信息,比如 x y xy xy就能导出 t t t,那还要 x y z xyz xyz的推导树干啥
4.2.2. \textbf{4.2.2. } 4.2.2. 查询包含
1️⃣分配格是什么
- 格:即 ( L , ⊕ , ⊗ ) (L,{\oplus},{\otimes}) (L,⊕,⊗)的代数系统,满足交换律 / / /结合律,以及吸收率 { a ⊕ ( a ⊗ b ) = a a ⊗ ( a ⊕ b ) = a \begin{cases}a{\oplus}(a{\otimes}b){=}a\\a{\otimes}(a{\oplus}b){=}a\end{cases} {a⊕(a⊗b)=aa⊗(a⊕b)=a
- 分配格:在格的基础上,还满足分配律 { a ⊕ ( b ⊗ c ) = ( a ⊕ b ) ⊗ ( a ⊕ c ) a ⊗ ( b ⊕ c ) = ( a ⊗ b ) ⊕ ( a ⊗ c ) \begin{cases}a{\oplus}(b{\otimes}c){=}(a{\oplus}b){\otimes}(a{\oplus}c)\\a{\otimes}(b{\oplus}c){=}(a{\otimes}b){\oplus}(a{\otimes}c)\end{cases} {a⊕(b⊗c)=(a⊕b)⊗(a⊕c)a⊗(b⊕c)=(a⊗b)⊕(a⊗c)
2️⃣关于查询包含
- 定义: K - K\text{-} K-半环语义下查询 q 1 q_1 q1被 q 2 q_2 q2包含(记作 q 1 ⊑ K q 2 q_1{\sqsubseteq_K}q_2 q1⊑Kq2) ⇔ {\Leftrightarrow} ⇔数据库 R R R中任意元组 t t t有 q 1 ( R ) ( t ) ≤ q 2 ( R ) ( t ) q_1(R)(t){\leq}q_2(R)(t) q1(R)(t)≤q2(R)(t)
- 示例:布尔半环中 false ≤ true \text{false}{\leq}\text{true} false≤true,包中 ≤ \leq ≤就表示自然数的小于等于
- 性质:若 K - K\text{-} K-半环是一个分配格,查询是合区查询并集(多个 CQ \text{CQ} CQ取 or \text{or} or),则 q 1 ⊑ K q 2 q_1{\sqsubseteq_K}q_2 q1⊑Kq2和 q 1 ⊑ B q 2 q_1{\sqsubseteq_{\mathbb{B}}}q_2 q1⊑Bq2等价