Droolsルールエンジンシリーズ教程(二)Drools規則文法&LHS条件


Droolsルールエンジンシリーズ教程(一)SprigBoot整合&高速集成上手
Droolsルールエンジンシリーズ教程(三)Drools規則文法&RHS動作&header詳細
Droolsルールエンジンシリーズ教程(四)Drools主なAPIと方策決定表
教程コードはすでにytoo-droolsに提出しました。starを歓迎します。
文のコード方法は前の教程に基づいています。
1.drlファイル構造
  • Packageパケットは、ルールごとに一意の名前空間として機能する。一つの規則ライブラリには複数のパッケージが含まれています。一般的に、パッケージのすべてのルールは、パッケージが独立するように、同じファイルに格納されます。しかし、他のパケットから導入されたオブジェクト
  • を規則的に使用しても良い。
  • importは、規則で使用される任意のオブジェクトの標準パスおよびタイプ名を識別するためにJava中のimport文と同様である。
  • factios関数コードブロック例:
  • function String hello(String applicantName) {
        return "Hello " + applicantName + "!";
    }
    
  • queries DroolsエンジンのワークメモリからDRLファイルのルールに関する事実を検索します。
    query "people under the age of 21"
        $person : Person( age < 21 )
    end
    
  • globalは、規則的にデータまたはサービスを提供する
  • .rulesルール
  • 1.1 import java方法及びfunctionの導入
    _; import&functionは次のセクションで詳しく説明してください。私を連れて飛んで行きます。
    1.2 glableグローバル変数
      グローバル変数は、次のセクションで詳しく説明します。私を連れて飛んで行きます。
    1.3 querysクエリ
      querysクエリは次のセクションで詳しく説明してください。私を連れて飛んで行きます。
    1.4 declareカスタムfactオブジェクト
      declareは次のセクションで詳しく説明します。私を連れて飛んで行きます。
    2.rulesルール
    2.1 drl属性
    属性
    説明
    salience
    ルール優先度を指定する整数は、値が大きいほど優先度が高いです。
    enaboled
    ルール有効スイッチ
    date-effective
    日付と時間が定義された文字列が含まれます。現在の日付と時間がdate-effective属性の後にある場合のみ、この規則がアクティブになります。
    date-expires
    現在の日付と時間がdate-expires属性の後にある場合、この規則はアクティブになりません。
    no-loop
    このオプションを選択すると、規則の結果が以前に満足していた条件を再起動した場合、規則を再起動できません。条件が選択されていない場合は、これらの場合に規則が循環します。
    アジェンダグループ
    ルールを割り当てる議題グループを表示します。
    activationn-group
    グループをアクティブにします。グループは一つのルールしかアクティブにできません。トリガされた最初のルールは、グループ内のすべてのルールの未決のアクティブ化をキャンセルします。
    duration
    規則条件が満たされている場合は、規則の継続時間を有効にすることができる(ミリ秒単位)と定義されています。
    timer
    クロンタイミング表現
    カレンダ
    時計
    aut-focus
    議題グループのルールのみ適用されます。このオプションを選択すると、今度はこの規則をアクティブにすると、規則が割り当てられた議題グループにフォーカスが自動的に割り当てられます。
    lock-on-active
    no-loop属性の強い版
    ruleflow-group
    ルールストリームグループを識別する文字列
    dialect
    ルールを識別するコード表式JAVAまたはMVELは言語として使われます。
    2.2マッチングモード
    2.2.1制約のないマッチングモード
    実際のことは、任意の条件を満たす必要はありません。タイプが同じなら、この規則をトリガします。
    package com.ytooo.bean
    import com.ytooo.bean.People
    dialect  "java"
    
    rule "girl"
        when
            People()
        then
            System.out.println("girl    ");
    end
    
    2.2.2条件付きマッチングモード
    実際のタイプは同じで、条件を満たすと、この規則をトリガします。
    package com.ytooo.bean
    import com.ytooo.bean.People
    dialect  "java"
    
    rule "girl"
        when
            People(sex == 0 && drlType == "people")
        then
            System.out.println("girl    ");
    end
    
    2.2.3属性と実際のものをマッチングしてバインディングする
    実際のタイプは同じで、条件を満たすと、この規則をトリガし、データをバインディングします。
    package com.ytooo.bean
    import com.ytooo.bean.People
    dialect  "java"
    
    rule "girl"
        when
             $p:People(sex == 0,$sex : sex && drlType == "people")
        then
            System.out.println("girl    ");
            System.out.println($p);
            System.out.println($sex);
    end
    
    2.3条件
    and、orなどルール条件を結合した複数のモードでは、キーワードの連語が定義されていません。デフォルトはandです。
    package com.ytooo.bean
    import com.ytooo.bean.People
    import com.ytooo.bean.Cat
    dialect  "java"
    
    rule "girl"
        when
            People(sex == 0) and
            Cat(sex == 0)
        then
            System.out.println("girl    ");
    end
    
    2.4制約
    _; 標準Java演算子優先度はDRLの制約演算子に適用され、DRl演算子==和!=演算子以外は標準Java語義に従う。
    _; ドの中でPersonは似ています。java.util.Objects.equals(person.get First Name(),“John”)
    制約
    説明
    !.
    この演算子を使うと、参照属性を空の安全でキャンセルできます。演算子の左側の値はnullとは解釈できません。
    []
    Listインデックスのアクセス値またはMapキーのアクセス値を押します。
    を選択します
    自然な順序の属性にこれらの演算子を使用します。
    ===
    これらの演算子は制約においてequals()として使用される。equals()メソッド
    𞓜𞓜
    グループ関係条件
    matches,not matches
    これらの演算子を使用すると、指定されたJava正則表現とフィールドが一致するか、または一致しないかを示すことができます。
    contains,not contains
    これらの演算子を使用して、Arayまたはフィールドが指定値を含むかどうか検証できます。
    member Of,not memberrOf
    これらの演算子を使用して、フィールドが変数Arayと定義されたメンバーであるかどうかを検証できます。
    soundslike
    英語の発音を使って単語が所与の値とほぼ同じ音を持つかどうかを検証します。
    n,notin
    これらの演算子を使用して、制約(合成値制限)に適合するために、1つ以上の可能な値を指定することができる。
    2.4.1制約デモ
      は公的文書から来ています。
  • matches、not matches
  • Person( country matches "(USA)?\\S*UK" )
    Person( country not matches "(USA)?\\S*UK" )
    
  • contains、not contains
  • FamilyTree(countries contains "UK" )
    Person( fullName not contains "Jr" )
    FamilyTree(countries contains $var)
    Person( fullName not contains $var )
    
  • member Of、not memberrOf
  • FamilyTree( person memberOf $europeanDescendants )
    FamilyTree( person not memberOf $europeanDescendants )
    
    2.5集合
    2.5.1 fromはセットの中の要素を取ります。
    bean Animalの新規作成
    package com.ytooo.bean;
    import lombok.Data;
    import java.util.List;
    
    /**
     * Created by Youdmeng on 2020/1/7 0007.
     */
    @Data
    public class Animal {
    
        private Integer level;
    
        private List<People> peoples;
    
    }
    
    新規from.drl
    package com.ytooo.frm
    dialect "java"
    import com.ytooo.bean.People
    import com.ytooo.bean.Animal
    
    rule "from"
    when
        $an : Animal()
        $p : People(sex != 3 && drlType == "from") from $an.peoples
        then
            System.out.println($p);
        end
    
    新規試験方法
    @Test
    public void from() {
        People p1 = new People(1," ","from");
        People p2 = new People(0," ","from");
        People p3 = new People(3," ","from");
        Animal animal = new Animal();
        animal.setPeoples(new ArrayList<>());
        animal.getPeoples().add(p1);
        animal.getPeoples().add(p2);
        animal.getPeoples().add(p3);
        session.insert(animal);//  
        session.fireAllRules();//    
    }
    
    テストを実行します。3グループのデータの中で、2つのpeopleが条件を満たして、2回実行します。
    People(sex=0, name= , drlType=from)
    People(sex=1, name= , drlType=from)
    
    2.5.2 collect
    指定されたソースまたはDroolsエンジンのワークメモリからセットを取得するには、Javaセット(例えばList、LinkdList、HashSet)を使用することができます。
    新しいcollect.drl
    package com.ytooo.collt
    dialect "java"
    import com.ytooo.bean.People
    import java.util.List
    
    rule "collect"
     when
        $alarms : List( size >= 3 ) from collect(People(sex != 3 && drlType == "collect"))
        then
            System.out.println("collect    ,     :"+$alarms);
        end
    
    新規試験方法
    @Test
    public void collect() {
       session.insert(new People(1, " ","collect"));
       session.insert(new People(0, " ","collect"));
       session.insert(new People(0, " ","collect"));
       session.insert(new People(1, " ","collect"));
       session.insert(new People(0, " ","collect"));
       session.insert(new People(3, " ","collect"));
    
        session.fireAllRules();//    
    }
    
    テストを実行して、正確にマッチングの事実を印刷します。ここで、sex=3の「金」は結果に一致していません。
    collect    ,     :
    [People(sex=0, name= , drlType=collect),
     People(sex=1, name= , drlType=collect), 
     People(sex=0, name= , drlType=collect), 
     People(sex=0, name= , drlType=collect), 
     People(sex=1, name= , drlType=collect)]
    
    パラメータを変更すると、入力は二つのセットだけを残します。3のデータは、印刷結果がありません。
    2.5.3 accumullateディケンサ
    データセットを巡回して、データ項目をカスタマイズしたり、設定したりして結果を返します。
    2.5.3.1 accumulate関数
  • average
  • min
  • max
  • count
  • sum
  • collect List取得リスト
  • collect Set取得セット
  • averageサンプル新規accumullate.drl
    package com.ytooo.collt
    dialect "java"
    import com.ytooo.bean.Sensor
    import java.util.List
    
    rule "accumulate"
      when
       $avg : Number() from accumulate(Sensor(temp >= 5 && $temp : temp),average($temp))
      then
        System.out.println("accumulate    ,     :" + $avg);
    end
    
    新規試験方法
     @Test
    public void accumulate() {
        session.insert(new Sensor(" ", 8.26));
        session.insert(new Sensor(" ", 7.12));
        session.insert(new Sensor(" ", 3.24));
        session.insert(new Sensor(" ", 6.32));
        session.insert(new Sensor(" ", 12.23));
        session.insert(new Sensor(" ", 10.8));
    
        session.fireAllRules();//    
    }
    
    試験を実行し、トリガルールを実行し、平均値を印刷します。
    accumulate    ,     :8.946
    
    2.1.4カスタムaccunmulate
  • init初期化変数
  • actionが実行される動作を巡回する度に
  • 逆転動作を最適化するために使用されます。
  • リセットの実行結果
  • @Test
    public void diyaccumulate() {
        session.insert(new People(1, " ",26,"diyaccumulate"));
        session.insert(new People(0, " ",18,"diyaccumulate"));
        session.insert(new People(0, " ",38,"diyaccumulate"));
        session.insert(new People(1, " ",90,"diyaccumulate"));
        session.insert(new People(0, " ",55,"diyaccumulate"));
        session.insert(new People(3, " ",12,"diyaccumulate"));
    
        session.fireAllRules();//    
    }
    
    rule "diyaccumulate"
        when
            People(drlType == "diyaccumulate")
            $avg: Number() from accumulate(People($age: age,drlType == "diyaccumulate"),
            init(int $total = 0, $count = 0;),
            action($total += $age; $count++;),
            result($total/$count))
    
        then
            System.out.println("Avg: " + $avg);
    end
    
    出力結果
    Avg: 39
    
    教程コードはすでにytoo-droolsに提出しました。starを歓迎します。
    Droolsルールエンジンシリーズ教程(一)SprigBoot整合&高速集成上手
    Droolsルールエンジンシリーズ教程(三)Drools規則文法&RHS動作&header詳細
    もっと面白い内容を教えてください。私のブログ交流を歓迎します。
    漫才が好きな友達はYouTubeに来てもいいです。郭先生の漫才を聞きに来てください。