14.9. DRL 中的规则操作(THEN)


规则 随后 部分(也称为规则 的右方(RHS) )包含满足规则条件部分时要执行的操作。操作由一个或多个根据规则条件和软件包中可用数据对象执行结果 的方法 组成。例如,如果某个公司需要 Lan applicant 的时间超过 21 年,则规则状况 Applicant (age < 21)和 loan applicant 超过 21 年,那么 "Underage" 规则的操作将被设置为 setApproved (false),因为 applicant 结束了 loan。

规则操作的主要用途是在决策引擎工作内存中插入、删除或修改数据。有效的规则操作是小、声明性和可读。如果您需要在规则操作中使用必需或有条件的代码,请将规则分成多个较小的和更声明性的规则。

loan 应用程序年龄限制的规则示例

rule "Underage"
  when
    application : LoanApplication()
    Applicant( age < 21 )
  then
    application.setApproved( false );
    application.setExplanation( "Underage" );
end
Copy to Clipboard Toggle word wrap

14.9.1. DRL 中支持的规则操作方法

DRL 支持以下规则操作方法,您可以在 DRL 规则操作中使用。您可以使用这些方法修改决策引擎的工作内存,而无需首先引用可正常工作的内存实例。这些方法充当 Red Hat Process Automation Manager 发行版本中的 Knowledgebase Helper 类提供的方法快捷方式。

对于所有规则操作方法,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.9.1 Source Distribution ZIP 文件,再进入到 ~/rhpam-7.9.1-sources/src/drools-$VERSION/drools-core/src/main/java/org/drools/core/spi/KnowledgeHelper.javahttps://access.redhat.com/jbossnetwork/restricted/listSoftware.html

set

使用它来设置字段的值。

set<field> ( <value> )
Copy to Clipboard Toggle word wrap

设置 loan 应用程序批准值的规则操作示例

$application.setApproved ( false );
$application.setExplanation( "has been bankrupt" );
Copy to Clipboard Toggle word wrap

修改

使用它来指定为事实修改的字段,并通知决策引擎的变化。这个方法提供了事实更新的结构化方法。它将 更新操作 与 setter 调用相结合,以更改对象字段。

modify ( <fact-expression> ) {
    <expression>,
    <expression>,
    ...
}
Copy to Clipboard Toggle word wrap

修改 loan 应用程序数量和批准的规则操作示例

modify( LoanApplication ) {
        setAmount( 100 ),
        setApproved ( true )
}
Copy to Clipboard Toggle word wrap

update

使用它来指定要更新的字段和整个相关事实,并通知决策引擎的变化。更改事实后,您必须调用 更新,然后才能更改可能受到更新的值影响的另一个事实。要避免此添加的步骤,请使用 modify 方法。

update ( <object, <handle> )  // Informs the decision engine that an object has changed

update ( <object> )  // Causes `KieSession` to search for a fact handle of the object
Copy to Clipboard Toggle word wrap

更新 loan 应用程序数量和批准的规则操作示例

LoanApplication.setAmount( 100 );
update( LoanApplication );
Copy to Clipboard Toggle word wrap

注意

如果提供 property-change 监听程序,则不需要在对象更改时调用此方法。有关属性更改监听程序的更多信息,请参阅 Red Hat Process Automation Manager 中的 决策引擎

insert

使用此选项将新事实插入到决策引擎的工作内存中,并根据事实的要求定义生成的字段和值。

insert( new <object> );
Copy to Clipboard Toggle word wrap

插入新 loan applicant 对象的规则操作示例

insert( new Applicant() );
Copy to Clipboard Toggle word wrap

insertLogical

使用它来以逻辑方式 将新的 事实插入到决策引擎中。决策引擎负责对事实的插入和重包进行逻辑决策。常规或声明的插入后,必须明确回收事实。逻辑插入后,插入的事实会在插入事实的规则中的条件不再满足满足时自动响应。

insertLogical( new <object> );
Copy to Clipboard Toggle word wrap

逻辑插入一个新的 loan applicant 对象的规则操作示例

insertLogical( new Applicant() );
Copy to Clipboard Toggle word wrap

delete

使用它来从决策引擎中删除对象。DRL 还支持关键字 retract 并执行相同的操作,但 删除 通常在 DRL 代码中首选,以便与关键字 插入 保持一致。

delete( <object> );
Copy to Clipboard Toggle word wrap

删除 loan applicant 对象的规则操作示例

delete( Applicant );
Copy to Clipboard Toggle word wrap

除了标准规则操作方法外,决策引擎还支持方法和预定义的 droolskcontext 变量,您可以在规则操作中使用。

您可以使用 drools 变量从 Red Hat Process Automation Manager 发行版中的 Knowledgebase Helper 类调用方法,这也是标准规则操作方法所基于的类。对于所有 drools 规则操作选项,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.9.1 Source Distribution ZIP 文件,并进入 ~/rhpam-7.9.1-sources/src/drools-$VERSION/drools-core/src/main/java/org/drools/core/spi/KnowledgeHelper.javahttps://access.redhat.com/jbossnetwork/restricted/listSoftware.html

以下示例是可与 drools 变量一起使用的常用方法:

  • drools.halt (): 如果用户或应用程序之前名为 fireUntilHalt (),则终止规则执行。当用户或应用程序调用 fireUntilHalt () 时,决策引擎以 active 模式启动,并持续评估规则,直到用户或应用程序显式调用 halt ()。否则,决策引擎默认以 被动模式 运行,仅当用户或应用程序显式调用 fireAllRules () 时评估规则。
  • drools.getWorkingMemory () :返回 WorkingMemory 对象。
  • drools.setFocus ("<agenda_group>") :设置规则所属的指定机组。
  • drools.getRule ().getName () :返回规则的名称。
  • drools.getActivation () :返回与当前执行规则匹配的 Tuple,然后提供对应的 激活。这些调用可用于记录和调试目的。

您可以将 kcontext 变量与 getKieRuntime () 方法一起使用,从 KieContext 类调用其他方法,并扩展 Red Hat Process Automation Manager 发行版中的 RuleContext 类。完整的知识 Runtime API 通过 kcontext 变量公开,并提供广泛的规则操作方法。对于所有 kcontext 规则操作选项,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.9.1 Source Distribution ZIP 文件,并进入 ~/rhpam-7.9.1-sources/src/kie-api-parent-$VERSION/kie-api/src/main/java/org/kie/api/runtime/rule/RuleContext.javahttps://access.redhat.com/jbossnetwork/restricted/listSoftware.html

以下示例是可与 kcontext.getKieRuntime () 变量组合一起使用的常用方法:

  • kcontext.getKieRuntime ().halt (): 如果用户或应用程序之前名为 fireUntilHalt (),则终止规则执行。这个方法等同于 drools.halt () 方法。当用户或应用程序调用 fireUntilHalt () 时,决策引擎以 active 模式启动,并持续评估规则,直到用户或应用程序显式调用 halt ()。否则,决策引擎默认以 被动模式 运行,仅当用户或应用程序显式调用 fireAllRules () 时评估规则。
  • kcontext.getKieRuntime ().getAgenda () :返回对 KIE 会话 Agenda 的引用,并提供对规则激活组、规则关联组和 ruleflow 组的访问。

    访问销售组"CleanUp"的调用示例并设置重点

    kcontext.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus();
    Copy to Clipboard Toggle word wrap

    这个示例等同于 drools.setFocus ("CleanUp")

  • kcontext.getKieRuntime ().getQueryResults (<string> query) : 运行查询并返回结果。这个方法等同于 drools.getKieRuntime ().getQueryResults ()
  • kcontext.getKieRuntime ().getKieBase (): 返回 KieBase 对象。KIE 基础是您规则系统中的所有知识来源,以及当前 KIE 会话的来源。
  • kcontext.getKieRuntime ().setGlobal (), ~.getGlobal (), ~.getGlobals () :设置或检索全局变量。
  • kcontext.getKieRuntime ().get Environment (): 返回运行时环境,类似于您的操作系统环境。

14.9.3. 带有条件和命名结果的高级规则操作

通常,有效的规则操作是小、声明性和可读。然而,在某些情况下,对每个规则有一个结果的限制可能会有一定难度,并导致详细和重复的规则语法,如下例所示:

带有详细和重复语法的规则示例

rule "Give 10% discount to customers older than 60"
  when
    $customer : Customer( age > 60 )
  then
    modify($customer) { setDiscount( 0.1 ) };
end

rule "Give free parking to customers older than 60"
  when
    $customer : Customer( age > 60 )
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
end
Copy to Clipboard Toggle word wrap

重复的部分解决方案是使第二个规则扩展第一个规则,如下例所示:

带有扩展条件的部分增强的示例规则

rule "Give 10% discount to customers older than 60"
  when
    $customer : Customer( age > 60 )
  then
    modify($customer) { setDiscount( 0.1 ) };
end

rule "Give free parking to customers older than 60"
    extends "Give 10% discount to customers older than 60"
  when
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
end
Copy to Clipboard Toggle word wrap

作为效率更高的替代方案,您可以使用修改条件将两个规则整合到一条规则中,并标记对应的规则操作,如下例所示:

带有条件和命名结果的合并示例规则

rule "Give 10% discount and free parking to customers older than 60"
  when
    $customer : Customer( age > 60 )
    do[giveDiscount]
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
  then[giveDiscount]
    modify($customer) { setDiscount( 0.1 ) };
end
Copy to Clipboard Toggle word wrap

这个示例规则使用两个操作:常见的默认操作,另一个名为 grant Discount 的操作。当 KIE 基础中发现存在 60 年以上的客户时,无论客户是否有问题,都以条件激活 giveDiscount 操作。

您可以使用额外条件配置命名结果的激活,如以下示例中的 if 语句。if 语句中的条件总是在紧接它前的模式上评估。

带有额外条件的合并示例规则

rule "Give free parking to customers older than 60 and 10% discount to golden ones among them"
  when
    $customer : Customer( age > 60 )
    if ( type == "Golden" ) do[giveDiscount]
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
  then[giveDiscount]
    modify($customer) { setDiscount( 0.1 ) };
end
Copy to Clipboard Toggle word wrap

如果构建构建,您还可以使用 嵌套 来评估不同的规则条件,如下例所示:

带有更复杂的条件的合并示例规则

rule "Give free parking and 10% discount to over 60 Golden customer and 5% to Silver ones"
  when
    $customer : Customer( age > 60 )
    if ( type == "Golden" ) do[giveDiscount10]
    else if ( type == "Silver" ) break[giveDiscount5]
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
  then[giveDiscount10]
    modify($customer) { setDiscount( 0.1 ) };
  then[giveDiscount5]
    modify($customer) { setDiscount( 0.05 ) };
end
Copy to Clipboard Toggle word wrap

这个示例规则为黄金客户提供了 10% 的参与和免费服务,但只提供一个 5%,而不会免费给 Silver 客户使用。规则激活名为 give Discount5 的结果,并带有关键字 break 而不是 do。关键字在决策引擎人员中调度结果,使规则条件的剩余部分能够继续评估,同时 会破坏 任何进一步的条件评估。如果命名结果与带有 do 但没有激活的任何条件不匹配,则该规则将无法编译,因为规则条件部分永远不会被达到。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat