OpenRules入門1 (インストールとサンプル実行)

コマンドプロンプト結果

 OpenRules は オープンソースのBRMS (BDMS)。もっとも、商用のnon-GPLライセンスも用意しており、基本は商用のツールと考えてよいかと思います。ただそれだけに実績もあり、トムソン・ロイターやコメルツバンクなどなど海外の大手企業でも使われているようです。OpenRulesは、Excelで書いたデシジョンテーブルをそのまま実行できるなど、ビジネスユーザでもルールを書きやすく作られているのが特徴ですが、この(超)入門では、ルール記述の具体的な感触をつかむために、Droolsでも用いた旅費規程のサンプルを実行することを目標としてみました。まず最初は、インストールと付属のサンプルの実行からはじめてみましょう(ちなみに以下はWindows上での実行例です)。

OpenRulesインストールのための前提要件

 OpenRulesをインストールするには、

  • JDK 1.5以上
  • Apache Ant  1.6以上

が必要です。これらのインストール方法については、他にたくさんサイトがあるので詳しくは省略しますが、ダウンロードおよび適当な場所に展開した後、JAVA_HOME、ANT_HOME、またPATHを設定しておいてください。

 インストールが正常に完了したかどうかは、コマンドプロンプトで、それぞれ

  • java -version
  • ant -version

を実行して、意図したとおりのバージョンが表示されるのが確認できればOKです。 

 

OpenRulesのダウンロード

 OpenRulesのダウンロードサイトは Complete version の場合、

http://openrules.com/download.htm

になります(evaluation versionは、別のページ (download_eval.htm) です)。 

Complete version をダウンロードするには、多少料金(nominal fee)がかかりますが、ちょっとお高めの専門書を買ったと思って私は、Complete versionを使いました。 

ユーザの情報を登録すると、しばらくして(というか、人手で確認しているのか一晩くらいかかりました)ダウンロードのためのキー情報が送られてきます。 この後、最新のComplete versionのダウンロード画面( download.htm のページの下の方にリンクがあります)に行き、openrules_X.X.X.decisions.zipをダウンロードします。ダウンロードの際にキー情報の入力が要求されますが、その際に送られてきたキー情報を入力することでダウンロードできます。

openrules_X.X.X.decisions.zip を適当な場所に解凍してみましょう。解凍すると、中に openrules.decisions というフォルダができていて、その下にはたくさんのサンプルプロジェクトが展開されています。これで、サンプルを実行する準備ができました。

 

サンプルプロジェクトの実行

 簡単なサンプルとして openrules.decisions の下の DecisionHelloを試しに実行してみましょう。このサンプルプロジェクトは、顧客に対し、そのときの時刻や顧客属性に合わせたあいさつを生成するプログラムです。

 DecisionHelloのフォルダを開き run.bat をダブルクリックして起動してみましょう。

コマンドプロンプト結果

コマンドプロンプトに結果が表示されています。 

 

サンプルプロジェクトの内容

  サンプルプロジェクト内の主要なファイルを中心に、ざっと内容を概観してみましょう。

・run.bat
 プログラムを起動するバッチファイルになります。中身は、antを呼んで、build.xml 内の run を実行しています。

・build.xml、build.properties
 ant の 振る舞いを記載した定義ファイルです。 build.xml のうち、 起動のトリガー(main)となる java ソースファイル(ランチャー-launcher-)、同じく Excel のメインのファイルの指定は、build.properties という別の定義ファイルとして切り出してあります。 

・compile.bat
 コンパイル用のバッチファイル

・src\hello\main.java
 このプロジェクトのjavaのランチャー。まずは、この中のmainが動きます。 

・rules\main\Decision.xls
 メインとなるテーブル、環境設定のテーブルなどを集めたExcelファイル

rules\include\Data.xls
rules\include\Glossary.xls
rules\include\Rules.xls 
 それぞれ、テストデータと、そのデータ構造を定めたExcelファイル、 ルールに用いる用語を定めたExcelファイル、ルールを記述したExcelファイルになります。なお、Excelのファイルは上記のように必ずしも分ける必要はなく、それぞれのテーブルの1行目のキーワードがきちんと記載されていれば、すべて一緒のファイル、一緒のシートに集めてしまっても、わかりやすいように分けても自由なようです。 

 

OpenRulesのテーブルキーワード

 OpenRulesでは、ほとんどのことが Excel のテーブルで記述されます。したがって、OpenRulesのテーブルにつく、キーワードは非常に重要です。ここでは、このキーワードの主要なものをあげてみましょう。

・Decision
 ルール実行の最初に起動されるテーブルです。javaで言えば main メソッドにあたるテーブルで、上から順番に実行されます。 1列目はデシジョンの名前で自由に記述でき、2列目が実行される内容になります。DecisionHelloプロジェクトの例では、この2列目には javaっぽい記述もちらほら見られますが、多くの場合実行されるデシジョンテーブル(DecisionTable)を指定することになります。デシジョンテーブルは、次にあげるキーワード ”DecisionTable” で定義されますが、これを実行するためには、テーブル名の前後に、それぞれ := と () をつけます。たとえば、 DefineGreetingというデシジョンテーブルを実行するためには、2列目に、:= DefineGreeting() と記述することになります。

・DecisionTable 
 OpenRulesでは、ルールはデシジョンテーブル(DecisionTable)で書かれます。形式としてはDecisionTableの他にもさまざまなバリエーションはあるのですが、入門段階では、DecisionTableを覚えておけばよいかと思います。テーブル中のCondition列がIf、Conclusion列がThenにあたります。

・Environment
 実行するための、インクルードファイルなどの指定を行います。javaで言えば、クラスパスの指定と言えばわかりやすいでしょうか。 

・Glossary
 デシジョンテーブルの判断に使われている用語(変数)を列挙したテーブル。 1列目が用語(変数)、2列目がBusiness Conceptを表し、3列目が実際のシステム上の属性になります。 データモデルの用語を使ったアナロジーで言うと1列目、2列目は概念あるいは論理データモデルの世界を表し、3列目は、実装を意識した物理データモデルの世界になります。 Business Conceptはいわゆるエンティティにあたるでしょうか。
 
・Datatype
 システム上の属性(2列目)に対し、javaのデータ型(1列目)を対応させるテーブル
 
・Data
 テストオブジェクト(テストデータ)のテーブル。複数のデータを配列として保持する。
 
・Variable
 ひとつのテストオブジェクトをあらわすテーブル
 
・DecisionObject
 Glossaryテーブルで定義されたBusiness Concept に対し、具体的なテストオブジェクトを対応させるテーブル
 
全体の構成として簡単にまとめると、
 
ビジネスルールの記述は、DecisionTableに記述し、それらの実行順を定義するのがDecision。さらにDecisionTableに現れる用語(変数)を定義するのがGlossaryとなります。
 
一方、具体的に実行をする上でのテストデータの一覧を定義するのが、DataやVariableで、それらのデータ型はDatatypeで定義し、実際の実行に際し流すデータは、DecisionObjectで定めます。そしてビジネスルールの用語(変数)と具体的なデータとを結びつけるのがやはりGlossaryとなります。 
 
また、ルール等を記述する際にファイルを分ける場合には、いわゆるクラスパスにあたる記述が必要となり、それらをまとめたのがEnvironmentです。 
 

サンプルプロジェクト、再度の実行

以上の知識をもとに再度サンプルプロジェクトを実行してみましょう。
 
DecisionHello実行結果
 
run.bat により、ant が起動し、最初に java ランチャー(Main.java)が動きます。 mainは、
 
public static void main(String[] args) {
String fileName = “file:rules/main/Decision.xls”;
Decision decision = new Decision(“DetermineCustomerGreeting”,fileName);
decision.execute();
decision.log(“Decision: ” + decision.get(“result”));  
}
 
のようになっており、最初にルールの main にあたるDecisionテーブルの含まれるExcelファイル(rules/main/Decision.xls)が
指定され、Decisionである DetermineCustomerGreeting を実行します。

以上、駆け足で見てきましたが雰囲気はおわかりになられたでしょうか。次の記事では、実際に旅費規程のサンプルを作ってみたいと思います。