drools rule (三) RHS语法详解

1 用法

右手边(RHS)是规则的后果或行动部分的通用名称; 此部分应包含要执行的操作列表。在规则的RHS中使用命令式或条件式代码是不好的做法; 作为一项规则应该是原子性的 - “当这个,然后做这个”,而不是“当这个,也许这样做”。规则的RHS部分也应保持较小,从而保持其声明性和可读性。如果您发现在RHS中需要命令式和/或条件代码,那么您可能应该将该规则分解为多个规则。RHS的主要目的是插入,删除或修改工作内存数据。为了帮助您,您可以使用一些方便的方法来修改工作记忆; 无需首先引用工作内存实例。

  • update(object, handle);将告诉Drools引擎一个对象已经改变(一个已经绑定到LHS上的东西)并且可能需要重新考虑规则。
  • update(object);也可以使用; 在这里,Knowledge Helper将通过身份检查为您查找传递的对象的事实句柄。(请注意,如果监听了插入Drools引擎的Java bean的属性,则应该避免在对象更改时调用update())。在事实的字段值发生更改后,您必须在更改另一个事实之前调用update,否则您将导致Drools引擎中的索引出现问题。modify关键字可以避免此问题。
  • insert(newSomething());会将你创作的新对象放入Working Memory中。
  • insertLogical(newSomething());类似于insert,但是当没有更多事实支持当前触发规则的true时,对象将被自动删除。
  • delete(handle);从Working Memory中移除一个对象。

这些便捷方法基本上是为你提供了可以快速使用的KnowledgeHelper实例(可以从规则文件访问工作内存)的宏。预定义KnowledgeHelper类型变量drools允许您调用其他几个有用的方法。(KnowledgeHelper有关更高级的操作,请参阅界面文档)。

  • 调用drools.halt()立即终止规则执行。当当前会话是通过fireUntilHalt()进入工作区时,必须调用drools.halt()将控制权返回。

  • 方法insert(Object o)update(Object o)并且delete(Object o)也可以在drools上调用,但由于他们经常使用,所以可以忽略对象引用直接被调用。

  • drools.getWorkingMemory()返回WorkingMemory对象。

  • drools.setFocus( String s) 将焦点设置为指定的议程组。

  • drools.getRule().getName(),从规则的RHS调用,返回规则的名称。

  • drools.getTuple()返回与当前正在执行的规则匹配的Tuple ,drools.getActivation()传递相应的激活。(这些调用对于记录和调试很有用。)

完整的Knowledge Runtime API通过另一个预定义KieContext类型的变量kcontext公开。它的方法getKieRuntime()提供了一个KieRuntime类型的对象,这反过来又提供了对大量方法的访问,其中许多方法对编码RHS逻辑非常有用。

  • 调用kcontext.getKieRuntime().halt()立即终止规则执行。

  • 访问者getAgenda()返回对此会话的Agenda的引用,该会话Agenda又提供对各种规则组的访问: activation groups, agenda groups, and rule flow groups。一个相当普遍的范例是激活一些议程组,这可以通过冗长的call来完成:

    // give focus to the agenda group CleanUp
    kcontext.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus();
    
    (你可以使用drools.setFocus( "CleanUp" )实现相同的功能)
  • 要运行查询,请调用getQueryResults(String query),然后可以处理结果,如“ 查询”一节中所述。使用kcontext.getKieRuntime().getQueryResults()或使用drools.getKieRuntime().getQueryResults()是从规则的RHS运行查询的正确方法,也是唯一受支持的方法。

  • 处理事件管理的一组方法允许您为Working Memory和Agenda添加和删除事件监听器。

  • 方法getKieBase()返回KieBase对象,系统中所有Knowledge 的主干以及当前会话的发起方。

  • 您可以用setGlobal(…​)getGlobal(…​)getGlobals()管理全局。

  • 方法getEnvironment()返回运行时Environment,它的工作方式与您所知的操作系统环境非常相似。

 

2 modify

此语言扩展提供了fact 更新的结构化方法。它将更新操作与许多setter调用相结合,以更改对象的字段。这是modify语句的语法架构:

modify ( <fact-expression> ) {
    <expression> [ , <expression> ]*
}

带括号的<fact-expression>必须生成事实对象引用。块中的表达式列表应包含给定对象的setter调用,而不需要通常的对象引用(编译器自动添加)。该示例说明了一个简单的事实修改。

rule "modify stilton"
when
    $stilton : Cheese(type == "stilton")
then
    modify( $stilton ){
        setPrice( 20 ),
        setAge( "overripe" )
    }
end

当与细粒度属性改变监听器结合使用时,使用修改语句的优点尤其明显。有关详细信息,请参阅相应部分。

猜你喜欢

转载自blog.csdn.net/top_explore/article/details/93873534
今日推荐