2013-01-15 139 views
4

我是新来的dr​​ools,并且熟悉使用extends关键字来继承规则。问题是否有办法继承多个规则?这将类似于在java类中使用多个接口。下面是我怎么会想到它的工作的例子,但我得到的第3条的错误:drools规则继承

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 

感谢黎明

回答

3

它不是有据可查的是,但单继承并在Drools中存在。它允许您创建一个扩展另一个规则的规则。当且仅当超级规则和子规则的条件都为真时,子规则才会触发。 (请参阅我的笔记底部)。

在下面的例子中,“Flags”是一个带有2个布尔值的简单Java类:isSuperTrue和isSubTrue。神奇的短语是将“超级”扩展为“子”规则定义的一部分。规则名称(sub和super)是说明性的,可以更改为任何合法规则名称。

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:该功能在release notes中间接记录为4.1.1.3中的5.5.0.Final。核心主题是“有条件的命名结果”,但它利用了规则继承。

+1

Mike - 是drools构造之上的@Description注释吗?如果是这样,你能告诉我更多关于它的用途吗?我从来没有见过,似乎无法找到它的任何文件... – JoshC13

+0

@ JoshC13查找规则元数据 –

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 

正如你所看到的,您可以创建超规则的继承他们的声明的变量链规则。