2013-12-14 59 views
1

我想實現規則引擎,如果只有一個條件執行,那麼它不會檢查其他指定的條件。如何實現規則如果我只想執行一個規則而不是執行Drools規則引擎中的所有規則?

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 

在上面的例子中,如果coverageText和它的小寫是等於的,那麼我不想檢查另一個規則。
如何在Drools Rule Engine中實現這種性質?

回答

2

這可以通過在Drools中使用議程組來實現。

Quote

議程組是議程劃分成組,並控制其基團可以執行的方法。默認情況下,所有規則都在議程組「MAIN」中。 「議程組」屬性可讓您爲規則指定不同的議程組。最初,工作記憶將重點放在議程小組「主要」上。小組的規則只有在小組獲得焦點時纔會觸發。

例如,當規則「打印出小寫標記」時,您可以將焦點設置到另一個組(不是您提到的兩個規則的組)。當然,你希望首先觸發第一條規則。這可以用更高的顯着性值來完成:

每個規則都有一個整數顯着屬性,默認爲零,可以是負值也可以是正值。顯着性是一種優先級,在激活隊列中排序時,具有較高顯着性值的規則具有較高的優先級。

+0

您有任何與您的意見相關的文章嗎? – unknown

+1

這不是我的意見,而是來自文檔的引用。但可能我會這樣做。與幾乎所有事情一樣,實現某些東西的方式不止一種。您需要選擇最適合您的問題+品味的解決方案。 –

2

如果您只有一些規則,@ 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

執行順序可以通過顯着性來控制。所以我對你有同樣的問題,你有沒有關於議程組的文章或例子? – unknown

+0

我會盡量避免使用突出性來控制執行順序。有時候這是最好的解決方案,但通常這會讓你的規則很難讀取/調試和脆弱。不,我目前無法就此提供任何文章。 – kaskelotti

+0

那麼你會用什麼來控制執行順序? – unknown