第 82 章 在决策引擎中影响和真相维护


决策引擎的基本功能是将数据与业务规则匹配,并确定是否执行规则。为确保相关的数据应用于适当的规则,决策引擎会基于现有知识进行评分,并根据推断的信息执行操作。

例如,以下 DRL 规则决定了 adults 的年龄要求,如在总线密码短语策略中:

定义年龄要求的规则

rule "Infer Adult"
when
  $p : Person(age >= 18)
then
  insert(new IsAdult($p))
end
Copy to Clipboard Toggle word wrap

根据此规则,决策引擎是个人是dult 还是一个子级,它会执行指定的操作( 然后是 结果)。每个已有 18 周年或更早的人都会在工作内存中插入了 IsAdult 实例。然后可以在任何规则中调用这种年龄和总线传递关系,比如以下规则片段:

$p : Person()
IsAdult(person == $p)
Copy to Clipboard Toggle word wrap

在很多情况下,规则系统中的新数据是其他规则执行的结果,这种新数据可能会影响其他规则的执行。如果决策引擎因为执行规则而断言数据,则决策引擎利用真相维护来证明断言并在将信息应用到其他规则时执行真实性。真相维护还有助于识别不一致和处理预测。例如,如果执行两条规则并导致分类操作,则决策引擎根据之前计算的结论选择操作。

决策引擎使用声明或逻辑插入来插入事实:

  • 声明插入: 使用 insert() 定义的 .在声明了插入后,通常会明确指定事实。(一般 使用时插入 的术语称为" 插入"。
  • 逻辑插入: Defined with insertLogical().逻辑插入后,当插入事实的条件不再为 true 时,插入的事实会自动清空。当没有条件支持逻辑插入时,会重试事实。逻辑插入的事实被视为由 决策 引擎规定。

例如,以下 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
Copy to Clipboard Toggle word wrap

这些规则在决策引擎中无法轻松维护,因为总线死机增长,从子到双lt 总线传递。或者,通过逻辑事实插入,这些规则也可以分隔为总线取用器年龄和规则的规则。事实的逻辑插入取决于 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
Copy to Clipboard Toggle word wrap

重要

对于逻辑插入,您的事实对象必须根据 Java 标准覆盖 java.lang.Object 对象中的等和 散列 方法。如果两个对象 等于 不同的方法是否相互返回 true,如果它们 的散列 代码方法返回相同的值,则有两个对象相等。如需更多信息,请参阅您的 Java 版本的 Java API 文档。

当规则中的条件为 false 时,该事实会被自动重试。这个行为在本示例中非常有用,因为这两个规则是相互排斥的。在本例中,如果人比 18 年年长,则规则逻辑插入 IsChild 事实。个人已有 18 年或更早时间之后,IsChild 事实会自动调整,并插入 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
Copy to Clipboard Toggle word wrap

当某个人名超过 18 年时,IsChild 事实和个人的 子进程BusPass 事实会被重新处理。在这组条件下,您可以关联另一条规则,指出某人在 18 年后必须返回该子通过。当决策引擎自动对 ChildBusPass 对象进行响应时,将执行以下规则来向该用户发送请求:

用于通知总线新传递拥有者的规则

rule "Return ChildBusPass Request"
when
  $p : Person()
    not(ChildBusPass(person == $p))
then
  requestChildBusPass($p);
end
Copy to Clipboard Toggle word wrap

以下流程图演示了声明和逻辑插入的生命周期:

图 82.1. 规定的插入

图 82.2. 逻辑插入

当决策引擎在规则执行过程中插入对象时,决策引擎通过执行规则来统一对象。对于每个逻辑插入,只能有一个相等的对象,每个后续相同的逻辑插入会增加该逻辑插入的论证计数器。当规则条件变为 untrue 时,将删除拒绝。当存在其他合理性时,会自动对逻辑对象进行重新处理。

82.1. 在决策引擎中事实相等模式

决策引擎支持以下事实制度模式,决定决策引擎如何存储并比较插入的事实:

  • 身份 :(默认)决策引擎使用 IdentityHashMap 存储所有插入的事实。对于每个新事实插入,决策引擎会返回一个新的 factHandle 对象。如果再次插入了事实,则决策引擎会返回原始 事实事实,忽略同一事实的重复插入。在这个模式中,只有在决策引擎是具有相同身份的同一个对象时,两个事实才是相同的。
  • 性:决策引擎使用 HashMap 来存储所有插入的事实。根据插入的事实不等于现有事实,决策引擎才会返回新的事实(fact)对象。 在这个模式中,如果决策引擎的组成方式,两个事实都是一样的,无论身份,都一样。当您希望基于功能相等而非显式身份评估对象时,请使用此模式。

举一个事实相同的模式,请考虑以下示例事实:

事实示例

Person p1 = new Person("John", 45);
Person p2 = new Person("John", 45);
Copy to Clipboard Toggle word wrap

身份 模式中,事实 p1p2Person 类的不同实例,并且被视为单独的对象,因为它们具有单独的身份。在等模式下,事实 p1p2 被视为同一对象,因为它们以相同的方式组成。行为的区别在于,您可以如何与事实句柄进行交互。

例如,假设您将事实 p1p2 插入到决策引擎中,稍后您要检索 p1 的事实句柄。在 身份 模式中,您必须指定 p1 才能返回该确切对象的事实句柄,而以等性模式,您可以指定 p1、 p2新的 Person("John" 45) 来返回事实句柄。

身份 模式下插入事实并返回事实(fact)的代码示例

ksession.insert(p1);

ksession.getFactHandle(p1);
Copy to Clipboard Toggle word wrap

插入事实的代码示例,并以 相等 模式返回事实句柄

ksession.insert(p1);

ksession.getFactHandle(p1);

// Alternate option:
ksession.getFactHandle(new Person("John", 45));
Copy to Clipboard Toggle word wrap

要设置事实相等模式,请使用以下选项之一:

  • 将系统属性 drools.equalityBehavior 设置为 identity (默认)或 equality
  • 以编程方式创建 KIE 基础,设置相等模式:

    KieServices ks = KieServices.get();
    KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration();
    kieBaseConf.setOption(EqualityBehaviorOption.EQUALITY);
    KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
    Copy to Clipboard Toggle word wrap
  • 在 KIE 模块描述符文件(kmodule.xml)中为特定红帽决策管理器项目设置相等模式:

    <kmodule>
      ...
      <kbase name="KBase2" default="false" equalsBehavior="equality" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1">
        ...
      </kbase>
      ...
    </kmodule>
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat