第 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 规则决定是否发出子总线通过还是一个临时总线通过,并逻辑插入 ChildBusPassAdultBusPass 事实。此规则配置是可能的,因为决策引擎中的事实维护系统支持对一组级联重新发送的逻辑插入链。

签发总线通过的规则,逻辑插入

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 来存储所有插入的事实。只有在插入的事实不等于现有事实() 方法时,决策引擎才会返回一个新的 fact Handle 对象。在这个模式中,无论身份是什么,决策引擎的两种事实与决策引擎相同。当您希望根据功能相等而不是显式身份评估对象时,请使用此模式。

作为事实相等模式的一个说明,请考虑以下示例事实:

事实示例

Person p1 = new Person("John", 45);
Person p2 = new Person("John", 45);

身份 模式中,fact p1p2Person 类的不同实例,并被视为单独的对象,因为它们有单独的身份。在 相等 模式下,事实 p1p2 被视为同一对象,因为它们以相同的方式组成。这个行为差异会影响您可以如何与事实处理进行交互。

例如,假设您将事实 p1p2 插入到决策引擎中,您要检索 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>
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部