1 用法
右手边(RHS)是规则的后果或行动部分的通用名称; 此部分应包含要执行的操作列表。在规则的RHS中使用命令式或条件式代码是不好的做法; 作为一项规则应该是原子性的 - “当这个,然后做这个”,而不是“当这个,也许这样做”。规则的RHS部分也应保持较小,从而保持其声明性和可读性。如果您发现在RHS中需要命令式和/或条件代码,那么您可能应该将该规则分解为多个规则。RHS的主要目的是插入,删除或修改工作内存数据。为了帮助您,您可以使用一些方便的方法来修改工作记忆; 无需首先引用工作内存实例。
update(
object, handle);
将告诉Drools引擎一个对象已经改变(一个已经绑定到LHS上的东西)并且可能需要重新考虑规则。update(
object);
也可以使用; 在这里,Knowledge Helper将通过身份检查为您查找传递的对象的事实句柄。(请注意,如果监听了插入Drools引擎的Java bean的属性,则应该避免在对象更改时调用update()
)。在事实的字段值发生更改后,您必须在更改另一个事实之前调用update,否则您将导致Drools引擎中的索引出现问题。modify关键字可以避免此问题。insert(new
Something());
会将你创作的新对象放入Working Memory中。insertLogical(new
Something());
类似于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
当与细粒度属性改变监听器结合使用时,使用修改语句的优点尤其明显。有关详细信息,请参阅相应部分。