我想实现规则引擎,如果只执行一个条件,则不会检查其他指定的条件。
rule "Print out lower-case tokens"
when
Token ( coveredText == coveredText.toLowerCase )
then
System.out.println("Found a lower case token with text");
end
rule "Print out long tokens with more than 5 characters"
when
Token ( tokenText : coveredText, end - begin > 5 )
then
System.out.println("Found a long token with more than 5 characters \"" + tokenText + "\"");
end
在上面的例子中,如果coveredText及其小写是等于那么我不想检查另一个规则
如何在Drools Rule Engine
中实现这种性质?
答案 0 :(得分:3)
如果你只有一些规则,@ K.C提到的议程小组。为你的目的可能太“沉重”。在更简单的情况下,我只是添加一个事实来标记不再应该触发规则,比如这个
declare AlreadyProcessed
end
rule "Print out lower-case tokens"
when
not AlreadyProcessed()
Token ( coveredText == coveredText.toLowerCase )
then
System.out.println("Found a lower case token with text");
insert( new AlreadyProcessed() );
end
rule "Print out long tokens with more than 5 characters"
when
not AlreadyProcessed()
Token ( tokenText : coveredText, end - begin > 5 )
then
System.out.println("Found a long token with more than 5 characters \"" + tokenText + "\"");
insert( new AlreadyProcessed() );
end
如上所述,如果需要,您可以通过显着性控制执行顺序。
答案 1 :(得分:2)
这可以通过在Drools中使用议程组来实现。
议程小组是将议程分成小组并控制哪些小组可以执行的一种方式。默认情况下,所有规则都在议程组“MAIN”中。 “agenda-group”属性允许您为规则指定不同的议程组。最初,工作记忆的重点是议程组“MAIN”。只有在获得焦点时,组才会触发规则。
例如,当规则“打印小写令牌”触发时,您可以将焦点设置为另一个组(不是您提到的两个规则的组)。当然,您希望首先触发第一条规则。这可以通过更高的突出值来完成:
每个规则都有一个整数显着性属性,默认为零,可以为负数或正数。显着性是一种优先级形式,其中具有较高显着性值的规则在激活队列中排序时具有更高的优先级。
答案 2 :(得分:1)
activation-group
提供此功能。 Drools wiki
激活组默认值:N / A
type:String
属于同一激活组的规则,由此标识 属性的字符串值,只会以独占方式触发。换一种说法, 要激活的激活组中的第一个规则将取消另一个规则 规则'激活,即阻止他们开火。
注意:这曾经被称为Xor组,但从技术上讲它并不完全 Xor。你可能仍然会听到人们提到Xor组;只是换掉那个 激活群体在你的脑海中占据一席之地。
例如:只会执行us1-
rule "us1"
activation-group "1"
dialect "java"
when
eval ( 1==1 )
then
System.out.println("us1" );
end
rule "us2"
activation-group "1"
dialect "mvel"
when
eval ( 1==1 )
then
System.out.println("us2" );
end