ヘッダーをスキップ
Oracle Fusion Middleware Oracle Business Rulesユーザーズ・ガイド
11g リリース1(11.1.1)
B55917-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

5 デシジョン表の使用

デシジョン表を使用すると、IF/THENルール書式の代替となるわかりやすい書式でビジネス・ルールを作成し、使用できます。スプレッドシートに慣れたビジネス・アナリストにとって、デシジョン表の書式は直感的なものです。デシジョン表に用意されている仮の構造により、複数の類似するルールを容易に作成、理解および変更でき、ソフトウェアでルールの完全性および整合性をチェックできます。

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

5.1 デシジョン表の使用の概要

企業は、自社のビジネス・プロセスを自動化するためにソフトウェアに投資しています。 従来、この自動化の焦点は、データに関する意思決定を容易にするためのデータの収集、プレゼンテーションおよび操作に置かれていました。しかし、ビジネス・プロセスに関するルール詳細をソフトウェア・アーキテクチャに組み込むことで意思決定プロセスを自動化するという、ソフトウェア設計者と開発者に対する要求が大きくなってきています。また、多くの企業は、ビジネスの変化に対するソフトウェア・システムの応答性を高めようという圧力の高まりに直面しています。 場合によっては、ビジネス・ルールを記述およびテストする役割が、ソフトウェア・エンジニアではなく、研修を受けたビジネス・ユーザーに割り当てられるようになりました。また、ソフトウェアのビジネス上の動作の変更を従来のソフトウェア開発サイクルから分離し、その変更内容を製品や販売サイクルのようなビジネス主導の規範に関連付ける組織もあります。

デシジョン表は、特にコンピュータ・プログラマではなくビジネス・アナリストが記述を担当する場合に、データ処理タスクを記述するためのメカニズムを提供します。

Oracle Business Rulesデシジョン表には、次の機能があります。

デシジョン表を使用する主な理由は、検証および視覚化が容易であることです。

詳細は、第4章「ルールセットとルールの使用」を参照してください。

5.1.1 デシジョン表とは

デシジョン表では、スプレッドシート形式の単一ビューに複数の関連するルールが表示されます。Rules Designerの場合、デシジョン表には関連するビジネス・ルールのコレクション、条件行、ルールおよびアクションがわかりやすい表形式で表示されます。 ビジネス・ユーザーは、各セルおよびそれぞれの値をすばやく比較し、デシジョン表のルール分析機能(Rules Designerでアイコンをクリックして値を選択することで使用可能)を使用し、競合するケースや欠落しているケースを識別し、訂正できます。

デシジョン表の概念を理解しやすいように、運転者に免許資格があるかどうかを判別する一連のIF/THENルールおよび、それと同等のデシジョン表を示します。運転免許の教習を受講済の運転者が受講証明を持っていることに注意してください。

このIF/THENルールは次のようになります。

if driver.age < 20 and driver.has training then driver.eligible = true
if driver.age < 20 and driver.has training = false then driver.eligible = false
if driver.age >= 20 then driver.eligible = true (do not care about training for this case)

図5-1に、これらのルールをデシジョン表で表現したものを示します。この図には、デシジョン表の「条件」および「アクション」領域が含まれています。

図5-1 条件とアクションを使用するサンプル・デシジョン表

図5-1の説明が続きます
「図5-1 条件とアクションを使用するサンプル・デシジョン表」の説明

5.1.1.1 デシジョン表の条件に関する必須情報

デシジョン表の「条件」領域には、1つ以上の条件行が含まれています。各条件行には条件式があり、ルールごとに条件セルがあります。条件式は、Rules Designerで作成する式です。 通常、条件式は条件行に表示され、データ・モデルのファクト(Javaファクト、XMLファクト、RLファクトまたはADF Business Componentsファクト)に適用されます。各条件式にはバケット・セットが関連付けられています。バケット・セットは処理中にローカル・バケット・セットを使用して定義するか、グローバル・バケット・セットを使用できます。特定の条件セルの値または範囲は、関連付けられている値リスト・バケット・セットまたは範囲バケット・セット内の1つ以上のバケットから値または範囲を取ります。バケット・セットの詳細は、第3.6項「バケット・セットの使用」を参照してください。

たとえば、図5-1は、Driver.ageプロパティを持つDriverファクトの条件式を示しています。デシジョン表内の対応する行は、範囲<20および>=20のバケットを含む条件セルを示しています。 セルの値は、driver_agesというグローバル・バケット・セットから取得されます。

図5-1には、Driver.has_trainingプロパティを持つDriverファクトの条件行も示されています。この条件行は、値true、falseおよび-を持つ条件セルを示しています。 ハイフン(-)は、考慮されないこと(つまり、この場合はDriver.has_trainingtrueでもfalseでもかまわないこと)を意味します。これらの条件セルの値は、ブール型に関連付けられているデフォルト・バケット・セットから取得されます(このデフォルト・バケット・セットは、値trueおよびfalseのデフォルト・バケットで構成されています)。

デシジョン表にはルールがバケット順に表示され、ルールの順序を変更するにはバケット・セット内のバケットの順序を変更する必要があります。つまり、条件行に関連付けられているバケット・セット内のバケットの順序によって条件セルの順序が決まり、したがってルールの順序も決まります。デシジョン表でのルールの順序付けは、条件行に関連付けられているLOVバケット・セット内のバケットの相対位置を変更することで管理できますが、範囲バケットの順序は変更できません。 バケット・セット内のバケットの順序付けの詳細は、第3.6.1項「値リストのグローバル・バケット・セットの定義方法」を参照してください。

5.1.1.2 デシジョン表のアクションに関する必須情報

デシジョン表では、アクションはルールに関連付けられています。実行時には、条件セルについてファクトが一致すると、Rules Engineにより、そのルールに関連付けられているアクションの実行が準備されます。

表5-1に、「アクション」領域で選択できるアクションのタイプを示します。つまり、関数のコール、新規ファクトのアサート、ファクトの取消しまたは変更を行うことができます。 「アクション」領域では、ルールに対する個別アクションに対応するセルをアクション・セルと呼びます。拡張モードには、アクション用の他のオプションがあります。 拡張モードの詳細は、第4.5.2項「拡張モード・オプションの選択方法」を参照してください。

表5-1 アクション・セルに値するデシジョン表のアクション

アクション 説明

Assert New

新規ファクトのアサート

Call

関数のコール

Retract

ファクトの取消し

Modify

一致したファクトに関連付けられているデータ値の変更


複数のアクションを追加する場合、「アクション」領域で追加したアクションは順序付けされます。上位の行に表示されるアクションが実行されてから、下位の行のアクションが実行されます。

デシジョン表のアクション(modifyなど)では、条件セル内で一致したファクトを参照できます。 たとえば、デシジョン表にDriverファクトの条件行があり、そこにDriver.ageDriver.has_trainingの条件行が含まれている場合、アクションでプロパティDriver.eligibleを変更でき、アクション・セルごとにDriver.eligibleの値を指定できます。

「アクション」領域では、特定タイプのアクションに「パラメータ化」チェック・ボックスが用意されています。このチェック・ボックスでは、アクションのプロパティにデシジョン表内でルールに関連付けられているアクション・セル内の値セットを使用できるかどうかを指定します。 「パラメータ化」チェック・ボックスを選択すると、「アクション」領域でアクションの式の値に入力した値は、アクション・セルに値が入力されていない場合にプロパティのデフォルト値になります。例については、図5-2を参照してください。この図では、アクション・プロパティeligibleのデフォルト値として値falseが割り当てられています。

図5-2 デフォルト値が設定されたパラメータ化アクションが表示されているアクション・エディタ

図5-2の説明が続きます
「図5-2 デフォルト値が設定されたパラメータ化アクションが表示されているアクション・エディタ」の説明

5.1.1.3 デシジョン表のルールに関する必須情報

ルールセットにはデシジョン表が含まれています。このため、IF/THENルールとともにデシジョン表をグループ化できます。 ルールおよびデシジョン表がルールセット内でグループ化されている場合は、IF/THENルールおよびデシジョン表のルールすべてが一連の相関ルールとして実行されます。

デシジョン表内のルールには名前がありません。 Rules Designerではデシジョン表内のルールがR1、R2およびR3のようなラベル付きで表示されますが、これらのルール・ラベルは個別ルールの名前ではなく、デシジョン表に含まれているルールの現行の順序付けから導出されたラベルです。したがって、ラベルR1が付いているルールを位置3に移動すると、Rules Designerにより、このルールのラベルがR3に変更されます。

デシジョン表内のルールは、条件セルのツリーを含む表として編成されます。1行目の条件セルは、以降の条件行のセルに続きます。行iの親セルは、行i+1の子に続きます。

図5-3に、デシジョン表内のルールを示します。この表では、各ルールは「条件」領域の各行からの単一セル、および「アクション」領域の同じ列の関連するアクション・セルで構成されています。 図5-3に示すように、ラベルR3が付いているルールは、条件1の第1セル(Driver.age < 20バケット)、条件2の第2セル(Driver.eye_test = failバケット)および条件3の第3セル(Driver.has_training = trueバケット)により定義されます。同様に、R1からR12までの他の各ルールにもデシジョン表全体で一意のパスがあります。

図5-3 デシジョン表内のルール

図5-3の説明が続きます
「図5-3 デシジョン表内のルール」の説明

図5-3に示すように、あるセルを別のセルの親にして、親セルが下位セルに続くことが重要です。「条件」領域では、複数の条件セルが同じ親条件セルを持つ場合、それらのセルを兄弟と呼びます。兄弟である条件セルにのみ適用される操作があります。例として、図5-4に2つの兄弟セルが選択されている状態を示します。これらのセルで選択されている「選択済セルのマージ」操作は有効です。 これらのセルの場合、対応するバケット(Driver.eye_testの値fail)も兄弟です(>図5-4のR3列およびR4列を参照)。 詳細は、第5.3.3項「デシジョン表内の条件のマージまたは分割方法」を参照してください。

図5-4 デシジョン表の兄弟条件セル

図5-4の説明が続きます
「図5-4 デシジョン表の兄弟条件セル」の説明

Rules Designerでは、行を選択して「移動」アイコンをクリックすることで、行の順序を容易に変更できます。「条件」領域で行の順序を変更すると、条件セルに対する操作を必要な粒度で実行できます。つまり、条件セルの位置や、条件セルの親、子または兄弟の位置に応じて、ツリーの特定レベルでのみ適切な特定の値を分割、マージまたは割り当てる場合に、移動操作を使用できます。

5.1.2 デシジョン表の値

デフォルトでは、条件行の作成時にデシジョン表により単一の条件セルが作成され、そのセルに「-」値が割り当てられます。値「-」を持つ条件セルは、バケット・セット内ですべてのバケットが考慮されないか、いずれかのバケットに一致することを意味します。 例として、図5-5Driver.ageについて考慮されない値を示します。

図5-5 条件セルで考慮されない値を示すサンプル・デシジョン表

図5-5の説明が続きます
「図5-5 条件セルで考慮されない値を示すサンプル・デシジョン表」の説明

デシジョン表の「アクション」領域では、あるアクション・セルが何も実行しないように指定できます。 この場合は、そのアクション・セルの選択を解除します。 アクション・セルのチェック・ボックスの選択が解除されている場合は、パターンがデシジョン表内で指定の条件値に一致しても、このアクションが実行されないことを意味します。つまり、アクション・セルごとに、関連付けられているルールでアクションをアクティブにする必要があるか、またはアクションを実行しないかを指定できます。

デシジョン表では、条件セルがバケット・セットから削除済のバケットを表している場合、Rules Designerにより次のような検証警告が表示されます。

RUL-05831: Decision table bucket reference not found

このタイプの検証警告を解決するには、次のいずれかを実行できます。

  • 条件セルをダブルクリックしてドロップダウン・リストからバケットを1つ以上選択し、値を定義します。

  • 欠落しているバケットをバケット・セットに追加するか、欠落しているバケットを含む別のバケット・セットに条件を関連付けます。

5.1.3 デシジョン表のループに関する必須情報

デシジョン表のループは、条件行の値がアクションにより変更される場合に発生します。ループは、単一のデシジョン表内のルール間か、複数のデシジョン表全体か、同一ルールセット内のルールおよびデシジョン表全体で設定できます。 デシジョン表のアクションとして、デシジョン表の条件で使用されるファクト・プロパティを変更するアクションは作成しないでください。 このようなアクションによって、無限ループが発生する場合があります。

5.2 デシジョン表の作成

デシジョン表を追加するには、複数のステップを実行します。ステップは次のとおりです。

5.2.1 デシジョン表の作成方法

デシジョン表で作業するには、まずルールセット内にデシジョン表を作成します。

デシジョン表を作成する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」タブから既存のルールセットを選択するか、「ルールセットの作成」をクリックしてルールセットを作成します。

  2. 図5-6に示すように、「追加」アイコンをクリックしてドロップダウン・リストから「デシジョン表の作成」を選択します。 これにより、デシジョン表が作成されます。

    図5-6 デシジョン表の追加

    図5-6の説明が続きます
    「図5-6 デシジョン表の追加」の説明


注意:

デシジョン表を追加すると、ルール検証ログに検証警告が表示されます。 デシジョン表は、条件およびアクションを追加するまでは不完全なものであり、検証すると必ず警告が表示されます。

5.2.2 デシジョン表への条件行の追加方法

デシジョン表には、デシジョン表の条件行を指定するための「条件」領域が含まれています。 条件行により、Oracle Rules Engineで実行時に照合されるファクトが決定されます。デシジョン表を作成するには、デシジョン表に条件行を1行以上追加する必要があります。

デシジョン表に条件行を追加する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件を追加するデシジョン表を選択します。

  2. 「デシジョン表」領域で、「追加」アイコンの横にあるドロップダウン・リストから「条件」を選択します。

  3. 図5-7に示すように、「条件」領域で、「<条件の編集>」をダブルクリックしてナビゲータを表示し、式を選択または入力します。

    図5-7 デシジョン表への条件の追加

    図5-7の説明が続きます
    「図5-7 デシジョン表への条件の追加」の説明

  4. ナビゲータ内でクリックして変数を選択するか、「式ビルダー」アイコンをクリックして「式ビルダー」ウィンドウを表示し、式を入力します。「式ビルダー」を使用すると式を作成できます。

  5. 各条件行には、各セルの値を取り出すバケット・セットが必要です。選択した値にグローバル・バケット・セットが関連付けられている場合は、デフォルトでバケット・セットに条件行が関連付けられます。

  6. 必要に応じて手順2から手順5を繰り返し、デシジョン表にさらに条件行を追加します。

ローカル・バケット・セットを使用するか、デシジョン表の条件用のバケット・セットを指定する手順は、次のとおりです。

  1. 各条件行には、各セルの値を取り出すバケット・セットが必要です。選択した値にグローバル・バケット・セットが関連付けられている場合は、デフォルトでバケット・セットに条件行が関連付けられます。

  2. その値に関連付けられているグローバル・バケット・セットがない場合は、デシジョン表に条件行を追加した後、条件行に関連付けるローカル値リスト・バケット・セットまたはローカル範囲リスト・バケット・セットを指定するか、既存のグローバル・バケット・セットを指定する必要があります。 バケット・セットを条件に追加するには、図5-8に示すように、「条件」領域で条件を選択し、バケット・セットのドロップダウン・リストから選択してバケット・セットを関連付けます。 バケット・セット・リストには、該当するタイプの使用可能なグローバル・バケット・セットが含まれています。

    図5-8 デシジョン表で条件行に使用するバケット・セットの指定

    図5-8の説明が続きます
    「図5-8 デシジョン表で条件行に使用するバケット・セットの指定」の説明

  3. グローバル・バケット・セットを指定しない場合は、「ローカルの値リスト」または「範囲のローカル・リスト」を選択してローカル・バケット・セットを作成して使用し、指定したタイプのバケット・セットを作成して使用できます。

  4. 必要に応じて手順2から手順3を繰り返し、デシジョン表にさらに条件行を定義します。

バケット・セットの作成の詳細は、第3.6項「バケット・セットの使用」を参照してください。

5.2.3 デシジョン表へのアクションの追加方法

デシジョン表には、デシジョン表のアクションを指定するための「アクション」領域が含まれています。これにより、デシジョン表内のルールに対するアクションが決まります。

有効なデシジョン表を作成する手順は、次のとおりです。

  1. デシジョン表にアクションを追加します。

  2. 特定の値が適用されるアクション・セルごとに、値を設定します。

  3. アクション・セルごとに、アクションがルールに適用されない場合はそのセルの選択を解除します。 デフォルトでは、デシジョン表にアクションを追加すると、すべてのルールに対するアクションの選択が解除されます。

デシジョン表にアクションを追加する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクションを追加するデシジョン表を選択します。

  2. 「追加」アイコンの横にあるドロップダウン・リストから「アクション」を選択し、ドロップダウン・リストから使用可能なアクションを選択します。表5-1に、使用可能なアクションを示します。たとえば、「Modify」を選択します。 図5-9に示すように、Rules Designerの「アクション・エディタ」ダイアログが表示されます。

    図5-9 デシジョン表へのアクションの追加

    図5-9の説明が続きます
    「図5-9 デシジョン表へのアクションの追加」の説明

  3. 「アクション・エディタ」ダイアログの「ターゲット」領域で、アクションのターゲットを選択します。これにより、アクションが適用されるデータ・モデル・オブジェクトが指定されます。

  4. 指定したターゲットについて、必要に応じてアクションで目的の操作が実行されるように、「引数」表のフィールドを変更します。「アクション・エディタ」ダイアログの「引数」表には、表5-2に示すフィールドが含まれています。

    表5-2 「アクション・エディタ」ダイアログの「引数」フィールド

    フィールド 説明

    プロパティ

    指定したターゲットのプロパティ名が表示されます。

    タイプ

    プロパティのタイプが表示されます。

    使用可能なアクションのドロップダウン・リストから、アクションのデフォルト値を選択します。指定した値は、アクション全体にデフォルト値として適用されるか、または特定のアクション・セルを選択している場合は、選択したアクション・セルに適用されます。

    パラメータ化

    パラメータ化された値を指定します。パラメータ化された値は、デシジョン表のアクション・セルに表示されます。 パラメータ化された値をプロパティに選択すると、通常は各ルールにより異なるパラメータ値が入力されます。

    定数

    定数値を指定する場合に選択します。


  5. 「アクション・エディタ」ダイアログで、すべてのルールのアクション・セルを選択するには、「常に選択」チェック・ボックスを選択します。

  6. 必要に応じてステップ2からステップ5を繰り返し、デシジョン表に対してさらにアクションを定義します。

デシジョン表内のアクション・セルの値を設定する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクション・セル値を指定するデシジョン表を選択します。

  2. 「アクション」領域で、適切なアクション・セルが選択されていることを確認します。「アクション・エディタ」ダイアログで「常に選択」チェック・ボックスを選択した場合は、すべてのアクション・セルを選択する必要があります。「常に選択」チェック・ボックスの選択が解除されている場合は、アクション・セルのチェック・ボックスを使用して適切なアクション・セルを選択します。

  3. 「アクション」領域で、選択したアクション・セルごとに、パラメータ化されたプロパティに適切な値を入力します。そのためには、アクション・セルのプロパティ・セルを選択し、値を入力するか、ドロップダウン・リストから値を選択するか、または「式ビルダー」アイコンをクリックして「式ビルダー」ダイアログを使用します。

デシジョン表のアクション・セルの選択を解除する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクション・セルの選択を解除するデシジョン表を選択します。

  2. 「アクション」領域で、アクション・セルを選択し、アクション・セル内のチェック・ボックスの選択を解除します。 アクションに対して「常に選択」が設定されている場合は、アクション・セル値の選択を解除できません。

アクションを追加するときに、アクションの順序変更が必要になる場合があります。 Rules Designerでは、「下に移動」アイコンまたは「上に移動」アイコンを使用して、アクションの順序を変更できます。

5.2.4 デシジョン表へのルールの追加方法

デシジョン表にルールを追加できます。 Rules Designerでは、ルール用に列が表示され、各条件セルが「-」(考慮しない)に初期化されます。

デシジョン表にルールを追加する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、ルールを追加するデシジョン表を選択します。

  2. 「追加」アイコンの横にあるドロップダウン・リストから、「ルール」を選択します。

  3. 条件セルの値を入力します。 バケット値の順序が定義どおりに保たれるように、必要に応じてルールが移動することに注意してください。

  4. アクション・セルの値を入力します。

5.3 デシジョン表の操作の実行

デシジョン表の作成後、デシジョン表に対して次のような操作を実行できます。

5.3.1 デシジョン表の操作の概要

デシジョン表の作成後に、デシジョン表の内容を変更し、すべてのケースに関する完全なルールセットを含むデシジョン表を生成したり、複数のケースに関して最小数のルールを提供するデシジョン表を生成できます。

5.3.1.1 デシジョン表の分割操作と圧縮操作

分割操作と圧縮操作を使用すると、デシジョン表の条件セルの内容を操作できます。

表分割操作では、条件間でバケットの組合せごとにルールが作成されます。たとえば、3つのブール条件を持つデシジョン表には、2 x 2 x 2 = 8のルールが作成されます。32のブール条件を持つデシジョン表では、2**32から20億のルールが作成されます。 したがって、作成されるルールの数が少なく、アクション・セルに十分に収まる場合は、表分割を使用するのが適切です。

デシジョン表内で考慮されない値に一致条件を適用し、セルごとに一致ケースを作成する場合は、表分割操作を使用します。

分割は、デシジョン表全体または単一の条件行に適用できます。また、個別の条件セルに対して分割を実行することもできます。

デシジョン表で選択した内容に応じて、分割操作により条件セルを作成できます。つまり、分割操作を使用してデシジョン表内でルールを作成できます。表5-3に、選択した条件セル、条件行またはデシジョン表全体に対する分割操作のまとめを示します。

表5-3 分割操作のまとめ

演算子 説明

条件セル

セルが表すバケット値ごとに、兄弟の条件セルが1つ作成されます。

条件セルの値が「考慮されない」である場合、そのセルは、兄弟の条件セルで表されていないバケット・セット内のバケットごとに1つの兄弟セルに分割され、考慮されない値は表示されなくなります。

条件行

直前の条件式内の各条件セルについて、バケット・セット内の値ごとにセルを1つ含んだ兄弟グループを作成します。この操作には、各兄弟グループに考慮されない値を追加して、各兄弟グループ内の条件セルごとにsplitをコールするのと同じ効果があります。

デシジョン表


デシジョン表内の各条件行に対してsplitをコールするのと同じ効果があります。


デシジョン表で選択した内容に応じて、表圧縮またはセル・マージ操作により条件セルを削除できます。表圧縮操作は、デシジョン表全体に適用できます。また、マージ操作は、兄弟セルまたは条件行全体に対して実行できます。つまり、表圧縮またはマージを使用してデシジョン表からルールを削除できます。表5-4に、表圧縮操作およびマージ操作のまとめを示します。

表5-4 マージ操作のまとめ

演算子 説明

条件セル

複数の条件セルをマージすると、各セル内のすべてのバケットが単一セルに追加され、そのセルを除くすべてのセルが削除されます。セルの1つに考慮されない値が表示されている場合、マージされたセルにも考慮されない値が表示されます。

この操作ではアクション・セルをマージでき、これにより、「RUL-05847: 重複するデシジョン表アクション・パラメータ"{0}"」など、重複するアクション・セルに関する警告を作成できます。

条件行

各兄弟グループ内のすべての値が、直前の条件式にある条件セルごとに結合されて単一の考慮されない値セルとなります。この操作には、各兄弟グループ内のすべてのセルに対してmergeをコールするのと同じ効果があります。

この操作ではアクション・セルをマージでき、これにより、「RUL-05847: 重複するデシジョン表アクション・パラメータ"{0}"」など、重複するアクション・セルに関する警告を作成できます。

デシジョン表


ルールの条件を同一アクションとマージすることでデシジョン表が圧縮されます。


競合するアクション・セルが操作に関連付けられていない場合、分割とマージが逆の操作になります。この場合、マージ操作では、アクション・セルの競合を発生させずに、兄弟からすべての値を結合して1つの兄弟とし、他の兄弟条件セルを破棄します。また、条件セルがマージされた結果、デシジョン表にアクション・セルが含まれている場合は、アクション・セルもマージされます。そのため、マージ操作では複数の条件セルが結合されて単一の条件セルとなり、その単一セルにすべてのバケットが追加されます。

競合する値を持つアクション・セルは、マージ操作では追加の手動ステップを必要とする形式でマージされます。そのため、2つのアクション・セルのパラメータが競合する場合、マージ後のアクション・セルには競合する複数のパラメータ値が含まれることになります。これらの競合する値はアクション・セルに追加され、不要な重複パラメータを選択して削除することにより手動で解決する必要があります。例については、アクション・セル内で競合する値を示す図5-10を参照してください。

1つのプロパティについて複数の値を含むアクション・セルは無効です。 このアクション・セルを選択すると、Rules Designerではアクション・セル用の単一値を選択できるように、チェック・ボックスを含むポップアップ・ウィンドウが表示されます。図5-10の検証ログに示すように、Rules Designerでは単一値を選択するまで検証警告が表示されます。

図5-10 マージ後のアクション・セルについて解決が必要な競合するプロパティ

図5-10の説明が続きます
「図5-10 マージ後のアクション・セルについて解決が必要な競合するプロパティ」の説明

5.3.1.2 デシジョン表の移動操作

デシジョン表内で条件またはアクションを移動できます。「移動」アイコンを使用すると、「条件」領域に表示される条件行や「アクション」領域に表示されるアクションの順序を変更できます。条件を上下に移動してルールの表示順序を変更できますが、これらの操作によってロジックが変わることはありません。たとえば、if (x.a == 1 and x.b == 1)は論理的にはif (x.b == 1 and x.a == 1)と同じです。

デシジョン表で作業する場合、一部の操作は兄弟である条件セルにのみ適用されます。「移動」アイコンを使用すると、デシジョン表の操作が必要な粒度でツリーに適用されるように行の順序を変更できます。たとえば、単一ルールの条件セルに対するアクションを変更する場合は、その条件セルをデシジョン表の「条件」領域の最終行に移動する必要があります。例として、図5-11に示すデシジョン表を考えてみます。

図5-11 デシジョン表内のルール

図5-11の説明が続きます
「図5-11 デシジョン表内のルール」の説明

この表をDriver.ageの粒度で表示するには、図5-12に示すように、Driver.age条件を第1行から第3行に移動します。

図5-12 age条件を最終行に移動した後のデシジョン表

図5-12の説明が続きます
「図5-12 age条件を最終行に移動した後のデシジョン表」の説明

運転者が視力検査に合格して教習を受講したことがあれば、最初の2つのルールについてDriver.age条件を「考慮しない」に設定する場合、Driver.age条件が最終行にあると、この特定の条件に変更内容を適用するのは容易です。 つまり、この表では、Driver.ageが最終行にあると、年齢に関連するルールを最大粒度で容易に表示して変更できます。通常は、条件セルの位置や、条件セルの親、子または兄弟の位置に応じて、ツリーの特定レベルでのみ適切な特定の値を分割、マージまたは割り当てる場合に、移動操作を使用できます。

「アクション」領域内のアクションの場合は、「上へ移動」または「下に移動」をクリックするとアクションの順序を変更できます。アクションは、複数のアクションが適用される場合に最初のアクションが実行されてから以降のアクションが実行されるように順序付けされます。そのため、アプリケーションによっては、アクションに「上へ移動」または「下に移動」操作を使用することが適切な場合があります。

5.3.1.3 デシジョン表のギャップ分析

ギャップとは、デシジョン表内で欠落しているルールです。 デシジョン表にギャップが生じるのは、各条件からの1つのバケットの組合せが、既存のルールの対象でない場合です。Rules Designerには、ギャップをチェックするための「ギャップ分析」が用意されています。 「ギャップ分析」アイコンをクリックすると、Rules Designerによりギャップが検索され、検出されたギャップを修正するためのダイアログが表示されます。

ギャップがあると検証警告が表示されるように選択できます。「詳細設定」領域で「ギャップの許可」の選択を解除すると、ギャップの検出時にデシジョン表で検証警告がレポートされます。詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

たとえば、Driverの例では、Driver.age < 20でDriver.has_trainingfalseのケースを対象とするルールを削除してギャップを作成してから、「ギャップ分析」をクリックすると、図5-13に示す「ギャップ分析」ダイアログが表示されます。チェック・ボックスを選択して「OK」をクリックすると、すべてのルールまたは選択したルールがデシジョン表に追加されます(この例では、追加対象として単一のルールが表示されているのみです)。

図5-13 「ギャップ分析」の使用

図5-13の説明が続きます
「図5-13 「ギャップ分析」の使用」の説明

次のケースについては、ギャップ分析により異なる新規ルールが生成されます。

  • 兄弟ルール: 欠落している複数の兄弟ルールが単一の新規ルールとして追加されます。 たとえば、2つの条件Driver.ageおよびDriver.hairを持つルールを考えてみます。 異なる髪色に関して2つのルールが欠落しており、それらが兄弟(つまり、共通の親を持つ)ルールの場合、ギャップ分析では図5-14に示すように単一ルールが表示されます。

  • 非兄弟ルール: 欠落している複数の非兄弟ルールが、個別の新規ルールとして追加されます。たとえば、同じ親を持たない2つの異なるルールが欠落している場合、ギャップ分析では図5-15に示すように2つのルールが表示されます。

図5-14 欠落している兄弟ルールがある場合のギャップ分析

図5-14の説明が続きます
「図5-14 欠落している兄弟ルールがある場合のギャップ分析」の説明

図5-15 欠落している非兄弟ルールがある場合のギャップ分析

図5-15の説明が続きます
「図5-15 欠落している非兄弟ルールがある場合のギャップ分析」の説明

図5-14図5-15に示したどちらの場合も2つのバケットが欠落していますが、兄弟ルールの場合は複数のバケットが結合されて新規の単一ルールになります。したがって、通常、ギャップ分析では、多数の限定的なルールではなく少数の汎用的なルールが提案されます。

兄弟ルールの場合は、複数のルールを追加した後、必要なバケットを取得するように各セルを編集できます。または、ギャップの検索を使用してルールを追加してから、複数の値を含むセルを分割し、不要なルールを削除します。

5.3.1.4 デシジョン表の競合分析

デシジョン表内のルールが競合する場合があります。2つのルールが競合するのは、両者が重複し、異なるアクションが設定されている場合です。2つのルールが重複するのは、その条件セルの1つ以上に共通するバケットがある場合です。重複は、デシジョン表に考慮されない条件セルが含まれている場合に一般的です。競合のない重複は一般的であり、問題はありません。

Rules Designerでは競合が検出され、「競合の表示」をクリックするとデシジョン表の「競合解決」行に競合を表示できます。例として、図5-16に競合するルールを含むデシジョン表を示します。

図5-16 「競合」領域に競合するルールが表示されているデシジョン表

図5-16の説明が続きます
「図5-16 「競合」領域に競合するルールが表示されているデシジョン表」の説明

デシジョン表の「競合解決」領域でセルをクリックすると、次の方法でルール間の競合を解決できます。

  • オーバーライド(「Override」および「OverriddenBy」): あるルールを他のルールでオーバーライドできます。 オーバーライドにより、1つのルールの起動を指定します。オーバーライドは、優先度設定と相互排他を組み合せたものです。優先度設定は一時的であり、相称的ではありません。相互排他は一時的かつ相称的です。AによりCがオーバーライドされ、BによりCがオーバーライドされる場合、実行順序は最初にAまたはB、次にCとなりますが、実行されるのはA、BまたはCのうち1つのみです。

  • 前に実行(「RunBefore」および「RunAfter」): ルールの優先度を設定します。 前に実行により、2つのルールが規定の順序で起動されます。優先度設定は一時的ですが、相称的ではありません。 つまり、A、B、Cの順に実行される場合、AはCの前に実行されますが、BはAの前に実行されません。この場合、デシジョン表のrunBeforeリストが使用されます。このリストでは、前に実行されるルールがこのリスト内にある他のルールより高い優先度を持つように指定されています。

  • 無視(「NoConflict」): 競合を無視します。 無視により、2つのルールが任意の順序で起動されます。たとえば、デシジョン表内で競合する次のルールを考えてみます。

    rule1: everybody gets a 10% raise (as specified with a do not care value in a decision table condition cell)
    rule2: employee with Top Performer set to true gets a 5% raise
    

    これらのルールでは、rule2によりrule1がオーバーライドされると、最上位成績者が5%の昇給を取得し、それ以外の全員が10%の昇給を取得します。 ただし、この場合は、両方のルールを起動させます。 どちらのルールを最初に起動しても問題なく、競合もないため、どちらを先に起動しても最上位成績者は15.5%の昇給を取得します。この場合は、NoConflictリストを使用して競合を解決します。 競合なしとは、同一の優先度を持つIF/THENルールで取得するものであり、競合は警告されないのみで、一方のルールで他方のルールをオーバーライドするかどうかは慎重に考慮する必要があることに注意してください。

図5-17に、「競合解決」領域で競合するルールを選択したときに表示される、Rules Designerの「競合解決」ダイアログを示します。このダイアログでは、オーバーライド、「RunBefore」または「RunAfter」オプションによる優先度設定および「NoConflict」オプションを選択して、ルール間の競合を解決できます。

図5-17 デシジョン表の「競合解決」ダイアログの使用

図5-17の説明が続きます
「図5-17 デシジョン表の「競合解決」ダイアログの使用」の説明

デシジョン表の「詳細設定」の「自動競合解決」オプションを使用すると、可能な場合は競合を自動的に解決するように指定できます。 自動競合解決ポリシーでは、特殊ケースにより一般的なケースがオーバーライドされるように指定します。詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

つまり、デシジョン表に競合がある場合は、次の1つ以上を実行して競合を解決できます。

  • デシジョン表の「自動競合解決」チェック・ボックスを選択して自動競合解決を使用します。

  • 「競合の表示」チェック・ボックスを選択して「競合解決」領域でセルを選択し、「競合解決」ダイアログを使用します。

  • デシジョン表を変更して重複を削除します。

  • アクションを結合して競合を削除します。

5.3.2 デシジョン表の圧縮または分割方法

「表の圧縮」アイコンおよび「表の分割」アイコンを使用して、デシジョン表を圧縮または分割します。詳細は、第5.3.1.1項「デシジョン表の分割操作と圧縮操作」を参照してください。

デシジョン表を圧縮する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、圧縮するデシジョン表を選択します。

  2. 「表の圧縮」アイコンをクリックします。

デシジョン表のセルを分割する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、分割するデシジョン表を選択します。

  2. 「表の分割」アイコンをクリックします。

5.3.3 デシジョン表内の条件のマージまたは分割方法

条件マージ操作および条件分割操作を使用して、デシジョン表内の条件をマージまたは分割します。詳細は、第5.3.1.1項「デシジョン表の分割操作と圧縮操作」を参照してください。

デシジョン表内の条件をマージする手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件をマージするデシジョン表を選択します。

  2. 「条件」領域で、マージする条件を選択します。

  3. 右クリックしてドロップダウン・リストから「条件のマージ」を選択します。

デシジョン表内の条件を分割する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件を分割するデシジョン表を選択します。

  2. 「条件」領域で、分割する条件を選択します。

  3. 右クリックしてドロップダウン・リストから「分割条件」を選択します。

5.3.4 条件セルのマージ、分割および考慮されない条件セルの指定

条件セル操作を使用して、条件セルの分割、兄弟条件セルのマージ、またはデシジョン表内の条件セルについて考慮されない値を指定します。詳細は、第5.3.1.1項「デシジョン表の分割操作と圧縮操作」を参照してください。

デシジョン表内の条件の兄弟セルをマージする手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件セルをマージするデシジョン表を選択します。

  2. マージする兄弟条件セルを選択します。

  3. 右クリックしてドロップダウン・リストから「選択済セルのマージ」を選択します。

デシジョン表内の条件のセルを分割する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件セルを分割するデシジョン表を選択します。

  2. 分割するセルを選択します。

  3. 右クリックしてドロップダウン・リストから「選択済セルの分割」を選択します。

デシジョン表内の条件セルについて考慮されない値を指定する手順は、次のとおりです。

  1. Rules Designerから、「ルールセット」ナビゲーション・タブでルール・セットを選択し、考慮されない値を設定するデシジョン表を選択します。

  2. 該当する条件セルを選択します。

  3. 右クリックしてドロップダウン・リストから「考慮しない」を選択します。

すべてのバケットを選択して条件セルについて考慮されない値を指定する手順は、次のとおりです。

  1. Rules Designerから、「ルールセット」ナビゲーション・タブでルール・セットを選択し、考慮されない値を設定するデシジョン表を選択します。

  2. 該当する条件セルを選択します。

  3. ダブルクリックし、ドロップダウン・リストから可能な値すべてについて使用可能なチェック・ボックスをすべて選択します。

5.3.5 デシジョン表のギャップ分析の実行方法

ギャップとは、デシジョン表内で欠落しているルールです。 デシジョン表にギャップが生じるのは、各条件からの1つのバケットの組合せが、既存のルールの対象でない場合です。Rules Designerには、ギャップをチェックするための「ギャップ分析」が用意されています。この操作を使用すると、Rules Designerにギャップを修正するためのウィンドウが表示されます。詳細は、第5.3.1.3項「デシジョン表のギャップ分析」を参照してください。

ギャップがあると検証警告が表示されるように選択できます。「詳細設定」領域で「ギャップの許可」の選択を解除すると、ギャップの検出時にデシジョン表で検証警告がレポートされます。詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

デシジョン表のギャップ分析を実行する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、実行対象のデシジョン表を選択します。

  2. 「ギャップ分析」アイコンをクリックします。

5.3.6 デシジョン表の競合分析の実行方法

デシジョン表内のルールが競合する場合があります。2つのルールが競合するのは、両者が重複し、異なるアクションが設定されている場合です。2つのルールが重複するのは、その条件セルの1つ以上に共通するバケットがある場合です。詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

デシジョン表の競合分析を実行する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、競合をチェックするデシジョン表を選択します。

  2. 「条件」領域で、「競合」領域に競合が存在する場合は、競合のあるルールごとに該当する条件セルをダブルクリックして「競合解決」ダイアログを表示します。

  3. 「競合解決」ダイアログで、競合するルールごとに、「解決」フィールドのドロップダウン・リストから解決を選択します。

5.3.7 自動競合解決オプションの選択方法

デシジョン表で「詳細設定」オプションを選択する際に、「オーバーライド」競合解決を使用してデシジョン表の競合が自動的に解決されるように選択できます(これは、自動競合解決ポリシーを使用して競合を解決可能な場合にのみ適用されます)。自動競合解決ポリシーでは、特殊ケースにより一般的なケースがオーバーライドされます。 詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

自動競合解決オプションを選択する手順は、次のとおりです。

  1. 「自動競合解決」オプションを使用するルールまたはデシジョン表を選択します。

  2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします。

  3. 「自動競合解決」を選択します。

5.4 Oracle Business Rulesデシジョン表アプリケーションの作成と実行

注文承認アプリケーションは、SOAコンポジット・アプリケーションとOracle Business Rulesとの統合、およびデシジョン表の使用方法を示しています。

このアプリケーションでは、プロセスは次の目的でデシジョン・コンポーネントを使用するようにモデル化されています。

この手順を完了するには、次の作業が必要です。

5.4.1 注文承認アプリケーションのソース・ファイルの取得方法

Oracle Business Rules固有のサンプルのソースコードを、次のWebサイトからオンラインで入手できます。

http://www.oracle.com/technology/sample_code/products/rules

SOAのサンプルは、次のWebサイトから入手できます。

http://www.oracle.com/technology/sample_code/products/soa

注文承認アプリケーションで作業するには、order.xsdスキーマ・ファイルを取得して(オンラインで入手したサンプル・プロジェクトから取得するか、作成することもできます)、すべてのアプリケーション、プロジェクトおよびその他のファイルをOracle JDeveloperで作成する必要があります。 例5-1に示すスキーマ・ファイルをローカルに保存して、Oracle JDeveloperで使用できるようにすることができます。

例5-1order.xsdスキーマ・ファイルを示します。

例5-1 order.xsdスキーマ

<?xml version="1.0" ?>
<schema attributeFormDefault="qualified" elementFormDefault="qualified"
        targetNamespace="http://example.com/ns/customerorder"
        xmlns:tns="http://example.com/ns/customerorder"
        xmlns="http://www.w3.org/2001/XMLSchema">
  <element name="CustomerOrder">
    <complexType>
      <sequence>
        <element name="name" type="string" />
        <element name="creditScore" type="int" />
        <element name="annualSpending" type="double" />
        <element name="value" type="string" />
        <element name="order" type="double" />
      </sequence>
    </complexType>
  </element>
  <element name="OrderApproval">
    <complexType>
      <sequence>
        <element name="status" type="tns:Status"/>
      </sequence>
    </complexType>
  </element>
  <simpleType name="Status">
    <restriction base="string">
        <enumeration value="manual"/>
        <enumeration value="approved"/>
        <enumeration value="rejected"/>
    </restriction>
  </simpleType>
 </schema>

5.4.2 注文承認アプリケーションの作成方法

Oracle Business Rulesで作業するには、最初にOracle JDeveloperでアプリケーションを作成します。

注文承認アプリケーションを作成する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で「新規アプリケーション」をクリックします。

  2. 「アプリケーションの名前付け」ダイアログで、新規アプリケーションの名前および場所を入力します。

    1. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、OrderApprovalAppと入力します。

    2. 「ディレクトリ」フィールドで、ディレクトリ名を指定するか、またはデフォルトを使用します。

    3. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞(com.example.orderなど)を入力します。

      この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。

    4. Oracle Business RulesでのSOAコンポジットの場合は、「アプリケーション・テンプレート」領域でアプリケーション・テンプレートとして「SOAアプリケーション」を選択します。図5-18に示す例を参照してください。

    5. 「次へ」をクリックします。

      図5-18 注文承認アプリケーションの追加

      図5-18の説明が続きます
      「図5-18 注文承認アプリケーションの追加」の説明

  3. 「プロジェクトの名前付け」ページで、プロジェクトの名前および場所を入力します。

    1. 「プロジェクト名」フィールドに名前を入力します。たとえば、OrderApprovalと入力します。

    2. ディレクトリ名を入力または参照するか、デフォルトを使用します。

    3. Oracle Business Rulesプロジェクトの場合は、図5-19に示すように、「プロジェクト・テクノロジ」タブの「選択済」領域に、「SOA」、「ADF Business Components」、「Java」および「XML」が表示されていることを確認します。 項目が欠落している場合は、その項目を「選択可能」ペインで選択し、「追加」ボタンを使用して「選択済」ペインに追加します。

      図5-19 アプリケーションへのプロジェクトの追加

      図5-19の説明が続きます
      「図5-19 アプリケーションへのプロジェクトの追加」の説明

  4. 「終了」をクリックします。

5.4.3 注文承認のビジネス・ルール・サービス・コンポーネントの作成方法

Oracle JDeveloperでプロジェクトを作成した後、プロジェクト内でビジネス・ルール・サービス・コンポーネントを作成する必要があります。 ビジネス・ルールを追加する際、入力変数および出力変数を作成して、サービス・コンポーネントに入力を提供し、サービス・コンポーネントから結果を取得できます。

ビジネス・ルールをOracle JDeveloperで使用する手順は、次のとおりです。

  • ビジネス・ルール・サービス・コンポーネントを追加します。

  • サービス・コンポーネントの入力変数および出力変数を作成します。

  • プロジェクト内でOracle Business Rulesディクショナリを作成します。

ビジネス・ルール・サービス・コンポーネントを作成する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で、「OrderApproval」プロジェクト内の「SOAコンテンツ」を開き、composite.xmlをダブルクリックしてSOAコンポジット・エディタを起動します(このエディタは、プロジェクトの作成後、すでに開いている場合もあります)。

  2. 「コンポーネント・パレット」で、「SOA」メニューの「サービス・コンポーネント」領域から「ビジネス・ルール」composite.xmlエディタの「コンポーネント」レーンにドラッグ・アンド・ドロップします。

    図5-20に示すように、Oracle JDeveloperで「ビジネス・ルールの作成」ページが表示されます。

    図5-20 「ビジネス・ルールの作成」ダイアログでのビジネス・ルール・ディクショナリの追加

    図5-20の説明が続きます
    「図5-20 「ビジネス・ルールの作成」ダイアログでのビジネス・ルール・ディクショナリの追加」の説明

  3. 入力を追加するには、「追加」アイコンの横にあるドロップダウン・リストから「入力」を選択し、ビジネス・ルールを入力します。

  4. 「タイプ・チューザ」ダイアログで、「スキーマ・ファイルのインポート」アイコンをクリックします。 図5-21に示すように、「スキーマ・ファイルのインポート」ダイアログが表示されます。

    図5-21 「スキーマ・ファイルのインポート」が表示されている「タイプ・チューザ」

    図5-21の説明が続きます
    「図5-21 「スキーマ・ファイルのインポート」が表示されている「タイプ・チューザ」」の説明

  5. 「スキーマのインポート」ダイアログで「リソースの参照」をクリックし、プロセスの入力変数のXMLスキーマ要素を選択します。「SOAリソース・ルックアップ」ダイアログが表示されます。

  6. 「SOAリソース・ルックアップ」ダイアログで、ナビゲートしてorder.xsdスキーマ・ファイルを検索し、「OK」をクリックします。

  7. 「スキーマ・ファイルのインポート」ダイアログで、図5-22に示すように、「プロジェクトにコピー」が選択されていることを確認します。

    図5-22 order.xsdスキーマ・ファイルのインポート

    図5-22の説明が続きます
    「図5-22 order.xsdスキーマ・ファイルのインポート」の説明

  8. 「スキーマ・ファイルのインポート」ダイアログで「OK」をクリックします。

  9. 「ファイルのローカライズ」ダイアログが表示される場合は、「OK」をクリックしてスキーマをコンポジット・プロセス・ディレクトリにコピーします。

  10. 「タイプ・チューザ」で、「プロジェクトのスキーマ・ファイル」フォルダにナビゲートして入力変数を選択します。

    この例では、入力変数として「CustomerOrder」を選択します。

  11. 「タイプ・チューザ」ウィンドウで「OK」をクリックします。図5-23に示すように、「ビジネス・ルールの作成」ダイアログが表示されます。

    図5-23 CustomerOrder入力が表示されている「ビジネス・ルールの作成」ダイアログ

    図5-23の説明が続きます
    「図5-23 CustomerOrder入力が表示されている「ビジネス・ルールの作成」ダイアログ」の説明

  12. 同様の方法で、インポートしたorder.xsdから出力ファクト・タイプOrderApprovalを追加します。

  13. 「ビジネス・ルールの作成」ダイアログで、図5-24に示すように、「コンポジット・サービスとして公開」を選択します。

    図5-24 入力とOrderApproval出力が表示されている「ビジネス・ルールの作成」ダイアログ

    図5-24の説明が続きます
    「図5-24 入力とOrderApproval出力が表示されている「ビジネス・ルールの作成」ダイアログ」の説明

  14. 「OK」をクリックします。ビジネス・ルール・コンポーネントが作成され、図5-25に示すようにOracle JDeveloperのキャンバス・ワークスペースにビジネス・ルールが表示されます。

    図5-25 OrderApprovalコンポジットのビジネス・ルール・コンポーネント

    図5-25の説明が続きます
    「図5-25 OrderApprovalコンポジットのビジネス・ルール・コンポーネント」の説明

ビジネス・ルール・サービス・コンポーネントを使用すると、SOAコンポジット・アプリケーションをビジネス・ルールと統合できます。これにより、ビジネス・ルール・ディクショナリが作成され、ビジネス・ルールを実行し、ルールに基づいてビジネス上の決定を下すことができます。

5.4.4 注文承認のデータ・モデル要素の表示方法

ルールを追加する前に、Oracle Business Rulesデータ・モデルを作成する必要があります。データ・モデルには、ビジネス・データの定義(タイプ)およびルールの作成に使用するファクトの定義が含まれています。たとえば、このサンプルのデータ・モデルには、ビジネス・ルール・アクティビティの入力および出力を定義する際に指定するorder.xsdからのXMLスキーマ要素が含まれています。

Rules Designerを使用してルールまたはデシジョン表を作成する際に、データ・モデルの要素の作成や変更が必要になる場合があります。

Oracleビジネス・ルールのデータ・モデル要素を表示する手順は、次のとおりです。

  1. 値がcomposite.xmlのコンポジット・タブを選択し、「コンポーネント」レーンでビジネス・ルールを選択します(これにより、コンポーネントOracleRules1が破線の選択ボックスで囲まれます)。

  2. 選択ボックスをダブルクリックしてRules Designerを起動します。

  3. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

  4. 図5-26に示すように、「ファクト」ナビゲーション・タブで「XMLファクト」タブを選択します。

    図5-26 Rules Designerでビジネス・ルール・ディクショナリを開く様子

    図5-26の説明が続きます
    「図5-26 Rules Designerでビジネス・ルール・ディクショナリを開く様子」の説明

5.4.5 注文承認のデータ・モデルへのバケット・セットの追加方法

デシジョン表を使用するには、デシジョン表を構成する条件の各セルについて、値の描画方法を指定するバケット・セットを定義する必要があります。 この例では、Rules Designerで定義する範囲のリストを使用して、バケット・セットを定義します。

OrderAmountバケット・セットをデータ・モデルに追加する手順は、次のとおりです。

  1. Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。

  2. 「バケットセットの作成」アイコンの横にあるドロップダウンから、「範囲リスト」を選択します。

  3. 「名前」フィールドにOrderAmountと入力します(Rules Designerで、[Enter]を押して名前を受け入れてください)。

  4. 「OrderAmount」バケット・セット・アイコンをダブルクリックして「バケットセットの編集」ダイアログを表示します。

  5. 「バケットの追加」をクリックしてバケットを追加します。

  6. 「バケットの追加」を再度クリックしてバケットをもう1つ追加します。

  7. 「範囲バケット値」領域で、最上位の「エンドポイント」フィールドに、エンドポイント値として1000を入力します。

  8. 「範囲バケット値」領域で、「エンドポイント」フィールドの中間バケットに、エンドポイント値として500を入力します。

  9. 図5-27に示すように、各バケットの「含まれるエンドポイント」フィールドでチェック・ボックスが選択されていることを確認します。

    図5-27 OrderAmountバケット・セットの追加

    図5-27の説明が続きます
    「図5-27 OrderAmountバケット・セットの追加」の説明

  10. 図5-28に示すように、それぞれの値の「エイリアス」フィールドを「高」、「標準」および「低」に変更します。

    図5-28 「高」、「標準」および「低」の別名を持つOrderAmountバケット・セットの追加

    図5-28の説明が続きます
    「図5-28 「高」、「標準」および「低」の別名を持つOrderAmountバケット・セットの追加」の説明

  11. 「OK」をクリックします。

CreditScoreバケット・セットをデータ・モデルに追加する手順は、次のとおりです。

  1. Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。

  2. 「バケットセットの作成」アイコンの横にあるドロップダウンから、「範囲リスト」を選択します。

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

  4. 「CreditScore」バケット・セット・アイコンをダブルクリックして「バケットセットの編集」ダイアログを表示します。

  5. 「バケットの追加」をクリックしてバケットを追加します。

  6. 「バケットの追加」を再度クリックしてバケットをもう1つ追加します。

  7. 最上位バケットについて、「エンドポイント」フィールドに750と入力します。

  8. 中間バケットについて、「エンドポイント」フィールドに400と入力します。

  9. 図5-29に示すように、各バケットの「含まれるエンドポイント」フィールドでチェック・ボックスが選択されていることを確認します。

    図5-29 CreditScoreバケット・セットの追加

    図5-29の説明が続きます
    「図5-29 CreditScoreバケット・セットの追加」の説明

  10. 図5-30に示すように、各エンドポイント値の「エイリアス」フィールドを、750は「solid」に、400は「avg」に、-Infinityは「risky」に変更します。

  11. 「OK」をクリックします。

図5-30 risky、avgおよびsolid別名を持つCreditScoreバケット・セットの追加

図5-30の説明が続きます
「図5-30 risky、avgおよびsolid別名を持つCreditScoreバケット・セットの追加」の説明

5.4.6 バケット・セットとOrderプロパティおよびCreditScoreプロパティを関連付ける方法

デシジョン表を作成する準備のため、バケット・セットをデータ・モデル内のファクト・プロパティに関連付けることができます。これにより、デシジョン表の作成時に、デシジョン表の「条件」領域にある条件セルでバケット・セットを使用できるようになります。

OrderApprovalファクト・タイプがXMLスキーマからインポートされた時点で、Statusバケット・セットにOrderApproval.statusプロパティが関連付けられていることに注意してください。 スキーマ内では、StatusStringタイプに制限されるため、列挙バケット・セットとして表されます。 Rules Designerにより、Statusバケット・セットが作成されます。 詳細は、第3.2.4項「XMLファクトに関する必須情報」を参照してください。

バケット・セットをOrderプロパティおよびCreditScoreプロパティに関連付ける手順は、次のとおりです。

  1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

  2. 図5-31に示すように、「ファクト」ナビゲーション・タブで「XMLファクト」タブを選択します。

    図5-31 Rules Designerでビジネス・ルール・ディクショナリを開く様子

    図5-31の説明が続きます
    「図5-31 Rules Designerでビジネス・ルール・ディクショナリを開く様子」の説明

  3. 変更するタイプを選択します。 たとえば、「XMLファクト」表で、「CustomerOrder」エントリの横のアイコンをダブルクリックします。「XMLファクトの編集 -」ダイアログが表示されます。

  4. 「XMLファクトの編集 -」ダイアログの「プロパティ」表の「バケットセット」列で、適切なプロパティのセルを選択し、使用するバケット・セットをドロップダウン・リストから選択します。 たとえば、図5-32に示すように、プロパティ「order」について「OrderAmount」バケット・セットを選択します。

    図5-32 OrderAmountバケット・セットとCustomerOrder.orderの関連付け

    図5-32の説明が続きます
    「図5-32 OrderAmountバケット・セットとCustomerOrder.orderの関連付け」の説明

  5. 同様の方法で、プロパティ「creditScore」について「CreditScore」バケット・セットを選択します。

  6. 「OK」をクリックします。

5.4.7 注文承認用デシジョン表の追加方法

デシジョン表を作成して、入力ファクトを処理して出力ファクトを生成するか、または暫定的な結論を生成します。暫定的な結論は、Oracle Business Rulesにより他のルールを使用するか別のデシジョン表内でさらに処理できます。

ルールを操作する際に、Rules Designerのルール検証機能を使用できます。 Rules Designerでは、ディクショナリに変更を加えたときに、ディクショナリ検証が実行されます。検証ログ・ウィンドウを表示するには、「検証」アイコンをクリックするか、または「表示」「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。 ルール検証ログを表示すると、警告メッセージが表示されます。これらの警告メッセージは、デシジョン表を作成すると削除されます。 ルール検証の詳細は、第4.4.2項「ルール検証」を参照してください。

このサンプル・アプリケーションでルールにデシジョン表を使用するには、特定の顧客および特定の注文に関して顧客の消費レベルおよび顧客の信用リスクを表すファクトを操作します。次に、デシジョン表を使用し、顧客の消費額、注文金額および顧客の信用リスクに基づくルールを作成します。

注文承認用のデシジョン表を追加する手順は、次のとおりです。

  1. Rules Designerで、「ルールセット」ナビゲーション・タブから「Ruleset_1」を選択します。

  2. 「追加」アイコンをクリックし、ドロップダウン・リストから「デシジョン表の作成」を選択します。

  3. デシジョン表で、「追加」アイコンをクリックし、ドロップダウン・リストから「条件」を選択します。

  4. デシジョン表で、「<条件の編集>」をダブルクリックします。 次に、ナビゲータで、「CustomerOrder」を開いて「creditScore」を選択します。 これにより、式CustomerOrder.creditScoreConditions列に入力されます。

  5. 再度、デシジョン表で、「追加」アイコンをクリックし、ドロップダウン・リストから「条件」を選択します。

  6. デシジョン表の「条件」領域で、「<条件の編集>」をダブルクリックします。 次に、ドロップダウン・ナビゲータで、「CustomerOrder」を開いて「order」を選択します。 これにより、式CustomerOrder.orderが入力されます。

  7. 再度、デシジョン表で、「追加」アイコンをクリックし、ドロップダウン・リストから「条件」を選択します。

  8. デシジョン表で、「<条件の編集>」をダブルクリックします。

  9. ドロップダウン・ナビゲータで、「CustomerOrder」を開いて「annualSpending」を選択します。 図5-33に示すように、テキスト入力領域で>2000を追加します。

    図5-33 デシジョン表への年間消費額エントリの追加

    図5-33の説明が続きます
    「図5-33 デシジョン表への年間消費額エントリの追加」の説明

  10. 図5-34に示すように、[Enter]を押して値を受け入れます。 ルール検証ログを表示すると、図5-34に示すように警告メッセージが表示されます。これらの警告メッセージは、後のステップでデシジョン表を変更すると削除されます。

    図5-34 CustomerOrderデシジョン表への条件の追加

    図5-34の説明が続きます
    「図5-34 CustomerOrderデシジョン表への条件の追加」の説明

デシジョン表にアクションを作成する手順は、次のとおりです。

  1. デシジョン表で、「追加」アイコンをクリックしてドロップダウン・リストから「アクション」「Assert New」を選択します。

  2. 「アクション」領域で、assert new(をクリックします。これにより、「アクション・エディタ」ダイアログが表示されます。

  3. 「アクション・エディタ」ダイアログの「ファクト」領域で「OrderApproval」を選択します。

  4. 「アクション・エディタ」ダイアログで、プロパティstatusの「プロパティ」表で「パラメータ化」チェック・ボックスおよび「定数」チェック・ボックスを選択します。これで、各ルールでステータスを個別に設定するように指定したことになります。

  5. 図5-35に示すように、「アクション・エディタ」ダイアログで「常に選択」チェック・ボックスを選択します。

    図5-35 「アクション・エディタ」ダイアログを使用してデシジョン表にアクションを追加する様子

    図5-35の説明が続きます
    「図5-35 「アクション・エディタ」ダイアログを使用してデシジョン表にアクションを追加する様子」の説明

  6. 「アクション・エディタ」ダイアログで「OK」をクリックします。

次に、デシジョン表にルールを追加し、ルールごとにアクションを指定する必要があります。

5.4.7.1 デシジョン表のセルの分割とアクションの追加

デシジョン表の分割操作を使用して、デシジョン表の条件行に関連付けられたバケット・セットに関するルールを作成できます。これにより、条件バケットの組合せごとにルールが1つ作成されます。 3つの注文金額バケット、3つの信用スコア・バケット、および年間消費額用の2つのブール・バケットがあり、ルールは合計3 x 3 x 2 = 18となります。

デシジョン表のセルを分割する手順は、次のとおりです。

  1. デシジョン表を選択します。

  2. デシジョン表で、「表の分割」アイコンをクリックし、ドロップダウン・リストから「表の分割」を選択します。 表の分割操作により、考慮されないセルが表から消去されます。 図5-36に示すように、表にはすべての範囲を対象とする18のルールが表示されています。

これらのステップでは、欠落している式があるアクション・セルに関する検証警告が生成されます。 これらの警告は後のステップで修正します。

図5-36 表分割操作を使用したデシジョン表の分割

図5-36の説明が続きます
「図5-36 表分割操作を使用したデシジョン表の分割」の説明

デシジョン表内のルールごとにアクションを追加する手順は、次のとおりです。

デシジョン表の「アクション」領域で、各アクション・セルのOrderApprovalに関連付けられているstatusプロパティの値を指定します。可能な選択肢は、「Status.MANUAL」、「Status.REJECTED」または「Status.ACCEPTED」です。このステップでは、18のルールそれぞれについて、statusの値を入力します。入力した値は、デシジョン表の各ルールを構成する条件に対応します。

  1. 図5-37に示すように、「アクション」領域で、操作するルールのアクション・セルをダブルクリックします。

    図5-37 デシジョン表へのアクション・セル値の追加

    図5-37の説明が続きます
    「図5-37 デシジョン表へのアクション・セル値の追加」の説明

  2. ドロップダウン・リストで、アクション・セルの値を選択して入力します。たとえば、「Status.MANUAL」を入力します。

  3. アクション・セルごとに、アプリケーションのロジックによって決定された適切な値を入力します。 この例では、表5-5に示す、デシジョン表のアクションの値がアプリケーションで使用されます。

  4. 「ファイル」メイン・メニューから「すべて保存」を選択し、作業内容を保存します。

表5-5 デシジョン表のアクションの値

ルール C1 creditScore C2 order C3 annualSpending > 2000 A1 OrderApproval status

R1

risky

true

Status.MANUAL

R2

risky

false

Status.MANUAL

R3

risky

標準

true

Status.MANUAL

R4

risky

標準

false

Status.REJECTED

R5

risky

true

Status.MANUAL

R6

risky

false

Status.REJECTED

R7

avg

true

Status.APPROVED

R8

avg

false

Status.MANUAL

R9

avg

標準

true

Status.APPROVED

R10

avg

標準

false

Status.MANUAL

R11

avg

true

Status.MANUAL

R12

avg

false

Status.MANUAL

R13

solid

true

Status.APPROVED

R14

solid

false

Status.APPROVED

R15

solid

標準

true

Status.APPROVED

R16

solid

標準

false

Status.APPROVED

R17

solid

true

Status.APPROVED

R18

solid

false

Status.MANUAL


5.4.7.2 デシジョン表の圧縮

この手順では、18のルールを9つのルールにマージして圧縮します。これにより、不要なルールが自動的に消去され、デシジョン表にギャップや競合するプロパティのない状態が保持されます。

デシジョン表を圧縮する手順は、次のとおりです。

  1. デシジョン表を選択します。

  2. すべての列を同じ幅にサイズ変更アイコンをクリックします。

  3. 「表の圧縮」アイコンをクリックし、ドロップダウン・リストから「表の圧縮」を選択します。表圧縮操作により、デシジョン表からルールが消去されます。 図5-38に示すように、デシジョン表には9つのルールが表示されるようになります。

図5-38 「表の圧縮」を使用したデシジョン表の圧縮

図5-38の説明が続きます
「図5-38 「表の圧縮」を使用したデシジョン表の圧縮」の説明

5.4.7.3 1つの一般ルールによる複数の限定的ルールの置換

残る9つのルールのうち5つでは、手動注文承認ステータスになることに注意してください。ルール数は、これら5つのルールを削除することで減らすことができます。 通常は、このことは行わない、つまり、複数の限定的ルールを1つの一般ルールで置き換えないことがベスト・プラクティスです。ルール数を減らす際には、少数のルールを使用するメリットおよびルール数の減少で生じる競合の管理に伴う複雑さを比較する必要があります。

複数の限定的ルールを1つの一般ルールで置き換える手順は、次のとおりです。

  1. デシジョン表を選択します。

  2. デシジョン表で、OrderApproval statusのアクションが「Status.MANUAL」に設定されているルールを選択します。ルールを選択するには、列ヘッダーをクリックします。 たとえば、図5-39に示すように、ルール「R2」をクリックします。

  3. 「削除」をクリックしてデシジョン表内のルールを削除します。 「デシジョン表」領域でデシジョン表内のルールを削除するために「削除」アイコンをクリックする際は、慎重に行ってください(「ルールセット」領域にも、デシジョン表全体を削除する「削除」アイコンがあります)。

    図5-39 デシジョン表からのルールの削除

    図5-39の説明が続きます
    「図5-39 デシジョン表からのルールの削除」の説明

  4. 前述の手順を繰り返し、アクションが「Status.MANUAL」に設定されているすべてのルールを削除します。 これにより、図5-40に示すように、デシジョン表には4つのルールが残ることになります。

    図5-40 手動アクションを削除した後のデシジョン表

    図5-40の説明が続きます
    「図5-40 手動アクションを削除した後のデシジョン表」の説明

5.4.7.4 一般ルールの追加

これで、手動の場合を処理する単一ルールを追加できます。 このルールを追加した後、「自動競合解決」を有効化します。

一般ルールを追加する手順は、次のとおりです。

  1. デシジョン表で、「追加」アイコンをクリックし、ドロップダウン・リストから「ルール」を選択します。

  2. 「条件」領域で、3つの条件についてルールのセルごとに「-」(考慮されない値)を残します。

  3. 「アクション」領域で、図5-41に示すように「Status.MANUAL」を入力します。 「ビジネス・ルール検証」ログに、解決されない競合に関する警告「RUL-05851」が表示されることに注意してください。

    図5-41 競合するルールを含むデシジョン表

    図5-41の説明が続きます
    「図5-41 競合するルールを含むデシジョン表」の説明

  4. 図5-42に示すように、競合解決の表示切替えアイコンをクリックして、競合するルールを表示します。

    図5-42 Status.MANUALを処理するルールの追加

    図5-42の説明が続きます
    「図5-42 Status.MANUALを処理するルールの追加」の説明

自動競合解決を有効化する手順は、次のとおりです。

  1. デシジョン表で、「詳細設定の表示」(デシジョン表名の横にあるアイコン)をクリックします。

  2. 「自動競合解決」を選択します。 手動の場合のルールを追加し、「自動競合解決」を選択すると、図5-43に示すように、競合が解決され、限定的な場合により一般的な場合がオーバーライドされることがわかります。

    図5-43 「自動競合解決」を設定してStatus.MANUALを処理するルールの追加

    図5-43の説明が続きます
    「図5-43 「自動競合解決」を設定してStatus.MANUALを処理するルールの追加」の説明

5.4.8 注文承認のビジネス・ルール検証ログのチェック方法

アプリケーションをデプロイする前に、ディクショナリが警告なしで検証されることを確認する必要があります。検証警告がある場合は、それに関連する問題を解決する必要があります。

ディクショナリを検証する手順は、次のとおりです。

  1. 「ビジネス・ルール検証」ログで、検証警告をチェックします。

  2. 検証警告がある場合は、適切なアクションを実行して問題を修正します。

5.4.9 注文承認アプリケーションのデプロイ方法

SOAアプリケーションで作成されたビジネス・ルールは、Oracle JDeveloperでデプロイメント・プロファイルを作成するときに、SOAコンポジットの一部としてデプロイされます。 SOAコンポジット・アプリケーションをOracle WebLogic Serverにデプロイします。

注文承認アプリケーションをデプロイして実行する手順は、次のとおりです。

  1. アプリケーション・サーバー・インスタンスを起動していない場合は、Oracle WebLogic Serverを起動します。

  2. 「アプリケーション・ナビゲータ」で、「OrderApproval」プロジェクトを右クリックし、「デプロイ」「SOAComposite1」「To」→「WLSサーバー名」を選択します。

    これにより、「SOAデプロイメントと構成ダイアログ」が表示されます。

  3. 「OK」をクリックします。

  4. 「認証リクエスト」ダイアログで、認証を入力します。

  5. 「OK」をクリックします。

5.4.10 注文承認アプリケーションのテスト方法

アプリケーションのデプロイ後、Oracle Enterprise Manager Fusion Middleware Controlコンソールを使用して、SOAコンポジット・アプリケーションでデシジョン表をテストできます。

アプリケーションをテストする手順は、次のとおりです。

  1. 図5-44に示すように、Fusion Middleware Controlコンソールでコンポジット・アプリケーションを開きます。

    図5-44 注文承認アプリケーションのテスト

    図5-44の説明が続きます
    「図5-44 注文承認アプリケーションのテスト」の説明

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

  3. 「引数を入力」領域で、「XML表示」を選択します。 このXMLを例5-2の内容に置き換えます。

    例5-2 注文承認アプリケーションのテスト用のサンプル入力

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body xmlns:ns1="http://xmlns.oracle.com/OracleRules1/OracleRules1_DecisionService_1">
                            <ns1:callFunctionStateful>
                                    <ns1:configURL></ns1:configURL>
    
                                    <ns1:parameterList xmlns:ns3="http://example.com/ns/customerorder">
                                                    <ns3:CustomerOrder>
                                                            <ns3:name>Gary</ns3:name>
                                                            <ns3:creditScore>600</ns3:creditScore>
                                                            <ns3:annualSpending>2001.0</ns3:annualSpending>
                                                            <ns3:value>High</ns3:value>
                                                            <ns3:order>100.0</ns3:order>
                    </ns3:CustomerOrder>
                </ns1:parameterList>
            </ns1:callFunctionStateful>
        </soap:Body>
    </soap:Envelope>
    
  4. 例5-2に示す入力値を、テスト用に必要な値に置き換えます。

  5. 「Webサービスのテスト」をクリックします。

  6. 「レスポンス」タブで、結果を表示します。 たとえば、この入力の場合は次のようになります。

    /OracleRules1_DecisionService_1" xmlns:ns2="http://xmlns.oracle.com/bpel">
                            <resultList>
                                    <OrderApproval:OrderApproval      xmlns:OrderApproval="http://example.com/ns/customerorder"
    xmlns="http://example.com/ns/customerorder">
                                                    <status>approved</status>
                                    </OrderApproval:OrderApproval>
                            </resultList>
                    </callFunctionStatefulDecision>