6

私は 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
4

2 に答える 2

3

まだ十分に文書化されていませんが、単一の継承は drools に存在します。別のルールを拡張するルールを作成できます。サブ ルールは、スーパー ルールとサブ ルールの両方の条件が true の場合にのみ実行されます。(一番下の私のメモを参照してください)。

以下の例では、"Flags" は 2 つのブール値 (isSuperTrue と isSubTrue) を持つ単純な Java クラスです。マジック フレーズは、「サブ」ルール定義の一部として「スーパー」を拡張します。ルールの名前 (サブおよびスーパー) は説明用であり、任意の有効なルール名に変更できます。

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 には、ルール定義ファイルでサブ ルールの前にスーパー ルールを配置する必要があるという問題があります。5.6.0.CR1でバグが修正されていることを確認しました。

注 2: この機能は、セクション 4.1.1.3 の 5.5.0.Finalのリリース ノートに間接的に記載されています。中心的なトピックは「条件付きの名前付き結果」ですが、ルールの継承を活用しています。

于 2013-11-16T21:02:20.253 に答える