Droolsルールエンジンシリーズ教程(二)Drools規則文法&LHS条件
Droolsルールエンジンシリーズ教程(一)SprigBoot整合&高速集成上手
Droolsルールエンジンシリーズ教程(三)Drools規則文法&RHS動作&header詳細
Droolsルールエンジンシリーズ教程(四)Drools主なAPIと方策決定表
教程コードはすでにytoo-droolsに提出しました。starを歓迎します。
文のコード方法は前の教程に基づいています。
1.drlファイル構造 Packageパケットは、ルールごとに一意の名前空間として機能する。一つの規則ライブラリには複数のパッケージが含まれています。一般的に、パッケージのすべてのルールは、パッケージが独立するように、同じファイルに格納されます。しかし、他のパケットから導入されたオブジェクト を規則的に使用しても良い。 importは、規則で使用される任意のオブジェクトの標準パスおよびタイプ名を識別するためにJava中のimport文と同様である。 factios関数コードブロック例: queries DroolsエンジンのワークメモリからDRLファイルのルールに関する事実を検索します。 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制約のないマッチングモード
実際のことは、任意の条件を満たす必要はありません。タイプが同じなら、この規則をトリガします。
実際のタイプは同じで、条件を満たすと、この規則をトリガします。
実際のタイプは同じで、条件を満たすと、この規則をトリガし、データをバインディングします。
and、orなどルール条件を結合した複数のモードでは、キーワードの連語が定義されていません。デフォルトはandです。
_; 標準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 contains、not contains member Of、not memberrOf
2.5.1 fromはセットの中の要素を取ります。
bean Animalの新規作成
指定されたソースまたはDroolsエンジンのワークメモリからセットを取得するには、Javaセット(例えばList、LinkdList、HashSet)を使用することができます。
新しいcollect.drl
2.5.3 accumullateディケンサ
データセットを巡回して、データ項目をカスタマイズしたり、設定したりして結果を返します。
2.5.3.1 accumulate関数 average min max count sum collect List取得リスト collect Set取得セット averageサンプル新規accumullate.drl init初期化変数 actionが実行される動作を巡回する度に 。逆転動作を最適化するために使用されます。 リセットの実行結果
Droolsルールエンジンシリーズ教程(一)SprigBoot整合&高速集成上手
Droolsルールエンジンシリーズ教程(三)Drools規則文法&RHS動作&header詳細
もっと面白い内容を教えてください。私のブログ交流を歓迎します。
漫才が好きな友達はYouTubeに来てもいいです。郭先生の漫才を聞きに来てください。
Droolsルールエンジンシリーズ教程(三)Drools規則文法&RHS動作&header詳細
Droolsルールエンジンシリーズ教程(四)Drools主なAPIと方策決定表
教程コードはすでにytoo-droolsに提出しました。starを歓迎します。
文のコード方法は前の教程に基づいています。
1.drlファイル構造
function String hello(String applicantName) {
return "Hello " + applicantName + "!";
}
query "people under the age of 21"
$person : Person( age < 21 )
end
_; 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制約デモ
は公的文書から来ています。
Person( country matches "(USA)?\\S*UK" )
Person( country not matches "(USA)?\\S*UK" )
FamilyTree(countries contains "UK" )
Person( fullName not contains "Jr" )
FamilyTree(countries contains $var)
Person( fullName not contains $var )
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.drlpackage 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関数
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@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に来てもいいです。郭先生の漫才を聞きに来てください。