第 79 章 决策引擎中的 inference 和 real Maintenance
决策引擎的基本功能是将数据与新规则匹配,并确定是否以及如何执行规则。为确保将相关数据应用到适当的规则,决策引擎根据现有知识进行差异,并根据推断的信息执行操作。
例如,以下 DRL 规则决定了 adults 的年龄要求,比如在总线传递策略中:
定义年龄要求的规则
rule "Infer Adult"
when
$p : Person(age >= 18)
then
insert(new IsAdult($p))
end
根据此规则,决策引擎会推断人是行为还是子级,并执行指定的操作( 然后是结果 )。每个存在 18 年或更早的人都会在其工作内存中插入了 IsAdult 实例。然后,可以在任何规则中调用年龄和总线传递的关系,例如在以下规则片段中:
$p : Person()
IsAdult(person == $p)
在很多情况下,规则系统中的新数据是其他规则执行的结果,这种新数据可能会影响对其他规则的执行。如果作为执行规则而决策引擎数据,则决策引擎将使用真实维护来证明断言并在将信息应用到其他规则时强制实施真实性。实时维护还有助于识别不一致和处理拥塞。例如,如果执行两个规则并导致持续操作,则决策引擎会根据之前计算的方中的假设选择操作。
决策引擎使用声明或逻辑插入插入事实:
-
上述插入: 使用
insert ()定义。在声明了插入后,通常会明确回收事实。(一般使用术语 插入. ) -
逻辑插入: 使用
insertLogical ()定义.逻辑插入后,插入的事实会在插入事实的规则中的条件不再满足满足时自动响应。当没有条件支持逻辑插入时,会重新传输事实。逻辑插入的事实被视为由 决策 引擎表示。
例如,以下示例 DRL 规则使用上述事实插入来确定发出子总线传递或 adult 总线传递的年龄要求:
发布总线传递的规则,声明插入
rule "Issue Child Bus Pass"
when
$p : Person(age < 18)
then
insert(new ChildBusPass($p));
end
rule "Issue Adult Bus Pass"
when
$p : Person(age >= 18)
then
insert(new AdultBusPass($p));
end
这些规则无法在决策引擎中轻松维护,因为总线 riders 在年龄内增加,并从子总线移到 adult 总线通过。作为替代方案,这些规则可以使用逻辑事实插入将这些规则分成总线 rider 年龄和规则,以用于总线传递类型。事实的逻辑插入使事实取决于 when 子句的真实情况。
以下 DRL 规则使用逻辑插入来确定子项和程序的年龄要求:
子项和临时年龄要求、逻辑插入
rule "Infer Child"
when
$p : Person(age < 18)
then
insertLogical(new IsChild($p))
end
rule "Infer Adult"
when
$p : Person(age >= 18)
then
insertLogical(new IsAdult($p))
end
对于逻辑插入,您的事实对象必须根据 Java 标准覆盖 java.lang.Object 对象中的等同和 hashCode 方法。如果两个对象相互返回 true,且其 hashCode 方法返回相同的值,则两个对象是相等的。如需更多信息,请参阅 Java 版本的 Java API 文档。
当规则中的条件为 false 时,会自动重新传输事实。这个行为在本示例中很有用,因为两个规则是互斥的。在这个示例中,如果人员存在时间超过 18 年,则规则逻辑地插入了 IsChild 事实。人员为 18 年或更早的版本后,S raeChild 事实会自动重新处理,并插入 IsAdult 事实。
然后,以下 DRL 规则决定是否发出子总线通过还是一个临时总线通过,并逻辑插入 ChildBusPass 和 AdultBusPass 事实。此规则配置是可能的,因为决策引擎中的事实维护系统支持对一组级联重新发送的逻辑插入链。
签发总线通过的规则,逻辑插入
rule "Issue Child Bus Pass"
when
$p : Person()
IsChild(person == $p)
then
insertLogical(new ChildBusPass($p));
end
rule "Issue Adult Bus Pass"
when
$p : Person()
IsAdult(person =$p)
then
insertLogical(new AdultBusPass($p));
end
当一个人接近 18 年时,会重新利用了 IsChild 事实和个人的 ChildBusPass 事实。对于这些条件,您可以关联另一个规则,说明个人在打开 18 年后必须返回子通过。当决策引擎自动重新遍历 ChildBusPass 对象时,将执行以下规则向人发送请求:
通知总线通过拥有者的新传递的规则
rule "Return ChildBusPass Request"
when
$p : Person()
not(ChildBusPass(person == $p))
then
requestChildBusPass($p);
end
以下流图演示了声明和逻辑插入的生命周期:
图 79.1. 声明的插入
图 79.2. 逻辑插入
当在规则执行期间以逻辑方式插入对象时,决策引擎通过执行规则来说明对象。对于每个逻辑插入,只能有一个相等的对象,每个后续相同的逻辑插入会增加该逻辑插入的简化计数器。当规则条件变为 untrue 时,会删除说明。如果没有更多原因,则会自动重新处理逻辑对象。
79.1. 决策引擎中的事实相等模式 复制链接链接已复制到粘贴板!
决策引擎支持以下事实相等模式,它们决定了决策引擎如何存储和比较插入的事实:
-
身份:(默认)决策引擎使用IdentityHashMap来存储所有插入的事实。对于每个新事实插入,决策引擎会返回一个新的factHandle对象。如果再次插入事实,决策引擎会返回原始的factHandle对象,忽略同一事实的重复插入。在这个模式中,只有当它们具有相同的身份时,决策引擎的两个事实才相同。 -
相等: 决策引擎使用HashMap来存储所有插入的事实。只有在插入的事实不等于现有事实() 方法时,决策引擎才会返回一个新的 factHandle对象。在这个模式中,无论身份是什么,决策引擎的两种事实与决策引擎相同。当您希望根据功能相等而不是显式身份评估对象时,请使用此模式。
作为事实相等模式的一个说明,请考虑以下示例事实:
事实示例
Person p1 = new Person("John", 45);
Person p2 = new Person("John", 45);
在 身份 模式中,fact p1 和 p2 是 Person 类的不同实例,并被视为单独的对象,因为它们有单独的身份。在 相等 模式下,事实 p1 和 p2 被视为同一对象,因为它们以相同的方式组成。这个行为差异会影响您可以如何与事实处理进行交互。
例如,假设您将事实 p1 和 p2 插入到决策引擎中,您要检索 p1 的事实处理。在 身份 模式中,您必须指定 来返回该精确对象的事实处理,而在 p1 相等 模式下,您可以指定 p1、p2 或 新的 Person ("John", 45) 来返回事实句柄。
插入事实代码并在 身份 模式下返回事实句柄的示例
ksession.insert(p1);
ksession.getFactHandle(p1);
插入事实和以 相等 模式返回事实句柄的代码示例
ksession.insert(p1);
ksession.getFactHandle(p1);
// Alternate option:
ksession.getFactHandle(new Person("John", 45));
要设置事实相等模式,请使用以下选项之一:
-
将系统属性
drools.equalityBehavior设置为identity(默认)或相等性。 在以编程方式创建 KIE 基础时设置相等模式:
KieServices ks = KieServices.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(EqualityBehaviorOption.EQUALITY); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);在 KIE 模块描述符文件(
kmodule.xml)中为特定的 Red Hat Process Automation Manager 项目设置相等模式:<kmodule> ... <kbase name="KBase2" default="false" equalsBehavior="equality" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1"> ... </kbase> ... </kmodule>