我是drools的新手,熟悉使用extends关键字继承规则。问题是有继承多个规则的方法吗?这类似于在java类上使用多个接口。以下是我希望它如何工作的一个示例,但我在规则3中收到错误:
rule "rule 1"
when //person name == "John"
then //print "John"
end
rule "rule 2"
when //person last name == "Smith"
then //print "Smith"
end
rule "rule 3" extends "rule 1", "rule 2"
when //person age > 20
then //print John Smith is older than 20
end
谢谢Dawn
答案 0 :(得分:3)
目前还没有详细记录,但是drools中确实存在单一继承。它允许您创建扩展另一个规则的规则。当且仅当超级规则和子规则的两个条件都为真时,子规则才会触发。 (见底部的笔记)。
在下面的示例中,“Flags”是一个带有2个布尔值的简单Java类:isSuperTrue和isSubTrue。神奇的短语是扩展“超级”,作为“子”规则定义的一部分。规则的名称(子和超级)是说明性的,可以更改为任何合法的规则名称。
rule "super"
@description("Fires when isSuperTrue is true regardless of the state of isSubTrue")
when
$flag : Flags(isSuperTrue == true)
then
System.out.println("super rule should fire anytime super is true and ignore sub");
end
rule "sub" extends "super"
@description("Fires only when both isSubTrue and isSuperTrue are true")
when
Flags(isSubTrue == true)
then
System.out.println("sub rule should fire when both isSubTrue and isSuperTrue are true");
end
注1:5.5.0.Final中有issue,要求将超级规则放在规则定义文件中的子规则之前。我已经确认该错误已针对5.6.0.CR1修复。
注2:此功能在第4.1.1.3节的5.5.0.Final的release notes中间接记录。核心主题是“条件命名后果”,但它利用了规则继承。
答案 1 :(得分:1)
我知道这个帖子已经过时了,但可以做到以下几点:
rule "first name is John rule"
when
$p : Person( name == 'John' )
then
end
rule "last name is Smith rule" extends "first name rule"
when
eval( $p.getLastName() == "Smith" )
then
end
rule "age older than 20 rule" extends "last name rule"
when
eval ( $p.getAge() > 20 )
then
System.out.println($p.getFirstName() + " " + $p.getLastName() +
" is older than 20");
end
rule "age younger than 20 rule" extends "last name rule"
when
eval ( $p.getAge() < 20 )
then
System.out.println($p.getFirstName() + " " + $p.getLastName() +
" is younger than 20");
end
如您所见,您可以从继承其声明变量的超级规则创建链式规则。