Oracle Business Rulesを使用すると、実行時の動的な意思決定が可能になり、ルールのロジックを基礎となるアプリケーション・コードから分離しながらポリシー、計算および判断を自動化できます。これにより、従来よりも機敏にルールをメンテナンスでき、ビジネス・アナリストはプログラマの支援やビジネス・プロセスの中断なしにルールのロジックを変更できるようになります。
このマニュアルでは、次の方法について説明します。
Oracle JDeveloperのOracle Business Rules Designer(Rules Designer)拡張機能を使用したOracle Business Rulesアーチファクトの作成
デシジョン・コンポーネントとしてのOracle SOA Suiteコンポジット・アプリケーションの一部であるOracle Business Rulesの使用
Oracle Business Rules SDKを使用したJava EEアプリケーションの一部であるOracle Business Rulesの使用
Oracle Business Rules SDK(Rules SDK)の使用
JSR-94 Java Rule Engine APIを使用したOracle Business Rules Rules Engineへのアクセス
この章の内容は次のとおりです。
詳細は、次のマニュアルを参照してください。
『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』
『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』
ビジネス・ルールとは、ビジネス・ポリシーを記述した文、または重要なビジネス・デシジョンを記述した文のことです。たとえば、ビジネス・ルールには次が含まれます。
消費ポリシーや承認マトリックスなどのビジネス・ポリシー
有効な構成や規制上の要件などの制約
割引や割増などの計算
顧客の額に基づくオファーなどの判断機能
たとえば、レンタカー会社であれば、次のようなビジネス・ルールを使用します。
航空会社であれば、次のようなビジネス・ルールを使用します。
金融機関であれば、次のようなビジネス・ルールを使用します。
これらの例は、それぞれ個別のビジネス・ルールを示しています。 実際には、Oracle Business Rulesを使用して、多数のビジネス・ルールを組み合せたり、さらに複雑なテストを使用できます。
たとえば、レンタカー会社の例では、ルールにDriver Age Ruleという名前を指定できます。 Driver Age Ruleなどのルールは、従来、アプリケーション・コードに組み込まれ、Javaアプリケーションでは、次のように表示されていました。
public boolean checkDriverAgeRule (Driver driver) { boolean declineRent = false; int age = driver.getAge(); if( age < 21 ) { declineRent = true; } return declineRent; }
技術的な知識のないユーザーが、このようなコードを読んで理解し、変更することは困難です。 たとえば、レンタカー会社がポリシーを変更し、Driver Age Ruleを使用して18歳未満のすべての運転者を拒否するとします。 多くの本番環境では、開発者がアプリケーションを変更し、変更したアプリケーションを再コンパイルして再デプロイする必要があります。Oracle Business Rulesを使用して作成したビジネス・ルール・アプリケーションでは、ビジネス・ルールが容易に変更できるようにサポートされるため、このプロセスが簡素化されます。
Oracle Business Rulesを使用すると、ビジネス・アナリストは、ほとんどプログラマの援助なしに、ビジネス・ルールで表現されたビジネス・ポリシーを変更できます。Oracle Business Rulesを使用するアプリケーションでは、新しい政府規制や、社内プロセスの改善、顧客およびサプライヤの関係の変化にアプリケーションが対応できるよう、継続的な変更がサポートされます。
ルールはIF-THEN構造に従い、次の各部分で構成されます。
IF部分: 条件またはパターン一致(第1.1.1項「ルール条件とは」を参照)
THEN部分: アクションのリスト(第1.1.2項「ルール・アクションとは」を参照)
または、デシジョン表と呼ばれるスプレッドシートに似た形式でルールを表現することもできます(第1.1.3項「デシジョン表とは」を参照)。
ルールおよびデシジョン表は、ファクト・タイプおよびプロパティに関して記述します。 ファクト・タイプは、Javaクラス、XMLスキーマ、Oracle ADF Business Componentsビュー・オブジェクトからインポートされることもあれば、Rules Designerで作成されることもあります。ファクト・プロパティには、名前、値、データ型およびオプションのバケット・セットがあります。 バケット・セットにより、データ型の値空間がデシジョン表、選択リストおよびデザインタイム検証に使用できるバケットに分割されます(第1.1.4項「ファクトおよびバケット・セットとは」を参照)。
ルールおよびデシジョン表を、ルールセットと呼ばれるOracle Business Rulesオブジェクトにグループ化します(第1.1.5項「ルールセットとは」を参照)。
1つ以上のルールセット、そのファクトおよびバケット・セットを、ディクショナリと呼ばれるOracle Business Rulesオブジェクトにグループ化します(第1.1.8項「ディクショナリとは」を参照)。
詳細は、第1.2項「Oracle Business Rulesのランタイム要素とデザインタイム要素」を参照してください。
ルールのIF部分は、ファクトを参照する条件式およびルール条件で構成されています。次に例を示します。
IF Rental_application.driver age < 21
条件式では、より小さい比較を使用してビジネス条件(Rental_application.driver age)が数値21と比較されます。
ルール条件は、ファクトの組合せで条件式がtrueになると、該当するルールをアクティブ化します。 いくつかの点で、ルール条件は、Rules Engine内の使用可能なファクトへの問合せに似ています。問合せで戻された各行に対して、ルールがアクティブ化されます。
詳細は、次を参照してください。
ルールのTHEN部分には、ルールの起動時に実行されるアクションが含まれています。ルールはアクティブ化され、優先度など競合解決メカニズムを使用して他のルールのアクティブ化の中から選択された後、起動されます。ルールは、いくつかの種類のアクションを実行します。 あるアクションではファクトを追加、変更、削除できます。 また、あるアクションではJavaメソッドを実行したり、関数を実行してファクトのステータスを変更したり、ファクトを作成できます。
ルールは、同時ではなく順番に起動します。ルール・アクションによってルールのアクティブ化設定が変更され、次に起動するルールが変更される場合があることに注意してください。
詳細は、次を参照してください。
デシジョン表は、多数のプロパティ値の組合せ分析に多数のルールが必要な場合の、よりコンパクトで直感的な代替ビジネス・ルール形式です。 デシジョン表を使用すると、すべての組合せをカバーし、また競合する組合せが2つとしてない、一連のルールを作成できます。
詳細は、第5章「デシジョン表の使用」を参照してください。
Oracle Business Rulesでは、ファクトはルールの判断対象となるオブジェクトです。各ファクトはファクト・タイプのインスタンスです。ルールを作成する前に、ファクト・タイプを1つ以上インポートまたは作成する必要があります。
Oracle Business Rulesの場合、ファクトはクラスのアサートされたインスタンスです。 Oracle Business Rulesランタイム、またはRL Languageを記述する開発者は、RL Languageのassert
関数を使用してファクトのインスタンスをOracle Business Rules Engineに追加します。
Rules Designerでは、XMLスキーマ、Javaクラス、Oracle RL定義、ADF Business Componentsビュー・オブジェクトに基づいて、様々なファクト・タイプを定義できます。 Oracle Business Rulesランタイムでは、これらのファクト・タイプ・インスタンスはファクトと呼ばれます。
バケット・セットを作成し、指定したタイプの値リストまたは値範囲を定義できます。作成したバケット・セットは、一致するタイプのファクト・プロパティに関連付けることができます。Oracle Business Rulesでは、定義したバケット・セットを使用して、ルールまたはデシジョン表内のファクト・プロパティに関連した値に対する制約が指定されます。 また、バケット・セットを使用して、変数の初期値、関数の戻り値、および関数の引数の値に対して制約を指定することもできます。
詳細は、次を参照してください。
ルールセットは、ルールおよびデシジョン表に使用されるOracle Business Rulesコンテナです。 ルールセットは、ルールおよびデシジョン表に対してJavaパッケージに似たネームスペースを提供します。 またルールセットを使用して、ルールの起動を部分的に順序付けることも可能です。
詳細は、次を参照してください。
デシジョン関数は、Javaまたは(SOAコンポジット・アプリケーションまたはBPELプロセスからの)SOAからルールを起動するための規定を提供します。規定には、入力ファクト・タイプ、実行するルールセットおよび出力ファクト・タイプが含まれます。詳細は、第6章「デシジョン関数の使用」を参照してください。
Oracle Business Rules SDK(Rules SDK)には、アプリケーションの記述に使用できるAPIが用意されています。このアプリケーションには、Oracle Business Rulesディクショナリ(およびディクショナリのすべての内容)に含まれるルールへのアクセス、作成または変更に使用します。 Rules SDKには、Javaアプリケーションからルールまたはデシジョン表にアクセスしたり実行するためのデシジョン・ポイントAPIが備えられています。詳細は、第7章「Rules SDKデシジョン・ポイントAPIの使用」を参照してください。
ディクショナリは、ファクト、関数、グローバル、バケット・セット、リンク、デシジョン関数およびルールセットに使用するOracle Business Rulesコンテナです。また、アプリケーションのルールセットおよびデータ・モデルが格納されているXMLファイルです。ディクショナリは他のディクショナリにリンクできます。 Oracle JDeveloperでは、Oracle Business Rulesディクショナリが.rules
ファイルで作成されます。必要な数のディクショナリを作成できます。1つのディクショナリに多数のルールセットを含めることができます。詳細は、第2.2項「ディクショナリとディクショナリ・リンクの使用」を参照してください。
Oracle Business Rulesでは、ビジネス・ルールをデシジョン・コンポーネントとして、またはJavaアプリケーションのライブラリとして使用するためのサポート機能が用意されています。デシジョン・コンポーネントは、ルールおよびルールセットを、複数のビジネス・プロセスから起動できる再利用可能なサービスとして公開するメカニズムです。 Oracle SOA Suiteでルールを作成して使用したり、ルールを作成してアプリケーションに統合できるように、Oracle Business Rulesには次のランタイム要素およびデザインタイム要素が用意されています。
Oracle SOA Suiteには、Oracle Business Rulesをサポートするデシジョン・コンポーネントのためのサポート機能が用意されています。デシジョン・コンポーネントは、ルールおよびルールセットを、複数のビジネス・プロセスから起動できる再利用可能なサービスとして公開するメカニズムです。
デシジョン・コンポーネントは、コンポジット内で使用でき、かつBPELコンポーネントに接続できるSCAコンポーネントです。 さらに、デシジョン・コンポーネントは、ヒューマン・ワークフローにおけるMediator and Advanced Routing Rulesの動的ルーティング機能にも使用されます。
Oracle Business Rules Rules Engine(Rules Engine)は、ルールをファクトに効率的に適用してルールを定義および処理するSOAビジネス・ルール・サービス・エンジンを使用したSOAコンポジット・アプリケーションのサービス・エンジン・コンポーネントで使用可能です。
Rules Engineには、次の機能があります。
高いパフォーマンス: Rules Engineは、システムで定義されたファクトに対し、特化された一致アルゴリズムを実装しています。
パラレル処理アーキテクチャに適したスレッドセーフ実行: Rules Engineでは、あるスレッドがネットワークを評価している間も、別のスレッドでファクトをアサートできます。
詳細は、第1.3項「Oracle Business Rules Engineのアーキテクチャ」を参照してください。
Oracle Business Rules Rules Engine(Rules Engine)は、Java EEアプリケーション(非SOA)用のライブラリとして使用可能です。 Rules Engineにより、ルールがファクトに効率的に適用され、ルールが処理されます。Rules Engineは、Oracle Business Rules RL Language(RL Language)と呼ばれるJavaに似た本番ルール言語を定義し、言語処理エンジン(推論エンジン)を提供し、デバッグのサポート・ツールを提供します。
Oracle JDeveloperのRules Designerでは、アプリケーション・コードとは別にビジネス・ルールを指定できます。ビジネス・ルールをアプリケーション・コードから分離することで、ビジネス・アナリストはグラフィカル・ツールを使用してビジネス・ポリシーをすばやく変更できます。 Rules Engineでは、ビジネス・ルールが評価されてデシジョンまたはファクトが返され、それらがビジネス・プロセスで使用されます。
Rules Engineには、次の機能があります。
高いパフォーマンス: Rules Engineは、システムで定義されたファクトに対し、特化された一致アルゴリズムを実装しています。
パラレル処理アーキテクチャに適したスレッドセーフ実行: Rules Engineでは、あるスレッドがネットワークを評価している間も、別のスレッドでファクトをアサートできます。
ルール対応Javaアプリケーションでは、ルール・プログラムをロードして実行できます。ルール対応アプリケーションは、ファクト(JavaオブジェクトまたはXML文書の形式でアサートされたもの)およびルールをRules Engineに渡します。ルール対応Javaアプリケーションで実行されるRules Engineは、Reteアルゴリズムを使用して、ファクトに適したルールを効率的に起動します。
詳細は、第1.3項「Oracle Business Rules Engineのアーキテクチャ」および第1.2.4項「Oracle Business Rules SDK」を参照してください。
Oracle Business Rulesは、Oracle Business Rules RL Language(RL Language)と呼ばれるJavaに似た高レベルな言語をサポートしています。RL Languageは、Oracle Business Rulesプログラムに有効な構文を定義します。RL Languageには、Javaセマンティクスの能力をサポートするルールを定義するための、Javaに似た直感的な構文が含まれており、使いやすい構文をアプリケーション開発者に提供します。RL Languageは、動的に生成したり、ファイルに格納できるテキスト文のコレクションで構成されています。
RL Languageを使用すると、アプリケーション・プログラムではJavaオブジェクトをファクトとしてアサートでき、ルールではオブジェクト・プロパティを参照してメソッドを起動できます。同様に、アプリケーション・プログラムではXML文書またはXML文書の一部をファクトとして使用できます。
プログラマは、すべての機能を備えたルール・プログラミング言語として、RL Languageを直接およびOracle Business Rules SDK(Rules SDK)の一部として使用できます。
ビジネス・アナリストは、Rules Designerを使用してルールを操作できます。この場合、ビジネス・アナリストは、RL Languageプログラムを直接表示または記述する必要はありません。詳細は、第1.2.5項「Rules Designer」を参照してください。
RL Languageの詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。
Oracle Business Rules SDK(Rules SDK)は、ビジネス・ルール管理機能を提供するJavaライブラリです。開発者はビジネス・ルール管理機能を使用して、ディクショナリにアクセスするルール対応プログラムを記述したり、ルールの追加または既存ルールの変更を行うカスタマイズしたルール・プログラムを記述できます。Rules Designerでは、Rules SDKを使用し、適切に定義されたインタフェースを介して、ルールとデータ・モデルを作成および変更し、ルールとデータ・モデルにアクセスします。 カスタム・アプリケーションでは、Rules SDKを使用して、ルールとデータ・モデルのコレクションにアクセスしたり表示、作成および変更できます。
Rules SDK APIをルール対応アプリケーションで使用して、ルールにアクセスしたり、ルールを作成および変更できます。ルールおよび関連するデータ・モデルは最初、カスタム・アプリケーションで作成されるか、またはRules Designerを使用して作成されます。
このマニュアルでは、Oracle Business Rules SDKデシジョン・ポイントAPIについて説明します。 デシジョン・ポイントを使用すると、ディクショナリにアクセスし、ディクショナリ内のルールを実行できます。 Oracle Business Rules SDK APIの詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。
詳細は、第7章「Rules SDKデシジョン・ポイントAPIの使用」を参照してください。
図1-1のように、JDeveloperのOracle Business Rules Designer(Rules Designer)拡張機能は、ルールを作成および編集できるエディタです。
Rules Designerは、ルールの作成および既存ルールの編集用にpoint-and-clickインタフェースを提供します。 Rules Designerを使用すると、ビジネス・ルールおよびデータ・モデルを直接操作できます。 Rules Designerで作業するためにRL Languageを理解する必要はありません。Rules Designerには、ビジネス・ルールを簡単に作成、表示および変更するための方法が用意されています。
Rules Designerは、アプリケーション開発者やビジネス・アナリストなど、様々なタイプのユーザーをサポートしています。アプリケーション開発者は、Rules Designerを使用して、データ・モデルおよびルールの初期セットを定義します。 ビジネス・アナリストは、Rules Designerを使用して、ルールの初期セットを操作したり、ビジネス・ニーズに従ってルールの初期セットを変更およびカスタマイズします。Rules Designerを使用すると、ビジネス・アナリストは、ほとんどプログラマの援助なしに、ルールを作成およびカスタマイズできます。
Reteアルゴリズムを使用したルールベース・システムは、Oracle Business Rulesの基盤です。ルールベース・システムは、次の要素で構成されています。
ルールベース: 適切なビジネス・ポリシーや、その他のIF/THENルールおよびデシジョン表にエンコードされたナレッジ。
作業メモリー: システムに追加された情報。Oracle Business Rulesでは、アサート・コールを使用してシステムに一連のファクトを追加します。
推論エンジン: ルールを処理するRules Engine。一連のファクトを対象とした特定の実行において、ファクトに適合するルールを、パターン一致を実行して判断します。
Oracle Business Rulesでは、ルールベース・システムはデータドリブンの前向き連鎖システムです。起動するルールはファクトによって決定されます。 一連のファクトに一致するルールが起動すると、そのルールによってファクトが追加される場合があります。 これらのファクトは再びルールに対して実行されます。このプロセスは、結論に達するか、このサイクルが停止またはリセットされるまで繰り返し実行されます。 このように、前向き連鎖のルールベース・システムでは、ファクトによってルールが起動し、ルールの起動によって新たなファクトが作成され、そのファクトによってさらに別のルールが起動します。このようなプロセスを、推論サイクルと呼びます。
Oracle Business Rulesでは、宣言ルールを使用できます。この場合、コーディングではなくファクトに基づいて宣言を行うルールを作成します。宣言ルールの例を次に示します。
IF a Customer is a Premium customer, offer them 10% discount IF a Customer is a Gold customer, offer them 5% discount
宣言ルール
文は制御フローなしで宣言されます。
制御フローはRules Engineによって決定されます。
ルールはプロシージャ・コードよりも保守が容易です。
ルールはビジネス・ユーザーの作業方法に適切に関連付けられています。
ルールによってファクトが追加され、これらのファクトがルールに対して実行される場合、このようなプロセスを推論サイクルと呼びます。 推論サイクルでは、初期ファクトによってルールが起動し、ルールの起動によって新たなファクトが作成され、そのファクトによってさらに別のルールが起動する場合があります。 たとえば、初期ファクトを使用してRules Engineで他のファクトの実行および追加が行われ、他のファクトによって、推論サイクルを作成するこのファクトの条件がテストされます。
IF a Customer is a Premium customer, offer them 10% discount IF a Customer is a Gold customer, offer them 5% discount IF a Customer spends > 1000, make them Premium customer
Oracle Business Rulesで提供される推論サイクルを使用すると、強力でモジュール形式の宣言アサーションが可能になります。
Reteアルゴリズムは、人工知能の研究者によって1970年代後期に最初に開発され、現在では、様々なベンダーが提供するRules Engineの核となっています。Oracle Business Rulesでは、ルールとファクトのパターン一致プロセスを最適化するため、このReteアルゴリズムを使用しています。 Reteアルゴリズムは、部分一致の結果を、作業メモリーにあるノードの単一ネットワークに格納します。
Reteアルゴリズムを使用すると、Rules Engineではファクトの削除、追加または変更時に不要な再確認を回避できます。ファクトとルールを処理するために、Reteアルゴリズムは、各ファクト定義に入力ノードを、各ルールに出力ノードを作成し、使用します。
ファクト参照は、入力ノードから出力ノードまでのフローです。入力ノードと出力ノード間にはテスト・ノードと結合ノードがあります。テストは、ルール条件にブール式がある場合に発生します。結合は、ルール条件ANDによって2つのファクトが結合される場合に発生します。ルールがアクティブ化されるのは、その出力ノードにファクト参照が含まれている場合です。ファクト参照は、アクティブ化されたルールの再計算を速めるために、ネットワーク全体にキャッシュされます。ファクトが追加、削除または変更されると、Reteネットワークは、キャッシュとルールのアクティブ化を更新します。これに必要なのは、作業の増分のみです。
Reteアルゴリズムの利点は、次のとおりです。
ルール順序からの独立: 他のルールに影響を与えずに、ルールを追加および削除できます。
複数ルール間での最適化: 共通の条件を使用する各ルールは、Reteネットワーク内でノードを共有します。
高いパフォーマンスの推論サイクル: 通常、各ルールの起動によって変更されるのは少数のファクトのみで、Reteネットワークの更新コストは、ファクトまたはルールの総数ではなく、変更されたファクトの数に比例します。
Oracle Business Rulesでは、ファクトの格納に作業メモリーを使用します(作業メモリー外部には、ファクトは存在しません)。Oracle Business Rulesの作業メモリーはRuleSessionに格納されます。
ルール・セッションは、ルール、ファクトおよびアジェンダで構成されます。アサートまたは取消しによって、作業メモリーからファクト・インスタンスが追加または削除されます。
作業メモリー内のファクトに変更があると、次のようになります。
ルールの条件が評価されます。
一致するルールがアジェンダに追加されます(アクティブ化)。
一致しなくなったルールはアジェンダから削除されます。
アクティブ化されたルールについて、Rules Engineによってアクションが実行(起動)されます。
図1-2に、Oracle Business Rulesランタイムのこの部分を示します。
ルール・アクションでは、ファクトをアサートまたは変更してアクティブ化をアジェンダに追加するか、ファクトを取り消してアクティブ化をアジェンダから削除できます。 ルールのアクションが原因で再度起動されると、ループが発生する可能性があります。 ルールは順番に起動しますが、事前に定義された順序ではありません。ルール・セッションには、ルールセットのスタックが含まれています。アクティブ化されたルールは、次のように起動されます。
スタック最上部にあるルールセット内のルールが起動されます。
ルールセット内では、ユーザー定義の優先度に従って起動が順序付けされます。
同じ優先度の場合、最も最近にアクティブ化されたルールが最初に起動されます。
起動されるのはスタック上にあるルールセット内のルールのみですが、ルール・セッション内のルールがすべて照合され、一致した場合はアクティブ化されます。