第4章 Decision Central での DRL ルールの作成
Decision Central で、プロジェクトに対して DRL ルールを作成して管理できます。パッケージに作成またはインポートするデータオブジェクトに基づいて、各 DRL ファイルで、ルールの条件、アクション、そしてルールに関連するその他のコンポーネントを定義します。
手順
-
Decision Central で、Menu
Design Projects に移動して、プロジェクト名をクリックします。 -
Add Asset
DRL file をクリックします。 参考となる DRL ファイル 名を入力し、適切な パッケージ を選択します。指定するパッケージは、必要なデータオブジェクトが割り当てられている、またはこれから割り当てるパッケージにする必要があります。
ドメイン固有言語 (DSL) アセットがプロジェクトに定義されている場合は、Show declared DSL sentences を選択することもできます。この DSL アセットは、DRL デザイナーで定義する条件およびアクションに使用できるオブジェクトです。
OK をクリックして、ルールアセットを作成します。
新しい DRL ファイルが、Project Explorer の DRL パネルに追加されます。Show declared DSL sentences オプションを選択した場合は、DSLR パネルに追加されます。この DRL ファイルを割り当てたパッケージは、ファイルの上位にリストされます。
-
DRL デザイナーの左パネルの Fact types リストで、ルールに必要なすべてのデータオブジェクトとデータオブジェクトフィールドがリストされていることを確認します (それぞれを展開します)。リストされていない場合は、DRL ファイルの
import命令文を使用して、その他のパッケージから関連するデータオブジェクトをインポートするか、パッケージに データオブジェクトを作成 します。 データオブジェクトをすべて配置したら、DRL デザイナーの Model タブに戻り、以下のいずれかのコンポーネントで DRL ファイルを定義します。
DRL ファイルのコンポーネント
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
package: (自動) これは、DRL ファイルを作成し、パッケージを選択すると定義されます。 import: このパッケージ、または DRL ファイルで使用するその他のパッケージのデータオブジェクトを指定します。パッケージとデータオブジェクトをpackage.name.object.name形式で指定し、1 行につき 1 つインポートします。データオブジェクトのインポート
import mortgages.mortgages.LoanApplication;
import mortgages.mortgages.LoanApplication;Copy to Clipboard Copied! Toggle word wrap Toggle overflow function: (任意) DRL ファイルのルールが使用する関数を指定します。関数は、ルールのソースファイルにセマンティックコードを追加します。関数は、特に、ルールのアクション (then) 部分が繰り返し使用され、パラメーターだけがルールごとに異なる場合に便利です。DRL ファイルのルールで、関数を宣言したり、静的メソッドを関数としてインポートしたりして、ルールの アクション (then) 部分に、名前を指定して関数を使用します。ルールに関数を宣言して使用 (オプション 1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ルールに関数をインポートして使用 (オプション 2)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow query: (任意) DRL ファイルのルールに関連するファクトに対してデシジョンエンジンを検索するのに使用します。クエリーは、定義した条件セットを検索するため、whenまたはthenを指定する必要はありません。クエリー名は KIE ベースでグローバルとなるため、プロジェクトにあるその他のすべてのルールクエリーと重複しないようにする必要があります。クエリーの結果に戻るには、ksession.getQueryResults("name")を使用して、従来のQueryResults定義を設定します ("name"はクエリー名)。これにより、クエリーの結果が返り、クエリーに一致したオブジェクトを取得できるようになります。DRL ファイルのルールに、クエリーと、クエリー結果パラメーターを定義します。ルールで、年齢が 21 歳未満の場合のクエリーと、その結果
Copy to Clipboard Copied! Toggle word wrap Toggle overflow declare: (任意) DRL ファイルのルールが使用する新しいファクトタイプを宣言します。Red Hat Decision Manager のjava.langパッケージのデフォルトはObjectですが、必要に応じて DRL ファイルに別のタイプを宣言することもできます。DRL ファイルにファクトタイプを宣言すると、Java などの低級言語でモデルを作成せず、デシジョンエンジンに直接新しいファクトモデルを定義するようになります。新しいファクトタイプの宣言および使用
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rule: DRL ファイルで各ルールを定義します。ルールは、rule "name"形式のルール名、ルールの動作 (salience、no-loopなど) を定義する任意の属性、whenおよびthen定義が続きます。同じパッケージでルール名を重複させることはできません。ルールのwhen部分には、アクションを実行するのに必要な条件が含まれます。たとえば、銀行が、ローンの申し込みを 21 歳以上に限定した場合、Underageルールのwhen条件はApplicant( age < 21 )になります。ルールのthen部分には、ルールの条件部分に一致したときに実行するアクションが含まれます。たとえば、ローンの申込者が 21 歳に満たない場合は、thenアクションがsetApproved( false )になり、申込者の年齢条件を満たしていないためにローンの申し込みは承認されません。条件 (when) およびアクション (then) は、パッケージで利用可能なデータオブジェクトに基づいて、任意の制約、バインディングなどのサポートされる DRL 要素を持つ、定められている一連のファクトパターンで設定されます。このパターンは、定義したオブジェクトにルールがどのように影響するかを指定します。申込者の年齢制限に関するルール
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 少なくても、各 DRL ファイルに
packageコンポーネント、importコンポーネント、ruleコンポーネントを指定する必要があります。他のすべてのコンポーネントは任意です。図4.1 必要なコンポーネントおよび任意のルール属性を持つ DRL ファイルのサンプル
-
- ルールのコンポーネントをすべて定義したら、DRL デザイナーの右上ツールバーで Validate をクリックし、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントをすべて見直し、エラーが表示されなくなるまで再度、ファイルを検証します。
- DRL デザイナーで Save をクリックして、設定した内容を保存します。
DRL ルールへの条件の追加に関する詳細は、「DRL ルールへの WHEN 条件の追加」 を参照してください。
DRL ルールへのアクションの追加に関する詳細は、「DRL ルールへの THEN アクションの追加」 を参照してください。
4.1. DRL ルールへの WHEN 条件の追加 リンクのコピーリンクがクリップボードにコピーされました!
ルールの when 部分には、アクションを実行するのに必要な条件が含まれます。たとえば、銀行のローン申し込みに年齢制限 (21 歳以上) が必要な場合、Underage ルールの when 条件は Applicant( age < 21 ) となります。パッケージで利用可能なデータオブジェクトに基づいて、指定した一連のパターンおよび制約と、任意のバインディング、その他のサポートされる DRL 要素で設定されます。
前提条件
-
packageは DRL ファイルに定義されます。これは、ファイルの作成時に行われます。 -
ルールで使用したデータオブジェクトの
importリストが、DRL ファイルのpackage行の下に定義されます。データオブジェクトは、このパッケージ、または別の Decision Central パッケージから使用できます。 -
rule名は、package、import、または DRL ファイル全体に適用されるその他の行の下に、rule "name"という形式で定義されます。同じパッケージでルール名を重複させることはできません。ルールの動作 (salience、no-loopなど) を定義する任意のルール属性は、ルール名の下、whenセクションの前に定義します。
手順
DRL デザイナーで、ルールに
whenを入力して、条件命令文を追加します。whenセクションは、ルールの条件を定義するファクトパターンで設定されますが、ファクトパターンが 1 つも追加されない場合もあります。whenセクションを空にすると、デシジョンエンジンでfireAllRules()を呼び出すたびに、thenセクションのアクションが実行します。これは、デシジョンエンジンのステートを設定するルールを使用する場合に便利です。条件のないルール
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 一致させる最初の条件のパターンを入力し、任意で制約、バインディング、およびサポートされる DRL 要素を入力します。基本的なパターンフォーマットは
patternBinding : patternType ( constraints )です。パターンは、パッケージで利用可能なデータオブジェクトに基づいており、thenセクションのアクションを発生させるのに必要な条件を定義します。単純なパターン: 制約のない単純なパターンは、指定したタイプのファクトに一致します。たとえば、次は、申込者が存在することだけが条件になります。
when Applicant( )
when Applicant( )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 制約のあるパターン: 制約を持つパターンは、指定したタイプのファクトと、追加制限を括弧で指定したパターン (true または false) に一致します。たとえば、次は、申込者が 21 歳に満たないことを条件としています。
when Applicant( age < 21 )
when Applicant( age < 21 )Copy to Clipboard Copied! Toggle word wrap Toggle overflow バインディングのあるパターン: パターンのバインディングは簡単な参照となり、ルールのその他のコンポーネントが、定義したバターンに戻って参照します。たとえば、次の例では、
LoanApplicationのバインディングaが、underage の申込者に関連するアクションとして使用されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
引き続き、このルールに適用する条件パターンをすべて定義します。以下は、DRL 条件を定義するいくつかのキーワードオプションです。
and: 条件コンポーネントを論理積に分類します。インフィックスおよびプリフィックスのandがサポートされます。デフォルトでは、結合演算子を指定しないと、リストされている条件またはアクションがすべてandと結合します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow or: 条件コンポーネントを論理和に分類します。インフィックスおよびプリフィックスのorがサポートされます。Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 ) Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 )
Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 ) Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 )Copy to Clipboard Copied! Toggle word wrap Toggle overflow exists: 存在すべきファクトおよび制約を指定します。これは、ファクトが存在していることを示しているのではなく、ファクトが存在すべきであることを示しています。このオプションは、最初に一致したものだけが適用され、その後一致するものは無視されます。exists ( Bankruptcy( yearOfOccurrence > 1990 || amountOwed > 10000 ) )
exists ( Bankruptcy( yearOfOccurrence > 1990 || amountOwed > 10000 ) )Copy to Clipboard Copied! Toggle word wrap Toggle overflow not: 存在するべきでないファクトおよび制約を指定します。not ( Applicant( age < 21 ) )
not ( Applicant( age < 21 ) )Copy to Clipboard Copied! Toggle word wrap Toggle overflow forall: 最初のパターンに一致したすべてのファクトが残りのパターンに一致する制約を作成します。forall( app : Applicant( age < 21 ) Applicant( this == app, status = 'underage' ) )forall( app : Applicant( age < 21 ) Applicant( this == app, status = 'underage' ) )Copy to Clipboard Copied! Toggle word wrap Toggle overflow from: 条件パターンによりデータが一致するソースを指定します。Applicant( ApplicantAddress : address ) Address( zipcode == "23920W" ) from ApplicantAddress
Applicant( ApplicantAddress : address ) Address( zipcode == "23920W" ) from ApplicantAddressCopy to Clipboard Copied! Toggle word wrap Toggle overflow entry-point: パターンのデータソースに対応するエントリーポイントを定義します。通常はfromとともに使用します。Applicant( ) from entry-point "LoanApplication"
Applicant( ) from entry-point "LoanApplication"Copy to Clipboard Copied! Toggle word wrap Toggle overflow collect: 設定を条件の一部として使用できる、オブジェクトのコレクションを定義します。この例では、指定した各担保に対して、デシジョンエンジンで保留されているすべての申し込みがArrayListsに分類されます。申し込みが 3 つ以上ある場合は、このルールが実行します。m : Mortgage() a : ArrayList( size >= 3 ) from collect( LoanApplication( Mortgage == m, status == 'pending' ) )m : Mortgage() a : ArrayList( size >= 3 ) from collect( LoanApplication( Mortgage == m, status == 'pending' ) )Copy to Clipboard Copied! Toggle word wrap Toggle overflow accumulate: オブジェクトのコレクションを処理し、各要素のカスタムアクションを実行し、(制約がtrueと評価されると) 結果オブジェクトを 1 つ以上返します。このオプションは、collectよりも強力で、柔軟性が高いオプションです。accumulate( <source pattern>; <functions> [;<constraints>] )形式を使用します。この例では、min、max、およびaverageは累積関数で、各センサーのすべての測定値から、最低気温、最高気温、そして平均気温の値を計算します。その他のサポートされる関数には、count、sum、variance、standardDeviation、collectList、およびcollectSetがあります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 高度な DRL オプションこれは、条件を定義する基本的なキーワードオプションおよびパターン構築の例です。さらに高度な DRL オプションと構文が DRL デザイナーでサポートされています。オンラインのDrools ドキュメンテーションを参照してください。
- ルールの条件コンポーネントをすべて定義したら、DRL デザイナーの右上のツールバーの Validate をクリックして、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントをすべて見直し、エラーが表示されなくなるまで再度、ファイルを検証します。
- DRL デザイナーで Save をクリックして、設定した内容を保存します。