ヘッダーをスキップ

Oracle Business Rules ユーザーズ・ガイド
10g(10.1.3.1.0)

B31866-02
目次
目次
索引
索引

戻る 次へ

3 Rule Author機能の使用

この章では、Rule Authorの高度な機能の一部を使用する方法について説明します。

この章の内容は次のとおりです。

3.1 変数の使用

この項では、Rule Authorを使用して、メッセージの一部を置換する変数を追加します。このメッセージは、第2章で作成したJava版How-Toで出力するメッセージです。Oracle Business Rulesで使用する変数は、Javaにおけるパブリックな静的変数に類似しています。変数は、定数または変更可能に指定できます。

変数を追加する手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックし、CarRentalディクショナリをロードします。

  2. 「定義」タブをクリックします。

  3. ナビゲーション・ツリーで、「変数」ノードをクリックします。「変数サマリー」ページに、テキスト(アイテムが見つかりません)を含む表が表示されます。これは、変数が何も定義されていないことを示します。

  4. 「作成」をクリックします。「変数」ページが表示されます。

  5. 「名前」フィールドにDeclineMessageと入力します。

  6. 「エイリアス」フィールドにDecline Messageと入力します。

  7. 「ファイナル」チェック・ボックスを選択します(デフォルトでは、このボックスが選択されます)。

  8. 「型」ボックスで、Stringを選択します。

  9. 「式」ボックスに"Rental declined "と入力します。

    式の作成を支援するウィザードを使用するには、編集アイコンをクリックして、ウィザードを表示します。

  10. 「適用」をクリックします。Rule Authorは確認メッセージを表示します(図3-1を参照)。


    注意:

    Rule Authorで変数が作成されると、「名前」フィールドに入力した名前にDM.が追加されます。DMは、Data Model(データ・モデル)を表します。 


    図 3-1    Rule Authorの変数を定義するページ


    画像の説明

    Rule Authorの変数を作成する際の注意:

3.2 制約の使用

カスタマイズ可能ルールで、フィールドへの許容値を特定の値セットに制約する(たとえば、値の範囲を指定する)場合は、Rule Authorの制約定義を使用できます。

Rule Authorでは、表3-1に示すように、3つのタイプの制約定義がサポートされています。

表 3-1    Rule Authorの制約タイプ 
制約タイプ  説明 

範囲 

数値の範囲を指定します。 

列挙 

指定可能な値のリストを指定します。 

正規表現 

文字列値が準拠する正規表現を指定します。この制約での正規表現の構文は、Javaの正規表現の定義に従います。 


注意:

正規表現の制約では、文字列を引用符で囲む必要があります。 


この項の例では、制約を定義してCarRentalディクショナリのUnderAgeルールに追加します。

範囲制約を定義する手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックし、CarRentalディクショナリをロードします。

  2. 「定義」タブをクリックします。

  3. ナビゲーション・ツリーで、「制約」ノードをクリックします。「制約サマリー」ページに、制約が定義されていないことを示す表が表示されます。

  4. 「作成」をクリックします。「制約」ページが表示されます。

  5. 「名前」フィールドにvalidAgeRangeと入力します。

  6. 「型」リストからRangeを選択します。これにより、「制約」ページの表示が更新されて、「開始値(数値)」「終了値(数値)」の2つの新規フィールドが表示されます。

  7. 「開始値(数値)」フィールドに15を入力します。

  8. 「終了値(数値)」フィールドに99を入力します。

  9. 「適用」をクリックします。Rule Authorによって確認メッセージが表示されます(図3-2を参照)。

    図 3-2    Rule Authorの制約を定義するページ


    画像の説明

次に、validAgeRangeをUnderAgeルールに追加することによってこの制約を使用します。

UnderAgeルールでこの制約を使用する手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックし、CarRentalディクショナリをロードします。

  2. 「ルールセット」タブを選択します。

  3. ツリーで、UnderAgeルールを表示するノードを選択します。

  4. 「if」ボックスで編集アイコンを選択します。「パターン定義」ページが表示されます。

  5. 「パターン定義」ページの「制約」フィールドで、validAgeRange(「値」列の2番目のボックス)を選択します。

  6. 「OK」をクリックします。「パターン定義」ページが閉じます。

  7. 「ルール」ページで「OK」をクリックします。

  8. ディクショナリを保存します。

「カスタマイズ」タブを使用して、Rule Author では指定した範囲の値のみを入力でき、無効な入力は拒否されることを確認します。


注意:

ルールセットで使用する制約を変更した場合、そのルールセットは、すべての制約に準拠しなくなる可能性があっても引き続き保存できます。 


関連項目:

「許可された値」フィールドで制約を使用する方法については、「UnderAgeルールでのパターンに対するテストの定義」を参照してください。 

3.3 RLファクトの使用

この例では、CarRentalルールを拡張するDecisionというRLファクトを作成します。RLファクトには、driverNametypeおよびmessageという3つの文字列型のメンバーがあります。RLファクトDecisionを作成する手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックし、CarRentalディクショナリをロードします。

  2. 「定義」タブをクリックします。「ファクト」の下のナビゲーション・ツリーで、「RLファクト」ノードをクリックします。RLファクトが定義されていない「RLファクト・サマリー」ページが表示されます。

  3. 「作成」をクリックします。その結果、RLファクト・ページが表示されています。

  4. 「名前」フィールドにDecisionと入力します。

  5. 「エイリアス」フィールドにCar rental decisionと入力します。 図3-3を参照してください。

    図 3-3    Rule Authorの「定義」タブのRLファクト・ページ


    画像の説明

  6. 「プロパティ」表で「作成」をクリックします。「プロパティ」表に新しい行が表示されます。

  7. 「名前」フィールドにdriverNameと入力します。

  8. 「型」フィールドのボックスからStringを選択します。

  9. 「エイリアス」フィールドにdriver nameと入力します。

  10. 「作成」をクリックします。「プロパティ」表に別の新規行が追加されます。

  11. 「名前」フィールドにtypeと入力します。

  12. 「型」フィールドのボックスからStringを選択します。

  13. 「エイリアス」フィールドにdecision typeと入力します。

  14. 「作成」をクリックします。「プロパティ」表に別の新規行が追加されます。

  15. 「名前」フィールドにmessageと入力します。

  16. 「型」フィールドのボックスからStringを選択します。

  17. 「エイリアス」フィールドにmessage for decisionと入力します。

  18. 「適用」をクリックします。Rule Authorによって確認メッセージが表示されます(図3-4を参照)。

    図 3-4    Rule Authorの「定義」タブの「RLファクト・プロパティ」


    画像の説明

  19. ナビゲーション・ツリーで、「RLファクト」をクリックします。「RLファクト・サマリー」ページに新規のRLファクトDM.Decisionが表示されます。


    注意:

    Rule AuthorでRLファクトが作成されると、「名前」フィールドに入力した名前に対しDM.が追加されます。DMはData Model(データ・モデル)を表します。 


    関連項目:

    図3-4で示した「拡張」フィールドについては、「Rule Authorのリストに関する参照可能性およびオブジェクト・チェーンの指定」を参照してください。 

3.4 関数の使用

Oracle Business Rulesでは、組込み関数またはユーザー定義関数をルールの条件とアクションに使用できます。この項では、Rule Authorを使用してshowDecisionという関数を定義します。この関数を使用すると、Java版How-Toに関する結果を出力できます。


注意1

この項の例では、3.3項で定義したCarRentalディクショナリとRLファクトを使用します。 



注意2:

Rules SDKから生成されたRL Languageの場合、たとえばRule Authorを使用してルールを作成すると、グローバル変数がRL Language関数で直接参照されないことがあります。詳細は、D.2項「RL関数で使用できないグローバル変数」を参照してください。 


showDecision関数を定義する手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックし、CarRentalディクショナリをロードします。

  2. 「定義」タブを選択します。

  3. ナビゲーション・ツリーで「RL関数」を選択します。「RL関数サマリー」ページが表示されます。

  4. 「作成」をクリックします。

  5. 「名前」フィールドにshowDecisionと入力します。

  6. 「エイリアス」フィールドにShow Decisionと入力します。


    注意:

    Rule Authorで関数を定義している場合は、関数本体で実際の関数名(別名でない)を使用する必要があるときでも、「エイリアス」フィールドには有効な別名を指定する必要があります。 


  7. 「戻り型」フィールドのボックスでvoid(デフォルト値)を選択します。

  8. 「関数の引数」表で「作成」をクリックします。

  9. 「名前」フィールドにdecisionと入力します。

  10. 「エイリアス」フィールドにDecision made for driverと入力します。

  11. 「型」フィールドのボックスで、RLファクトDecisionの別名であるCar rental decisionを選択します。

  12. 「関数本体」ボックスに次の内容を入力します。

    DM.println( "Rental decision is " + decision.type + " for driver " + 
    decision.driverName + " for reason " + decision.message);
    
    
  13. 「適用」をクリックします。確認メッセージが表示されます。

  14. ナビゲーション・ペインで「RL関数」ノードをクリックします。サマリー表に、RL関数DM.showDecisionが表示されます。

  15. 「編集」をクリックして関数を表示します(図3-5を参照)。

    図 3-5    Rule AuthorのRL関数ページ


    画像の説明

3.3項で説明したように新規RLファクトDecisionを作成し、新規RL関数DM.showDecisionを作成した後は、UnderAgeルールを更新して新規Decisionファクトを作成するアクションを提供できます。DecisionファクトをshowDecision関数で使用するには、Decisionファクトをチェックし、showDecision関数を使用して結果を表示するためのアクションを提供する新規ルールを作成する必要があります。

3.5 ルールの使用

ルールにアクションを追加する場合、アクションにはパターン一致が関連付けられます。ルールの「if」部が一致すると、ルール・エンジンによって「then」部がアクティブになり、ルールに関連付けられたアクションの実行が準備されます。表3-2は、ルールを作成するときに使用できるアクションのタイプを示しています。

表 3-2    アクション・タイプ 
アクション・タイプ  説明 

Assert 

パターンで使用されるファクトをアサートします。パターンで一致したファクトが変更された場合、そのファクトをもう一度アサートして、ルール・エンジンに対してファクトが変更されたことを通知する必要があります。 

Assert New 

新規ファクト・タイプ・インスタンスを作成して、そのインスタンスをルール・エンジンに対してアサートします。 

Assign 

変数またはファクト・プロパティに値を割り当てます。新しい値がファクト・プロパティに割り当てられた場合は、その新しい値によってルールを再評価するために、ファクトをもう一度アサートする必要があります。 

Call 

いくつかのアクションを実行する関数をコールできるようにします。 

Retract 

次のような様々な理由で、ファクトの取消しが必要になることがあります。ファクトの使用が終了し、Rules Engineから削除する場合。ルールに関連付けられているアクションによって状態が変化したため、Rules Engineの現在の状態が示されるように、ファクトを取り消す必要がある場合。 

RL 

直接実行される自由形式のRLテキストを作成します。このRLの構文はSDKによって検証されないため、RLアクションを作成すると、ルールセットから無効なRLコードが生成されることがあります。 

3.6 データ・モデル内のJavaオブジェクトの表示

データ・モデル内のオブジェクト(インポートするクラスまたはパッケージを含む)を表示する手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックし、適切なディクショナリをロードします。たとえば、CarRentalディクショナリをロードします。

  2. 「定義」タブをクリックして「定義」ページを表示します。

  3. ナビゲーション・ツリーで「ファクト」フォルダを開き、「Javaファクト」ノードをクリックして「Javaファクト・サマリー」ページを表示します。

    レンタカー・サンプルでは、インポートされたcarrental.Driverクラスを含む表が表示されます。

  4. 編集アイコンをクリックして、Javaファクトのプロパティとメソッドの表を表示します。

    画像の説明

表3-3および表3-4は、Javaファクトのプロパティおよびメソッドの表のフィールドを説明しています。

表 3-3    「Javaファクト・サマリー」のフィールド 
フィールド  説明 

名前 

Javaオブジェクトの名前。 

エイリアス 

Javaオブジェクトに指定された別名。Rule Authorのリストに表示されます。 

参照可能 

このボックスは、JavaオブジェクトをRule Authorのリストに表示するかどうかを指定します。 

XPathアサーションのサポート 

このボックスは、XPath式でクラスを使用してXMLデータをルール・セッションにアサートできることを示します。 

表 3-4    「Javaファクト」の「プロパティ」と「メソッド」のフィールド 
フィールド  説明 

参照可能 

プロパティまたはメソッドをRule Authorのリストに表示するかどうかを指定します。 

拡張 

スーパークラスのあるプロパティまたはメソッドのスーパークラスをRule Authorのリストに表示するかどうかを指定します。 

メンバー変数名 

プロパティ用。プロパティ名を指定します。 

タイプ 

プロパティの型を指定します。 

エイリアス 

変更可能なテキスト・フィールド。プロパティまたはオブジェクトに対するビジネス用語を指定します。指定した名前は、オブジェクトがRule Authorのリストに表示されるときに使用されます。 

メソッド名 

メソッド用。 

引数の型 

メソッド用。 

戻り型 

メソッド用。 


注意:

Javaクラスのインポートでは、そのスーパークラスと、フィールドおよびメソッドを介して関連付けられたクラスが、データ・モデルにインポートされます。「Javaファクト・サマリー」ページの表には、インポートしたクラスのスーパークラスおよび関連付けられたクラスが表示されます。 


3.6.1 Rule Authorのリストに関する参照可能性およびオブジェクト・チェーンの指定

プロパティ、クラスまたはメソッドをRule Authorの選択ボックスで参照可能にするかどうかを指定できます(プロパティ、クラスまたはメソッドが含まれる選択ボックスは、「ルールセット」タブでルールを作成するときに表示されます)。


注意:

Java How-Toの場合、オブジェクト・チェーンの変更は不要です。 


Javaオブジェクトの参照可能性を削除する手順は、次のとおりです。

  1. 「Javaファクト」ページの上部にある「参照可能」ボックスを使用して、オブジェクトを参照可能にするかどうかを指定します(デフォルトでは、オブジェクトは参照可能です)。

  2. 「参照可能」 ボックスの選択を解除すると、Rule Authorの選択ボックスからオブジェクトが削除されます。

  3. 「Javaファクト」ページで「OK」をクリックします。

JavaプロパティまたはJavaメソッドの参照可能性を削除する手順は、次のとおりです。

  1. 「Javaファクト」ページの「プロパティ」領域または「メソッド」領域で、プロパティまたはメソッドの選択を解除して、Rule Authorの選択ボックスからそのプロパティまたはメソッドを削除します。

  2. 「Javaファクト」ページで「OK」をクリックします。

Rule Authorの選択ボックスに、スーパークラス・チェーン内の指定したメソッドまたはプロパティの1レベル上のメソッドまたはプロパティを表示するには、「Javaファクト」ページで、そのメソッドまたはプロパティの「拡張」ボックスを選択します。この「拡張」ボックスは、「プロパティ」領域または「メソッド」領域の「拡張」フィールドに表示されます。「拡張」ボックスは、スーパークラスがあるメソッドまたはプロパティに対してのみ表示されます(Rule Authorでは、プリミティブ型には「拡張」ボックスは表示されません)。

3.7 Oracle Business Rules RL Languageテキストの生成

Rule Authorでは、「RL」タブを使用して、RL Languageテキストを表示できます。このテキストは、データ・モデルおよびディクショナリ・データに関連付けられたルールセットを示します。

3.7.1 RL Languageテキストの生成、表示およびチェック

RL Languageテキストを生成、表示、およびチェックする手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックし、ディクショナリをロードします。たとえば、CarRentalディクショナリをロードします。

  2. 「RL」タブを選択します。

  3. ナビゲーション・ツリーで、目的のルールセットを選択します。

  4. 「RLの生成」をクリックします。指定したルールセットのRL Languageテキストが表示されます。

  5. 「RL構文のチェック」をクリックして、RL Languageテキストを検証します。


    注意:

    Rule AuthorのRL構文チェック機能を使用する場合、データ・モデルにJavaクラスが含まれている場合は、そのJavaクラスをOC4Jクラスパスに含めて検証を実行する必要があります。また、データ・モデルにXMLスキーマが含まれている場合は、生成されたJAXBクラス・ファイルをOC4Jクラスパスに含めて検証を実行する必要があります。

    したがって、検証を実行するには、OC4JクラスパスにJavaオブジェクト用あるいはXMLスキーマから生成されたJavaクラス用のjarファイル、またはクラスが含まれていることを確認する必要があります。

    JARファイルのJavaクラスの場合は、JARファイルを次のディレクトリにコピーし、OC4Jを再起動できます。

    $ORACLE_HOME/j2ee/home/applications/ruleauthor/lib

    Javaクラスを共有ライブラリとして組み込むこともできます。その結果、Rule Authorでは他のアプリケーションとクラスを共有できるようになります。 


    関連項目:

    Enterprise Managerを使用してJavaクラスを共有ライブラリとして追加する方法については、「テスト・ルールセットの使用」を参照してください。 

3.8 Rule Authorのディクショナリ・プロパティの構成

Rule Authorでは、ディクショナリ・プロパティを使用して、式で使用するデフォルトの式タイプを指定して、ロギングのオプションを指定できます。

内容は次のとおりです。

ディクショナリ・プロパティを構成するには、次の手順を実行します。

  1. リポジトリに接続していること、およびディクショナリがロードされていることを確認します。

  2. 「リポジトリ」タブをクリックします。

  3. 「プロパティ」第2タブをクリックします(図3-6を参照)。

    図 3-6    Rule Authorの「ディクショナリ・プロパティ」ページ


    画像の説明


    注意:

    Rule Authorは、ユーザーごとにディクショナリ・プロパティを格納します。設定を変更し、ログアウトして、別のユーザーとしてログインすると、ディクショナリ・プロパティには、新しくログインしたユーザーのプロパティが反映されます。

    Rule Authorで認証を使用しない場合は(ユーザーがweb.xmlでセキュリティを無効にするように構成している場合に可能)、ユーザー・レベルのディクショナリ・プロパティの保存も無効になります。 


3.8.1 「アドバンスト・テスト式」オプションの使用

「アドバンスト・テスト式」チェック・ボックスによって、テスト式に対するRule Authorの式モードが拡張に変更されます。このテスト式は、ルールのパターンを編集するときに表示されます(図3-7を参照)。ルール条件のテストには、数学的演算や論理積が伴う場合があります。Rule Authorには、このような複雑な式の定義をサポートする拡張式モードがあります。

パターンを初めて作成するときのテスト式モードは、「プロパティ」ページで設定した「アドバンスト・テスト式」プロパティによって決まります。「アドバンスト・テスト式」チェック・ボックスを選択すると、すべての新規パターンにアドバンスト・テスト式モードが適用されます。この設定は、ディクショナリの保存時に保持されます。この場合は、ディクショナリのロード時に、すべてのパターンがアドバンスト・テスト式モードで作成されます。作成後のパターンは、テストの有無に関係なく、テスト式モードに永続的に関連付けられます。したがって、パターンに関連するテスト式モードは変更できません。

単一ルール内で、基本式モードと拡張式モードで作成した両方のパターンを使用できます。

図 3-7    「アドバンスト・テスト式」ページの「パターン定義」


画像の説明

3.8.2 「ロギング」オプションの使用

「ロギング」ボックスによって、ロギングのオプションが指定されます。このオプションは、Rule Authorの問題をレポートする必要がある場合に便利です。ロギングを指定するには、「ロギング」チェック・ボックスを選択した後、次のログ・ファイル・プロパティを選択します。

ロギング・オプションの指定が終了した後、「更新」をクリックします。

3.9 Rule Authorのディクショナリの削除

この項では、ディクショナリのバージョンまたはディクショナリ全体を削除する方法について説明します。

個々のディクショナリ・バージョンを削除する手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックします。

  2. 「削除」第2タブをクリックします。

    特定のディクショナリ・バージョンを削除する場合は、「ディクショナリ・バージョンの選択」セクションでディクショナリとバージョンを選択し、「バージョンの削除」をクリックします。

    ディクショナリ全体(およびそのすべてのバージョン)を削除する場合は、「ディクショナリ全体の選択」セクションでディクショナリを選択し、「削除」をクリックします。

3.10 ディクショナリのインポートとエクスポート

Rule Authorには、ディクショナリの特定バージョンまたはディクショナリ全体をインポートできます。手順は次のとおりです。

  1. 「リポジトリ」タブをクリックします。

  2. 「インポート」第2タブをクリックします。

    ディクショナリがローカルにある場合は、最初の箇条書きのセクションを使用してその場所を指定します。ディクショナリのパスを手動で入力するか、または「参照」ボタンをクリックしてディクショナリを選択できます。

    ディクショナリが(Rule Authorが実行されていない)別のマシンにある場合は、そのサーバー上のディクショナリのフルパスを指定する必要があります。

  3. 「インポート」をクリックします。

ディクショナリ全体をエクスポートする手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックします。

  2. 「エクスポート」第2タブをクリックします。

  3. 「ディクショナリ全体の選択」セクションで、次の操作を実行します。

    1. 「ディクショナリ」フィールドで、エクスポートするディクショナリを選択します。

    2. 「ファイルの場所」フィールドで、ディクショナリをエクスポートする場所とファイル名(サーバー上の絶対ファイル・パス)を指定します。

  4. 「エクスポート」をクリックします。

    ディクショナリを選択して「ダウンロード」をクリックすることもできます。これによって、エクスポート済アーカイブへのリンクが「ディクショナリのエクスポート」ページに作成されます。次に、リンクをクリックすると、ブラウザを使用して、選択した場所にアーカイブをダウンロードできます(図3-8を参照)。

    図 3-8    Rule Authorの「ディクショナリのエクスポート」ページ


    画像の説明

特定のディクショナリ・バージョンをエクスポートする手順は、次のとおりです。

  1. 「リポジトリ」タブをクリックします。

  2. 「エクスポート」第2タブをクリックします。

  3. 「ディクショナリ・バージョンの選択」セクションで、次の操作を実行します。

    1. 「ディクショナリ」フィールドで、エクスポートするディクショナリを選択します。

    2. 「バージョン」フィールドで、エクスポートするディクショナリ・バージョンを選択します。

    3. 「ファイルの場所」フィールドで、ディクショナリをエクスポートする場所とファイル名(サーバー上の絶対ファイル・パス)を指定します。

  4. 「エクスポート」をクリックします。

    ディクショナリとバージョンを選択して、「ダウンロード」をクリックすることもできます。これにより、「ディクショナリのエクスポート」ページのエクスポート済アーカイブへのリンクが作成されます。次に、ブラウザを使用して、選択した場所にアーカイブをダウンロードできます(図3-8を参照)。


    注意:

    ディクショナリのエクスポートは追加されていく操作です。したがって、ディクショナリのバージョンをエクスポートし、その後、同じjarファイルに同じディクショナリの別のバージョンをエクスポートすると、エクスポート操作の後、そのjarファイルには同じディクショナリの両方のバージョンが含まれることになります。

    たとえば、ディクショナリdict1にv1およびv2という2つのバージョンがあり、バージョン(dict1、v1)をmyExport.jarにエクスポートした場合、そのjarファイルにはv1の内容のみが含まれます。さらに同じファイルmyExport.jarに対して(dict1、v2)のエクスポートを実行すると、2番目のエクスポートの完了後、このファイルにはdict1のv1およびv2の両方のエクスポート済バージョンが含まれます。 


3.11 テスト・ルールセットの使用

Rule Authorでは、テスト・ルールセット機能により、RL関数を使用してルールセットをテストできます。選択したルールセットとそのルールセットに関連付けられたデータ・モデルがルール・セッションで実行され、ルールを実行するユーザー定義関数がコールされます。

テスト・ルールセット機能を使用する手順は、次のとおりです。

  1. テストするルールセットを作成します。データ・モデルにJavaクラスまたはXMLスキーマが含まれている場合は、そのJavaクラスまたは生成されたJAXBクラスをOC4Jクラスパスに含める必要があります。

    Javaクラスの場合は、次のディレクトリにJARファイルを挿入してから、OC4Jを再起動してクラスパスにクラスを追加できます。

    $ORACLE_HOME/j2ee/home/applications/ruleauthor/lib
    
    

    Javaクラスを共有ライブラリとして組み込むこともできます。その結果、Rule Authorでは他のアプリケーションとクラスを共有できるようになります。これを実行するには、Enterprise Managerにログインして次の操作を実行します。

    1. 「OC4J: ホーム」ページにナビゲートします。

    2. 「管理」タブをクリックします。

    3. 「プロパティ」ノードの下で 「共有ライブラリ」を検索し、「タスクに移動」列のアイコンをクリックします。

    4. 「作成」をクリックし、ライブラリ名とバージョン番号を入力した後、「次」をクリックします。

    5. 「追加」をクリックしてJARファイルの場所にナビゲートし、「続行」をクリックします。

    6. 「終了」をクリックして「共有ライブラリ」ページに戻ります。

    7. 作成したライブラリのリンクを検索してクリックします。アーカイブの絶対パスをコピーします。

    8. 「OC4J: ホーム」ページに戻ります。

    9. 「アプリケーション」タブをクリックします。

    10. Rule Authorアプリケーションのリンク(Rule Authorアプリケーションを初めてデプロイしたときに定義されています)をクリックします。

    11. ruleauthorモジュール・リンクをクリックします。

    12. 「管理」タブをクリックします。

    13. 「構成プロパティ」ノードを検索し、「タスクに移動」アイコンをクリックします。

    14. 「クラスパス」フィールドに、ステップgでコピーしたアーカイブの絶対パスを貼り付けて、「OK」をクリックします。

    15. 結果の確認メッセージが表示された後、「再起動」リンクをクリックしてRule Authorを再起動します。

  2. 次のようにテスト関数を作成します。

    1. 「定義」タブをクリックします。

    2. ナビゲーション・ツリーで、「RL関数」ノードをクリックします。

    3. 「名前」フィールドと「エイリアス」フィールドにtestと入力します。

    4. 戻り型はvoidのままにします。

    5. 「関数本体」フィールドに次の内容を入力します。

      java.text.SimpleDateFormat sdf =
         new java.text.SimpleDateFormat( "MM/dd/yyyy" );
      
      assert (new carrental.Driver( "d111", "Dave", 50, "sports", "full",
                                     sdf.parse ("10/1/1969"), 0, 1, true ));
      assert (new carrental.Driver( "d222", "Abe", 15, "truck", "provisional",
                                     sdf.parse ("8/1/2004"), 0, 0, true ));
      assert (new carrental.Driver( "d333", "Lance", 44, "motorcycle", "full",
                                     sdf.parse ("6/1/2004"), 0, 1, true ));
      
      pushRuleset ("vehicleRent");
      run();
      
      

      この関数は、複数のファクトをアサートし、vehicleRentルールセットをルールセット・スタックに追加し、run()をコールします。


      注意:

      スタックには、実行するすべてのルールセットを追加する必要があります。これらのルールセットは、単に選択するのみでは自動的に追加されません。 


      ロギングを有効にするには、watchFacts()関数またはwatchActivations()関数をコールできます。

    6. 「OK」をクリックします。これにより、RL関数DM.testが保存されます。

    7. ディクショナリを保存します。

  3. 「RL」タブをクリックします。

  4. ナビゲーション・ツリーで、「テスト・ルールセット」ノードをクリックします。「テスト・ルールセット」ページが表示されます。

    図 3-9    Rule Authorの「テスト・ルールセット」ページ


    画像の説明

    vehicleRentルールセットが使用可能であることを確認できます。このルールセットは、第2章で作成したものです。

  5. vehicleRentルールセットを選択して「選択したルールセット」列に移動します。

  6. 「テスト関数」リストから「DM.test」関数を選択します。

  7. 「テスト」をクリックします。

    選択したルールセットに対してRL Languageコードが生成され、ルール・セッションに挿入されます。次に、選択したテスト関数がコールされます。関数の出力が画面に表示されます(図3-10を参照)。

    図 3-10    「出力」が表示されているRule Authorの「テスト・ルールセット」ページ


    画像の説明

3.12 ルールの起動とRules Engine結果の取得

ルール対応プログラムでは、通常、次の手順でルールを起動します。

  1. ファクトとしてアサートするオブジェクトをルール・エンジンに渡します。

  2. ルールを実行します。

  3. 起動したルールから生成された結果を取得します。

この項では、RL関数を使用してルールの起動をカプセル化するためのベスト・プラクティスについて説明します。ルールを起動する3つの方法について説明します。これらの方法の主な相違点は、結果を取得する方法の詳細にあります。この項では、getSubscribersというサンプルRL関数を使用します。このルーチンを使用すると、getSubscribersメソッドをコールするルール対応プログラムという観点において、ルール起動の各方法が同じであるように見えます。

内容は次のとおりです。

3.12.1 結果の例の概要

この項で使用する例は、高速道路の事故通知システムを示しています。それぞれの例は、ルール・エンジンの評価結果にアクセスするための異なる方法を示しています。これらの例では、2つのJavaクラスtraffic.TrafficIncidentおよびtraffic.IncidentSubscriptionを使用します。


注意:

サンプルのtraffic.*クラスは、Oracle Business Rulesに同梱されていません。 


TrafficIncidentクラスは、交通状況に影響を与える事故の情報を表し、次のプロパティが含まれています。

IncidentSubscriptionクラスは、特定の高速道路における事故の通知へのサブスクリプションを記述し、次のプロパティが含まれています。

この例では、高速道路で交通状況に影響を与える事故が発生したとき、これらのクラスを使用してTrafficIncidentオブジェクトをアサートし、ルール評価によって通知の受信者を判断します。

例に示されたsessRuleSessionオブジェクトで、事故通知の多数のサブスクリプションがアサートされます。単純化するために、TrafficIncidentオブジェクトは永続的でないことを前提にしています。実際には、このオブジェクトはアサート対象イベントを表し、その時点で登録されているサブスクライバにのみ通知が送信されます。

3.12.2 グローバル変数を使用した結果の取得

結果の累計にはグローバル変数を使用することが最良の方法です。この方法を使用すると、3.12.3項および3.12.4項に示す方法よりも単純なルール条件が生成されます。

例3-1は、TrafficIncidentオブジェクトをアサートし、Mapオブジェクトによってグローバル変数を初期化し、Rules Engineを起動して、結果のMapオブジェクトを返すgetSubscribers関数を示しています。

例 3-1    グローバル変数にアクセスするRL関数を使用した結果の取得

Map alerts = null;
 
function getSubscribers(TrafficIncident ti) returns Map {
   try {
      alerts = new HashMap();
      assert(ti);
      run();
      return alerts;
   } finally {
      retract(ti);
      alerts = null;
   }
}
rule incidentAlert {
   if (fact TrafficIncident ti &&
      fact IncidentSubscription s &&
      s.highway == ti.highway &&
      s.direction == ti.direction) {
         alerts.put(s.subscriber, ti);
      }
   }
}

例3-2に、getSubscribers関数を起動し、結果を出力するJavaコードを示します。

例 3-2    グローバル変数の使用による結果の例

// An accident has happened
TrafficIncident ti = new TrafficIncident();
ti.setHighway("I5");
ti.setDirection("south");
ti.setIncident("accident");
ti.setWhen(new GregorianCalendar(2005, 1, 25, 5, 4));
ti.setDelay(45);

Map alerts = (Map)sess.callFunctionWithArgument("getSubscribers", ti);
Iterator iter = alerts.keySet().iterator();
while(iter.hasNext()) {
   String s = (String)iter.next();
   System.out.println("Alert " + s + " : " + alerts.get(s));
}

3.12.3 コンテナ・オブジェクトを使用した結果の取得

コンテナ・オブジェクト方法では、1つ以上のオブジェクトが作業メモリーにアサートされ、結果のコンテナとして機能します。オブジェクトをアサートするRL Languageコードによって、そのオブジェクトの参照が常に使用できるように保持されます。起動されたルールは、結果をコンテナに追加できます。コンテナ・オブジェクトは、Javaコレクション・クラスの1つか、特定のアプリケーション固有のコンテナ・オブジェクトの場合があります。ルール評価が完了すると、コンテナ・オブジェクトを検査して結果にアクセスできます。

例3-3 は、java.util.Mapオブジェクトを使用し、サブスクライバ(key)と事故(value)をMapオブジェクトに追加するgetSubscribers関数を示しています。getSubscribers関数は、MapオブジェクトおよびTrafficIncidentオブジェクトをアサートし、Rules Engineを起動して、結果をMapオブジェクトに返します。


注意:

Mapオブジェクトは、更新されている場合でも再アサートされません。通常、判断オブジェクトが更新されると、そのオブジェクトを再アサートする必要があります。このユースケースは、このルールに対する例外を表しています。マップalertsは、単に結果のコンテナであり、その内容は判断に関係しません。このため、再アサートしなくても問題ありません。 


例 3-3    コンテナ・オブジェクトを使用した結果の取得

function getSubscribers(TrafficIncident ti) returns Map {
   Map alerts = new HashMap();
   try {
      assert(alerts);
      assert(ti);
      run();
      return alerts;
   } finally {
      retract(alerts);
      retract(ti);
   }
}
rule incidentAlert {
   if (fact TrafficIncident ti &&
      fact IncidentSubscription s &&
      s.highway == ti.highway &&
      s.direction == ti.direction &&
      fact Map alerts) {
         alerts.put(s.subscriber, ti);
      }
   }
}

例3-2に、getSubscribers関数を起動し、結果を出力するJavaコードを示します。

3.12.4 判断オブジェクトを使用した結果の取得

判断オブジェクト方法では、1つ以上のオブジェクトがルール・エンジンの作業メモリーにアサートされ、オブジェクト参照は(getSubscribers関数の)RL Languageに保持されます。ルール評価プロセスによって、これらのオブジェクトの1つ以上が更新されます。これらのオブジェクトは、ルール評価による結果の判定後に検査されます。

例3-4では、TrafficIncidentクラスが、通知する必要のあるサブスクライバの更新済java.util.Setを保持するように変更されます。TrafficIncidentオブジェクトは判断されるために再アサートされます。同じサブスクリプションに対するルール起動の無限ループを回避するには、subscribedメソッドを使用して、一致した事故をテストする必要があります。このメソッドによってループが防止されます。subscribedメソッドは、一致するTrafficIncidentオブジェクトにサブスクライバがすでに追加されている場合はtrueを戻します。これは、ルール・プログラミングの共通の特徴です。ルール・アクションは判断されるファクトを更新します。不要な追加起動を回避するには、その更新の存在の有無をチェックする条件にテストを追加します。

例3-4は、TrafficIncidentオブジェクトをアサートし、Rules Engineを起動して、結果のMapオブジェクトを作成して返すgetSubscribers関数を使用するコードを示しています。

例 3-4    判断オブジェクトを使用した結果の取得

function getSubscribers(TrafficIncident ti) returns Map {
   try {
      assert(ti);
      run();
      Map alerts = new HashMap();
      for (Iterator iter = ti.subscribers(); iter.hasNext(); ) {
         alerts.put(iter.next(), ti);
      }        
      return alerts;
   } finally {
      retract(ti);
   }
}
rule incidentAlert {
   if (fact TrafficIncident ti &&
      fact IncidentSubscription s &&
      s.highway == ti.highway &&
      s.direction == ti.direction &&
      !ti.subscribed(s.subscriber)) {
         ti.addSubscriber(s.subscriber);
         assert(ti);
      }
   }
}

例3-2に、getSubscribers関数を起動し、結果を出力するJavaコードを示します。


戻る 次へ
Oracle
Copyright © 2005, 2006, Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引