Datalog 中的朴素评估和半朴素评估之间的区别在于,当您使用朴素实现进行评估时,您会为每次迭代获取所有初始数据集(现有 EDB)加上新闻数据集(推断的 EDB)。例如,如果您有这样的 IDB:
reachable(X,Y) :- link(X,Y).
reachable(X,Y) :- link(X,Z), reachable(Z,Y).
还有一组像这样的 EDB:link = {(a,b), (b,c), (c,c), (c,d)}
执行评估的程序是:
- 首先假设所有 IDB 关系都是空的。
- 使用 EDB 和之前的 IDB 反复评估规则以获得新的 IDB。
- 当 IDB 没有变化时结束。
当您在每个步骤中使用幼稚的方法时,您将获得以下数据作为输入和输出:
| Iteration |Input for the current iteration I_{i} | New facts inferred |
|-----------|-------------------------------------------------|------------------------------|
| 1 | {} | {(a,b), (b,c), (c,c), (c,d)} |
| 2 | {(a,b), (b,c), (c,c), (c,d)} | {(a,c),(b,c),(b,d),(c,d)} |
| 3 | {(a,b), (b,c), (c,c), (c,d), (a,c), (b,d)} | {(a,d)} |
| 4 | {(a,b), (b,c), (c,c), (c,d), (a,c), (b,d),(a,d)}| {} |
在第 4 次迭代中,您将停止,因为到达了固定点,并且无法推断出新的事实。但是,在半天真的方法中,您应用优化,而不是在每次迭代中使用所有派生事实作为规则的输入,而是可以仅将在先前迭代中已经学习的元组发送到每次迭代,以避免重复元组。
| Iteration |Input for the current iteration I_{i} | New facts inferred |
|-----------|---------------------------------------|------------------------------|
| 1 | {} | {(a,b), (b,c), (c,c), (c,d)} |
| 2 | {(a,b), (b,c), (c,c), (c,d)} | {(a,c),(b,c),(b,d),(c,d)} |
| 3 | {(a,c), (b,d)} | {(a,d)} |
| 4 | {(a,d)} | {} |
资料来源:数据记录和递归查询处理