2 データ・モデル要素の使用
Oracle Business Rulesデータ・モデル要素は、ファクト・タイプ、関数、グローバル、値セット、デシジョン関数、ディクショナリ・リンクで構成されています。
2.1 データ・モデル要素の使用の概要
Oracle Business Rulesアプリケーションのデータ・モデル部分を実装するには、ディクショナリを作成し、データ・モデル要素を追加します。ディクショナリを完成するには、これらのデータ・モデル要素を使用するか、要素に依存するルールを含むルールセットを1つ以上作成します。
詳細は、次を参照してください。
2.2 ディクショナリとディクショナリ・リンクの概要
ディクショナリは、ファクト、関数、グローバル、値セット、リンク、デシジョン関数およびルールセットに使用するOracle Business Rulesコンテナです。また、アプリケーションのルールセットおよびデータ・モデルが格納されているXMLファイルです。ディクショナリは他のディクショナリにリンクできます。
必要な数のディクショナリを作成できます。ディクショナリには任意の数のルールセットとデータ・モデル要素を含めることができます。1つのデータ・モデルを1つ以上のディクショナリに格納できます。ルールセットで参照されるデータ・モデル要素はすべて、直接的に、またはリンクを通してディクショナリ内で使用可能である必要があります。
ディクショナリは、*.rules
ファイルに格納されます。
2.2.1 ディクショナリとディクショナリ・リンクの使用
ディクショナリを作成する場合は、Javaクラスと同じように、名前とパッケージを指定します。データ・モデル要素とルールセットをこのディクショナリの内側に作成できます。また、ディクショナリ・リンクを作成して、ターゲット・ディクショナリの名前とパッケージを指定することで、別のディクショナリのデータ・モデルとルールセットを参照することもできます。各ディクショナリには論理的な組込みディクショナリが格納されています。このディクショナリには、すべてのOracle Business Rulesアプリケーションが必要とする標準の関数とタイプが含まれています。組込みディクショナリは変更できません。
メイン・ディクショナリに加えて、PurchaseItems.rules
などの、アプリケーション固有のディクショナリを1つ以上作成できます。これらのディクショナリのプロパティは変更できます。
ディクショナリとそのリンク先のディクショナリによって定義された完全なデータ・モデルは、結合データ・モデルと呼ばれています。同じディクショナリに対して複数のリンクを作成できます。この場合、最初のリンク以外はすべて無視されます。
詳細は、「ディクショナリ・リンクに関する必知事項」を参照してください。
2.2.2 ルール・デザイナを使用してSOA層にディクショナリを作成する方法
Oracle JDeveloperでは、複数の方法でOracle Business Rulesのディクショナリを作成できます。SOAアプリケーションで使用するディクショナリを作成できます。この項では、SOAプロジェクトでディクショナリを作成する1つの方法を示します。
典型的なSOAコンポジットのデザイン・パターンでは、各アプリケーションに専用ディクショナリが用意されます。各アプリケーションは自己完結になり、個別にデプロイできるようになります。
場合によっては、複数のアプリケーションが、1つの共通データ・モデルの共通部分にアクセスすることが必要になります。このような場合、ディクショナリ・リンクを使用して、ソース・アプリケーション内にターゲット・アプリケーションのディクショナリを含めます。ソース・アプリケーションはターゲット・アプリケーションのディクショナリをコピーして、ソースにリンクされているコピーの内容を保持します。リンクされた要素を使用する場合、それらはローカル・コンテンツとして表示されます。
SOAアプリケーションの外部で、ビジネス層に使用するディクショナリを作成することもできます。詳細は、「Gradesプロジェクト内でのOracle Business Rulesディクショナリの作成方法」を参照してください。
ルール・デザイナを使用してSOA層にディクショナリを作成するには:
-
アプリケーション・ナビゲータで、SOAアプリケーションを選択し、SOAプロジェクトを選択または作成します。
-
下矢印をクリックし、リストから「新規」、「ギャラリから」を選択します。
-
図2-1に示すように、「新規ギャラリ」ダイアログで「SOA層」を開きます。
-
「新規ギャラリ」ウィンドウで、「ビジネス・ルール」を選択します。
-
「OK」をクリックします。「ビジネス・ルールの作成」ダイアログが表示されます。
-
図2-2に示すように、「ビジネス・ルールの作成」ダイアログで次のフィールドに入力します。
-
「名前」フィールドにディクショナリ名を入力します。たとえば、
PurchaseItems
と入力します。 -
「パッケージ」フィールドに、ディクショナリが属するJavaパッケージを入力します。たとえば、
com.example
と入力します。
-
-
入力および出力を指定するには:
-
「追加」ボタンをクリックし、入力を作成するには「入力」を、出力を作成するには「出力」を選択します。
-
「タイプ・チューザ」ダイアログで、適切なXSDを開いて適切なタイプを選択します。
-
「OK」をクリックして「タイプ・チューザ」ダイアログを閉じます。
入力および出力を後で追加したり、削除できます。詳細は、デシジョン関数の使用を参照してください。
-
-
「ビジネス・ルールの作成」ダイアログで「OK」をクリックして、デシジョン・コンポーネントおよびOracle Business Rulesディクショナリを作成します。
図2-3
に示すように、Oracle JDeveloperによって、拡張子.rulesが付いたディクショナリがファイル内に作成され、ルール・デザイナが起動します。スクリーン・ショットには、BPMがインストールされていないとSOAでアクセスできない場合がある一部のBPM機能が表示されていることに注意してください。 -
Oracle JDeveloperによって、composite.xml内にデシジョン・コンポーネントも作成されます。このコンポーネントを表示するには、
composite.xml
ファイルをダブルクリックします。
2.2.3 ルール・デザイナを使用してビジネス層にディクショナリを作成する方法
ルール・デザイナを使用して、SOAアプリケーションの外部で、ビジネス層に使用するディクショナリを作成できます。SOAなしでOracle Business Rulesを使用する方法については、「ルール対応の非SOA Java EEアプリケーションの作成」を参照してください。
2.2.4 ディクショナリ設定の表示および編集方法
「設定」タブを使用して、ディクショナリ設定を表示および編集できます。「設定」タブには、「一般」、「プリファレンス」および「データ・モデル」 の3つのタブがあります。「プリファレンス」タブを使用して、実行アルゴリズムを選択し、動詞ルールを使用しているときに表示されるフレーズ提案を指定します。「データ・モデル」タブは、グローバル修飾子パターンの指定および動詞ルールに使用されます。パターンには、{member}, {fact}の2つのフラグメントを含める必要があります。たとえば、{fact}の{member}のようにします。
2.2.5 ディクショナリにリンクする方法
ルール・デザイナの「リンク」ナビゲーション・タブを使用して、同じアプリケーションのディクショナリにリンクできます。別のディクショナリにリンクするには、他のディクショナリが1つ以上使用可能である必要があります。
リソース・ピッカーを使用してディクショナリにリンクするには:
ADFビジネス・コンポーネントのファクトを使用する場合は、デシジョン・ポイント・ディクショナリへのリンクを作成する必要があります。詳細は、Oracle Business RulesとADFビジネス・コンポーネントの使用を参照してください。
デシジョン・ポイント・ディクショナリを追加するには、ルール・デザイナで「リンク」ナビゲーション・タブをクリックします。「リンク」領域で、「作成」をクリックし、リストから「デシジョン・ポイント・ディクショナリ」を選択します。この操作には少し時間がかかります。デシジョン・ポイント・ディクショナリがロードされるまで待機する必要があります。
2.2.6 リンク先ディレクトリの更新方法
別のディクショナリ(たとえば、Shared_rules)にリンクしているディクショナリ(たとえば、Project_rules1)がある場合、どちらのディクショナリも変更されていることを確認する必要があります。たとえば、Shared_rulesディクショナリを変更した場合、Project_rules1でのこの変更を表示するには、Project_rules1ディクショナリを更新するか、ルール・デザイナを閉じて、再度開きます。リンクを定義しているディクショナリからリンク先ディクショナリ内の変更のみを表示でき、その逆は表示できないことに注意してください。
リンク先ディクショナリを更新するには:
- これらのサンプル・ディクショナリ名を使用し、「保存」ボタンをクリックしてShared_rulesディクショナリを保存します。
- Project_rules1ディクショナリを選択します。
- 「リンク」ナビゲーション・タブを選択します。
- 「ディクショナリ・キャッシュ」ボタンをクリックします。
- 「ディクショナリ・ファインダ・キャッシュ」ダイアログで、適切なリンク先ディクショナリを選択します。
- 「クリア」ボタンをクリックします。
- 「ディクショナリ・ファインダ・キャッシュ」ダイアログで、「閉じる」をクリックします。
- 「検証」ボタンをクリックします。
2.2.7 ディクショナリ・リンクに関する必知事項
他のディクショナリへのリンクを含むディクショナリを使用すると、次の場合に役立ちます。
-
データモデルの共有。プロジェクト内のデータ・モデル部分を共有します。別のプロジェクトのディクショナリにリンクすると、それがローカル・プロジェクトにコピーされます。
たとえば、Oracle Business Rules関数をいくつか共有したいプロジェクトについて考えてみます。その関数を格納するディクショナリを作成し、
DictCommon
という名前を付けることができます。次に、DictApp1
およびDictApp2
という2つのディクショナリを作成し、両方ともDictCommon
にリンクします。これで両方とも同じOracle Business Rules関数を使用できます。いずれかの関数を変更する場合は、DictCommon
内のバージョンを変更するだけです。これで、次にDictApp1
またはDictApp2
からRL Languageを生成するときには、どちらのディクショナリも更新後の関数を使用します。
Oracle Business Rulesでは、完全修飾されたディクショナリ名はDictionaryFQNと呼ばれ、次の2つの要素で構成されています。
-
ディクショナリ・パッケージ: パッケージ名
-
ディクショナリ名: ディクショナリ名
ディクショナリは、DictionaryFQNおよび別名を使用してリンク先ディクショナリを参照します。Oracle Business Rulesでは、DictionaryFQNを使用してリンク先ディクショナリが検索されます。
結合ディクショナリに関する次のネーミング制約は次のとおりです。
-
パッケージとディクショナリ名を含む個別の完全ディクショナリ名を使用する必要があります。また、ディクショナリ別名も個別にする必要があります。
-
たとえば、関数、Oracle RLクラス、値セットなど、特定の種類のデータ・モデル定義の別名は、ディクショナリ内で一意である必要があります。
-
直接含んでいるディクショナリの別名で定義を修飾できます。最上位および組込みディクショナリ内の定義を修飾する必要はありません。別のディクショナリ内の定義は修飾する必要があり、この修飾はディクショナリ・リンクの「接頭辞リンク名」プロパティによって制御されます。
-
ルールセット名はディクショナリ内で一意にする必要があります。ルールセットのRL Languageを生成する場合、ディクショナリの別名は生成名の一部にはなりません。たとえば、dict1という名前のディクショナリをdict2にリンクして結合ディクショナリを作成し、dict1にはrule_1を含むruleset_1を格納して、dict2にもrule_2を含むruleset_1を格納した場合、結合ディクショナリでは、2つのルール、rule_1とrule_2の両方が、同じルールセット(ruleset_1)内に存在することになります。
-
すべてのルールおよびデシジョン表には、ルールセット内で一意の名前が必要です。
たとえば、ディクショナリd1とディクショナリd2を含む結合ディクショナリ内で、ディクショナリd1にルールrule_1を含むルールセット
Ruleset_1
があるとします。ディクショナリd2にもrule_2を含むルールセットRuleset_1
がある場合、Oracle Business Rulesによってリンク済結合ディクショナリからRL Languageが生成されると、両方のルールrule_1およびrule_2が単一のルールセットRuleset_1
に含まれます。この命名規則に違反し、結合ディクショナリ内の単一ルールセットのルールに個別の名前を使用しなかった場合は、ルール・デザイナによって、次のような検証警告が表示されます。RUL-05920: Rule Set Ruleset_1 has two Rules with name rule_1
詳細は、「Oracle Business Rulesのファイルと制限事項」を参照してください。
2.2.8 ディクショナリ・リンクおよびディクショナリ・コピーに関する必知事項
リソース・ピッカーを使用してディクショナリ・リンクを作成すると、ディクショナリはソース・プロジェクト(リンク元のディクショナリが常駐しているプロジェクト)にコピーされます。つまり、このタイプのリンクでは、ディクショナリのローカル・コピーがプロジェクトに作成されます。これは、ターゲット・ディクショナリの場所に関係なく、元のターゲットへのリンクではありません。つまり、リソース・ピッカーを使用してリンクを作成した場合、ルール・デザイナではリンクにコピー操作が使用されます。
SOAおよび非SOAルール・ディクショナリ内のりリンク先ディクショナリについて、次のことに注意してください。
-
SOAアプリケーション
-
同じプロジェクト内のディクショナリ、soa/sharedにシードされているシステム・ディクショナリ、またはクラスパスで使用可能になっているディクショナリのみをリンク先ディクショナリとして使用できます。
-
複数のコンポジット内のルールにわたって同じリンク先ディクショナリを使用する必要がある場合は、そのリンク先ディクショナリをクラスパスで参照する必要があります。
-
-
Non_SOAアプリケーション
-
リンク先ディクショナリは同じアプリケーション内、MDS内の共有場所またはクラスパス内に配置できます。それらのディクショナリを見つけ、解決するには、適切なディクショナリ・ファインダを用意する必要があります。
-
2.2.9 デプロイされたディクショナリへのディクショナリ・リンクに関する必知事項
ルール・デザイナを使用している場合、デプロイされたコンポジット・アプリケーションおよび関連するOracle Business RulesディクショナリをMDS接続で参照できます。ただし、MDSにデプロイされたディクショナリにディクショナリ・リンクを作成することはできません。
2.2.10 BPELでのビジネス・ルールの入力および出力に関する必知事項
デシジョン関数の入力は、デシジョン関数の初期アクションに対する変数として使用できます。入力がファクトである場合、そのファクトは作業メモリー内にアサートされるので、ルールは、デシジョン関数の入力名ではなく、タイプおよびプロパティの値に基づいてファクトと一致する必要があります。たとえば、同じタイプに2つの入力input1およびinput2が存在する場合、ルールはこれらの入力をタイプおよびプロパティの値に基づいて識別するのであって、異なる2つの名前によって識別するわけではありません。入力が参照できないファクト(たとえば、文字列や整数)の場合、<decision function name>という名前のラッパー・タイプが作成され、ルールはこのタイプと一致する必要があります。
2.2.11 2つ以上のディクショナリを比較またはマージする方法
「差異ディクショナリ」機能を使用すると、ディクショナリの最新バージョンと任意の旧バージョンとの差異を確認し、比較したバージョン以降の変更をロールバックできます。最新バージョンから見た差異が確認されます。
「ディクショナリのマージ」機能を使用すると、ベース・バージョンと最大3つの変更バージョンとの差異を確認し、それらの差異を解決またはマージできます。変更されたバージョンから見た差異が確認されます。
「差異ディクショナリ」と「ディクショナリのマージ」はどちらも差異を表示して解決できますが、これらの2つの機能の基本的な違いは、複数のディクショナリをマージできますが、複数のディクショナリの差異をとることはできない点です。
「ディクショナリのマージ」および「差異ディクショナリ」オプションは、図2-9に示すようにルール・デザイナから使用できます。
Oracle JDeveloperでのデザインタイムには、最大3つまでの異なるディクショナリを比較して、4つ目のディクショナリにマージできます。実行時には、SOAコンポーザを使用することで、限定された比較を実行できます。詳細は、「実行時のOracle Business RulesとのOracle SOAコンポーザの使用方法」を参照してください。
ルール・デザイナでは、ベース・バージョン(編集中のもの)を2つのそれぞれ個別に変更されたバージョン(ベース・バージョンに対して相対的)と比較して、選択した変更をベース・バージョンにマージできます(新規バージョンとしての保存が必要)。
警告:
ディクショナリは差異またはマージ・モードになっているときは読取り専用になるため、これらの機能のいずれかの実行を決定する前に、すべての変更を解決する準備をする必要があります。
ディクショナリのマージは注意深く実行してください。関与する様々なバージョンを特定し、管理する必要があります(ベース、バージョン1、バージョン2および結果)。
2.2.11.1 ディクショナリ間の差異を調べる方法
ディクショナリを比較する場合は、最初にルール・デザイナで新しいディクショナリを開き、「差異ディクショナリ」ダイアログを使用して、比較する古いディクショナリを選択します。新しい方のディクショナリに存在しないものはすべて、新しいバージョンからの削除としてフラグが指定されます。
ディクショナリ間の差異を調べるには:
差異ディクショナリ・オプションを表示できます。この選択項目は、ディクショナリを比較した後に使用可能になります。図2-10に示すように、「差異ディクショナリの表示」オプションには、比較されるディクショナリに関する情報がリストされます。
2.2.11.2 ディクショナリのマージ方法
複数のディクショナリのマージが必要な場合は、まずルール・デザイナで古い方のディクショナリを開いてから、「ディクショナリのマージ」ダイアログを使用して、マージする新しいディクショナリを選択します。古いディクショナリに存在しないものはすべて、最新バージョンでの追加としてフラグが指定されます。
これは、複数のディクショナリに対して機能するため、最初に最も古いものを使用し、次に1つ以上の新しいものを使用して、最後にその結果を最も新しいものに保存します。
ディクショナリのマージは、注意深く行ってください。すべての差異が解決されるまで一般的な編集は無効化されているため、場合によっては、競合している値を暫定的に受け入れるか拒否し、残りの差異を処理した後、編集を終了するために戻ることが必要になります。
ディクショナリをマージするには:
2.3 Oracle Business Rulesグローバルの使用
ルール・デザイナを使用してOracle Business Rulesグローバルを追加できます。
Oracle Business Rulesで使用するグローバルは、Javaにおけるパブリックな静的変数に類似しています。グローバルは、定数または変更可能に指定できます。
グローバルの定義を使用すると、複数のルールと関数で情報を共有できます。たとえば、複数のルールで10%割引を使用する場合は、グローバルGold Discountを作成し、このグローバルを使用してすべてのルールに適切な割引を適用できます。
グローバルの定義を使用すると、プログラムをモジュール化してメンテナンスを容易にできます。
2.3.2 Oracle Business Rulesグローバルの編集方法
ルール・デザイナを使用して、グローバルを編集できます。
グローバルを編集するには:
- Rules Designerで、「グローバル」ナビゲーション・タブを選択します。
- 「編集」ボタンをクリックし、「グローバルの編集 - グローバル名」ウィンドウを開きます。このウィンドウで、グローバルを編集し、「ファイナル」フィールドや「定数」フィールドなどのフィールド値を変更できます。
2.3.3 「ファイナル」オプションと「定数」オプションに関する必知事項
「グローバルの編集」ダイアログには、グローバルに対して選択可能な「定数」チェック・ボックスと「ファイナル」チェック・ボックスが表示されます。
グローバルを使用する場合は、次のことに注意してください。
-
「ファイナル」をクリアすることは、Assignアクションなどで、グローバルを変更可能にすることを意味します。
-
「ファイナル」を選択することは、ルール内のテストでグローバルを使用できることを示します(ファイナルでないグローバルはルール内のテストで使用できません)。
-
「ファイナル」を選択することは、グローバルが実行時に1度初期化され、変更できないことを示します。
「グローバルの編集 -」ダイアログで「定数」オプションを選択することは、グローバルが定数であることを示します。Oracle Business Rulesでは、定数は、文字列や数値リテラル、値が定数であるファイナル・グローバル、または定数と+
、-
、*
および/
を含む単純な式です。
グローバルに対して「定数」オプションを選択すると、次の3つの影響があります。
-
文字列リテラルを二重引用符で囲む必要がありません。
-
式の値の選択リストに定数のみが表示されます。
-
式の値が有効な定数である必要があります。
「定数」オプションは、必要に応じて選択できます。値セット値、値セット範囲エンドポイント、およびルールセット・フィルタ値は、常に定数であることに注意してください。
2.5 Oracle Business Rules関数の概要
Oracle Business Rulesには、ルール作成時の複雑さを隠すための関数が用意されています。Oracle Business Rulesでは、組込み関数またはユーザー定義関数をルールおよびデシジョン表の条件およびアクションに使用できます。
Oracle Business Rulesでは、Javaメソッドに類似する方法で関数を定義しますが、Oracle Business Rules関数はクラスに属しません。Javaアプリケーション・オブジェクト・モデルはOracle Business Rules関数を使用して拡張できるため、ユーザーは、元のJavaアプリケーション・コードを変更せずに、複数の操作をルールで実行できます。
Oracle Business Rules関数は、ルールまたはデシジョン表に関連付けられている条件またはアクションに使用できます。
また、Oracle Business Rules関数定義を使用して、同じまたは類似した式を複数のルール間で共有し、結果をアプリケーションに戻すこともできます。
Oracle Business Rules関数には、次の項目が含まれています。
-
名前: Oracle Business Rules関数名。
-
戻り型: Oracle Business Rules関数の戻り型、または戻り値がない場合はvoid。
-
値セット: Oracle Business Rules関数に関連付ける値セット。これはオプションです。
-
引数: 関数の引数。各関数の引数には名前、型およびオプションの値セットがあります。
-
関数本体: 事前定義済アクションを含む関数本体。事前定義済アクションを使用すると、ルール・デザイナではOracle Business Rules関数の書式が適切で検証可能であることが保証されます。
ルール・デザイナ内で関数を使用してルールをテストすることもできます。詳細は、「ルール関数を使用したデシジョン関数のテスト」を参照してください。
2.6 Oracle Business Ruleリソースのローカライズ
ルール・リソースの名前、別名、説明をローカライズできます。これにより、ワークスペースとSOAコンポーザでリソースをうまく制御できるようになります。値セット、グローバル、ルールセット、ルールなど、ほとんどのリソースをローカライズできます。動詞ルールでは、ビジネス・フレーズの値もローカライズできます。
これらのリソースを作成したら、「変換」タブでロケール固有の情報を追加できます。各ロケールは個別のリソース・バンドルに保存されています。
ノート:
リソース・バンドルを手動で編集して、ローカライズされた文字列を追加したり編集したりすることはできません。リソース・バンドルを編集するには、JDeveloper、BP ComposerまたはSOAコンポーザのルール・デザイナの「変換」タブを使用する必要があります。