第 82 章 在决策引擎中影响和真相维护
决策引擎的基本功能是将数据与业务规则匹配,并确定是否执行规则。为确保相关的数据应用于适当的规则,决策引擎会基于现有知识进行评分,并根据推断的信息执行操作。
例如,以下 DRL 规则决定了 adults 的年龄要求,如在总线密码短语策略中:
定义年龄要求的规则
根据此规则,决策引擎是个人是dult 还是一个子级,它会执行指定的操作( 然后是
结果)。每个已有 18 周年或更早的人都会在工作内存中插入了 IsAdult
实例。然后可以在任何规则中调用这种年龄和总线传递关系,比如以下规则片段:
$p : Person() IsAdult(person == $p)
$p : Person()
IsAdult(person == $p)
在很多情况下,规则系统中的新数据是其他规则执行的结果,这种新数据可能会影响其他规则的执行。如果决策引擎因为执行规则而断言数据,则决策引擎利用真相维护来证明断言并在将信息应用到其他规则时执行真实性。真相维护还有助于识别不一致和处理预测。例如,如果执行两条规则并导致分类操作,则决策引擎根据之前计算的结论选择操作。
决策引擎使用声明或逻辑插入来插入事实:
-
声明插入: 使用
insert()
定义的 .在声明了插入后,通常会明确指定事实。(一般 使用时插入 的术语称为" 插入"。 ) -
逻辑插入: Defined with
insertLogical()
.逻辑插入后,当插入事实的条件不再为 true 时,插入的事实会自动清空。当没有条件支持逻辑插入时,会重试事实。逻辑插入的事实被视为由 决策 引擎规定。
例如,以下 DRL 规则使用指定的事实插入来确定发出子总线通过或 adult 总线传递的年龄要求:
提供总线通行证的规则,声明插入
这些规则在决策引擎中无法轻松维护,因为总线死机增长,从子到双lt 总线传递。或者,通过逻辑事实插入,这些规则也可以分隔为总线取用器年龄和规则的规则。事实的逻辑插入取决于 when
子句的真相。
以下 DRL 规则使用逻辑插入来确定子和临时的年龄要求:
子代和同线要求、逻辑插入
对于逻辑插入,您的事实对象必须根据 Java 标准覆盖 java.lang.Object
对象中的等和 散列
方法。如果两个对象
等于
不同的方法是否相互返回 true
,如果它们 的散列
代码方法返回相同的值,则有两个对象相等。如需更多信息,请参阅您的 Java 版本的 Java API 文档。
当规则中的条件为 false 时,该事实会被自动重试。这个行为在本示例中非常有用,因为这两个规则是相互排斥的。在本例中,如果人比 18 年年长,则规则逻辑插入 IsChild
事实。个人已有 18 年或更早时间之后,IsChild
事实会自动调整,并插入 IsAdult
事实。
然后,以下 DRL 规则决定是否发出子总线通过或逻辑方式插入 ChildBusPass
和 AdultBusPass
事实。这个规则配置是可行的,因为决策引擎中的相依性维护系统支持连锁逻辑插入集。
用于发布总线传递的规则,逻辑插入
当某个人名超过 18 年时,IsChild
事实和个人的 子进程BusPass
事实会被重新处理。在这组条件下,您可以关联另一条规则,指出某人在 18 年后必须返回该子通过。当决策引擎自动对 ChildBusPass
对象进行响应时,将执行以下规则来向该用户发送请求:
用于通知总线新传递拥有者的规则
以下流程图演示了声明和逻辑插入的生命周期:
图 82.1. 规定的插入
图 82.2. 逻辑插入
当决策引擎在规则执行过程中插入对象时,决策引擎通过执行规则来统一对象。对于每个逻辑插入,只能有一个相等的对象,每个后续相同的逻辑插入会增加该逻辑插入的论证计数器。当规则条件变为 untrue 时,将删除拒绝。当存在其他合理性时,会自动对逻辑对象进行重新处理。
82.1. 在决策引擎中事实相等模式 复制链接链接已复制到粘贴板!
决策引擎支持以下事实制度模式,决定决策引擎如何存储并比较插入的事实:
-
身份
:(默认)决策引擎使用IdentityHashMap
存储所有插入的事实。对于每个新事实插入,决策引擎会返回一个新的factHandle
对象。如果再次插入了事实,则决策引擎会返回原始事实事实
,忽略同一事实的重复插入。在这个模式中,只有在决策引擎是具有相同身份的同一个对象时,两个事实才是相同的。 -
等
性:决策引擎使用HashMap
来存储所有插入的事实。根据插入的事实不等于现有事实,决策引擎才会返回新的事实(fact)对象。在这个模式中,如果决策引擎的组成方式,两个事实都是一样的,无论身份,都一样。当您希望基于功能相等而非显式身份评估对象时,请使用此模式。
举一个事实相同的模式,请考虑以下示例事实:
事实示例
Person p1 = new Person("John", 45); Person p2 = new Person("John", 45);
Person p1 = new Person("John", 45);
Person p2 = new Person("John", 45);
在 身份
模式中,事实 p1
和 p2
是 Person
类的不同实例,并且被视为单独的对象,因为它们具有单独的身份。在等模式下,事实 p1
和 p2
被视为同一对象,因为它们以相同的方式组成。行为的区别在于,您可以如何与事实句柄进行交互。
例如,假设您将事实 p1
和 p2
插入到决策引擎中,稍后您要检索 p1
的事实句柄。在 身份
模式中,您必须指定 p1
才能返回该确切对象的事实句柄,而以等性模式,您可以指定 p1、
p2
或 新的 Person("John" 45)
来返回事实句柄。
在 身份
模式下插入事实并返回事实(fact)的代码示例
ksession.insert(p1); ksession.getFactHandle(p1);
ksession.insert(p1);
ksession.getFactHandle(p1);
插入事实的代码示例,并以 相等
模式返回事实句柄
要设置事实相等模式,请使用以下选项之一:
-
将系统属性
drools.equalityBehavior
设置为identity
(默认)或equality
。 以编程方式创建 KIE 基础,设置相等模式:
KieServices ks = KieServices.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(EqualityBehaviorOption.EQUALITY); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
KieServices ks = KieServices.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(EqualityBehaviorOption.EQUALITY); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 KIE 模块描述符文件(
kmodule.xml
)中为特定红帽决策管理器项目设置相等模式:Copy to Clipboard Copied! Toggle word wrap Toggle overflow