2013-01-15 197 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 

正如你所看到的,您可以創建超規則的繼承他們的聲明的變量鏈規則。