19.7. honest Politician 示例决策(非维护和风险)
Honest Politician 示例决定集演示了通过逻辑插入以及规则中的 salience 使用的真实维护的概念。
以下是 Honest Politician 示例的概述:
-
名称:
honestpolitician
-
主类 :
org.drools.examples.honestpolitician.HonestPoliticianExample
(在src/main/java
中) -
模块 :
drools-examples
- 类型 :Java 应用程序
-
规则文件:
org.drools.examples.honestpolitician.HonestPolitician.drl
(在src/main/resources
中) - 目标 :根据事实的逻辑插入和规则的使用,说明事实中的事实概念
Honest Politician 示例的基本内部是,只有语句为 true 时对象才能存在。规则结果可以在逻辑上插入带有 insertLogical ()
方法的对象。这意味着,只要逻辑插入的规则保持在 KIE 会话工作内存中,对象仍保持在 KIE 会话工作内存中。当不再满足该规则时,对象会自动重新遍历。
在本例中,执行规则会导致一组 politicians 从 honest 变为 dishonest,从而导致一个被破坏的攻击。评估每个 politician 后,它们从设为 true
的 honesty 属性开始,但一条规则会触发使 politicians 不再休眠的规则。当它们的状态从 honest 切换到 dishonest 时,它们会被从工作内存中移除。规则 salience 通知决策引擎如何优先选择为它们定义了差异的任何规则,否则使用默认的 salience 值 0。在激活队列中排序时,具有较高 salience 值的规则会被赋予更高的优先级。
Politician 和 Hope 类
示例中的 Politician
示例是为 honest politician 配置的示例。Politician
类由 String 项 名称和
一个布尔值项组成:
Politician 类
public class Politician { private String name; private boolean honest; ... }
public class Politician {
private String name;
private boolean honest;
...
}
Hope
类确定 Hope
对象是否存在。这类没有有意义的成员,但只要这个要求,就存在于工作内存中。
期望类
politician honesty 的规则定义
在 Honest Politician 示例中,当工作内存中至少有一个 honest politician 时,"We 有一个 honest Politician"
规则逻辑插入一个新的 Hope
对象。当所有策略都变为 dishonest 后,H ope
对象会自动重新遍历。此规则具有值 10
的 salience
属性,以确保它在任何其他规则之前触发,因为该阶段 "Hope 是 Dead"
规则为 true。
规则 "We 有一个 honest politician"
一旦存在 Hope
对象,"Hope Lives"
规则会匹配并触发。此规则也具有 10
的 salience
值,因此它优先于 "Conest"
规则。
规则"Hope Lives"
最初,四个 honest politicians 存在,因此此规则有四个激活,它们都存在冲突。每个规则依次触发,破坏每个策略,使它们不再被休眠。当所有四个 politician 都损坏时,没有 politicians 属性 honest == true
。规则 "We have a honest Politician"
不再为 true,其逻辑插入的对象(由于上次执行 新 Hope ()
)将自动重新遍历。
规则"Corrupt the Honest"
使用 Hope
对象会自动重新遍历事实维护系统,不适用于
Hope
的 condition 元素不再为 true,因此 "Hope 是 Dead"
规则匹配并触发。
规则"Hope 是 Dead"
执行和审核跟踪示例
在 HonestPoliticianExample.java
类中,会插入四个 politicians,并将 honest 状态设置为 true
,以针对定义的自定义规则进行评估:
HonestPoliticianExample.java class execution
要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.honestpolitician.HonestPoliticianExample
类。
执行后,以下输出会出现在 IDE 控制台窗口中:
IDE 控制台中的执行输出
输出显示,尽管至少有一个 honest politician democracy lives。但是,由于每个 politician 都被一些公司损坏,所有策略都会变得不当,并且 democracy 都被死。
要更好地了解本例的执行流程,您可以修改 HonestPoliticianExample.java
类,使其包含 DebugRuleRuntimeEventListener
侦听器和一个审核日志记录器来查看执行详情:
带有审计日志记录器的 HonestPoliticianExample.java 类
当您使用此修改后的日志记录功能运行 Honest Politician 时,您可以将 target/honestpolitician.log
中的审计日志文件加载到 IDE 调试视图或 审计 视图(例如,在一些 IDE 中显示 窗口
在本例中,审计视图显示 执行流、插入和重新加载actions,如示例类和规则中定义的:
图 19.18. honest Politician 示例审计视图
插入第一个 politician 时,会发生两个激活。规则 "We 有一个 honest Politician"
首次插入的 politician 激活一次,因为它使用 exists
条件元素,它在插入至少一个 politician 时匹配。规则 "Hope is Dead"
也在这个阶段激活,因为 Hope
对象还没有插入。规则 "We 有一个 honest Politician"
触发,因为它具有高于规则 "Hope is Dead"
的 salience
值,并插入 Hope
对象(以绿色表示)。Hope
对象的插入激活规则 "Hope Lives"
,并取消激活规则 "Hope is Dead
"。插入还会激活每个插入的 honest politician 的规则 "Corrupt the Honest
"。规则 "Hope Lives"
被执行并打印 "Hurrah!!!Democracy Lives"
。
接下来,对于每个策略,规则 "Corrupt the Honest"
触发,打印 "I'm a evil certification and I have damage
,其中 X 是 politician 的名称,并将 politician honesty 值改为 X
"false
。当最后一个 honest politician 损坏时,H
ope 会自动被事实维护系统(在蓝色中高)。绿色突出显示区域显示当前选定的蓝色突出显示区域的来源。重新遍历 Hope
事实后,规则 "Hope is dead"
会触发,打印 "We is all Doomed!!!!!!!Democracy 是 Dead"
。