Decision Model and Notation と IBM Decision Composer

# DMNとは 
Object Management Groupによって定義された、意思決定をモデル化するための表記法。
>http://www.omg.org/spec/DMN/
2016年6月にV1.1の仕様公開。

業務ユーザーが理解できる共通の表記法を提供するところを目的としているようです。
>　- 意思決定をダイアグラムに簡単に示す
>　- ビジネスアナリストによって正確に定義される
>　- （オプション）自動化される

この表記法のユースケースとしては、以下のものが有るそうです。
>　- 手作業による意思決定の定義
　- 自動化された意思決定のための要件の指定
　- 実行可能な完全な意思決定モデルを表す

基本的な表記はこんな感じです。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/6102e894-7244-0ae2-2ca9-c918eed296cb.png)
ざっくり3つの書き方があって、それぞれ、以下の対応で考えておいて良いらしい。
Decision : アウトプットデータの定義
Input data : インプットデータの定義
Business knowledge : ビジネス・ルールの定義
ビジネス・ルールの式の記法とデータの型定義は、FEEL: friendly enough expression languageという物で定義されているようです。

正直、日本でDMNが盛り上がっているとは思えないですが、米国ではそれなりに認知されているのか、幾つかのベンダーがこの仕様をサポートしていることがブログで書かれていました。ちと古いですが。
> https://methodandstyle.com/dmn-tools-current-state-market/


#Decision Composerとは
IBMが提供するBRMSソフトウエアである Operational Decision Manager(ODM)のサブセットが、PaaS環境であるBluemix上で Business Rules サービスとして提供されています。
このツールは、Webブラウザー上で意思決定をモデル化(ビジネス・ルールを書く)し、BRMSサーバー(ODM)に対してコーディングレスで実行モジュールを生成しテストを行うことが出来るのが特長です。ビジネス・ルールの表記については、製品の機能をベースにしているためODMが持っている内部アルゴリズムを活用したルール記述ができます。

簡単なルールをちょこっと作りたいだけなので、開発ツールのインストールとかサーバーのインストールとか面倒くさいことはやりたくない、という人には良い環境かも。

> https://www.ibm.com/cloud-computing/jp/ja/bluemix/

無料試用期間もあるので、アカウントを作成し、Bluemix上のBusiness Rules を探してみます。

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/7c9ef77f-ae09-4225-5a2b-72e735c1cf43.png)

作成ボタンをクリック

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/ab6bafbb-b90f-4c41-2b7b-7b92090a695d.png)

このメニュー画面をみると、始めにタブの中に、お目当てのDecision Composerへのリンクがあります。実験用と書かれているだけあって、製品版では提供されていない機能です。

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/05ea9c84-b91b-08b1-a33f-af3afdb77cda.png)

アイコンをクリックしてみると、この機能は実験的なものであることが示されます。

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/29cbd0ae-3cf2-fb0f-a813-441e8d2426f1.png)

提供されているサンプルは、4つ

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/1a5b8990-30e7-19e5-84ad-4f7a40fb7cbd.png)
Greetings が現在時間と性別から挨拶文を生成
Runnerは、マラソンランナーにお勧めのレースをレコメンド
Car Rentalは、レンタカーショップが、車の返却時の判断をモデル化
Loan Validationは、借り手の情報を元に、ローン金額に応じた保険の料率を算出

とりあえず、一番構造がシンプルなGreetingsを開いてみます。

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/aebb3287-a935-a124-d881-b2af64b2574f.png)

-長方形は、Decisionでアウトプット・データを定義
-角丸の長方形は、Input Dataで、インプット・データを定義
-DMN仕様 のBusiness Knowledge は、Decisionの長方形をダブルクリックすることでビューが切り替わるので、その中で定義していきます

角丸の長方形が外部からの入力を表し、接続している長方形の中で処理と結果のアウトプットデータが作られて、終端に位置する長方形が最終のアウトプットを生成します。
図では、Genderが選択されているのですが、画面左側には、Input name と Type が表示されています。モデルが動かすためにデータの定義は必要です。

この図一枚が、サービス・インターフェース（インとアウトのデータ）を持つマイクロ・サービスと言ったところでしょうか。

Courtesy Titleという長方形をダブルクリックすると、以下のような画面が開く。画面の左側に、Decision Logic と Input variablesという領域がありますが、ここには、Decision Logicの下にアウトプットのデータ名と型および判断ルールのエントリーがあります。Input variablesには、この長方形に接続しているインプットデータが2つ表示されています。
画面右側は、デシジョンテーブルが記述でき、インプットデータ２つを元に条件列が２つと、アウトプットデータを元に結果列が1つ自動的に作られて、そこに条件式と内容を入力していくスタイルになっています。
長方形の中には、複数のルールを作成し保管しておくことが出来ますが、製品では出来る実行順序の制御はサポートしていない模様。

構造が、だいたい理解できた所で、画面左上に有る ← アイコンをクリックして前の画面に戻り、Greetingの長方形をクリックしてみます。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/4a219c36-6168-e4ca-ef3e-a4b143067417.png)

こちらのルールは、時間(integer)を受取って、その時間に応じて挨拶文を変えてみます。"こんにちは" じゃなくて "こんにちわ" にしたのは、Bluemix上のWatson Text to Speachにデータを渡したかったからです。 音声にすると、短文だと "は" と "わ" の区別は機械には難しいものねぇ（TtSとの連携は、別の機会に）

一応、複雑なルール記述にも対応しているので、条件や結果列の追加や式の変更、前提条件の設定などは、製品と同じことが出来そうです。
変更した後は、画面上の Save アイコンをクリックして、その右隣にある Run... をクリックしてみます。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/f2a69e1e-787e-9360-5791-98750eb2c21f.png)

Run..　は、モデルをテストできる機能です。
画面の左側にモデルに渡すインプットデータの雛形が作られるので、テストデータとして編集してSaveしておけば、次のテストの時に入力しなくて良いです。データを設定して、Runアイコンをクリックすると、モデルから実行モジュールが裏側でビルドされ、自動的にサーバーにデプロイされて、インプットデータが渡されて、リターンデータが画面右側のOutputの下に表示されます。

このテスト機能は、日本語対応していないようで、文字化け。。

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/5a306128-9af1-bc2e-cc23-af780e0d6ab4.png)

Raw dataとしては、このテスト機能とデプロされたルールモジュールの間の通信データ(REST)の確認ができる。（残念ながら、ここも日本語は文字化け。）
このRaw dataは、入力データと実行時にヒットしたルール、実行時間などを一緒に返してくれる。

`{
    "buildTime" : 0,
    "compilationTime" : 0,
    "computedInputParams" : {
        "Degree" : "",
        "Gender" : "Male",
        "Hour" : 10,
        "Name" : "Jones"
    },
    "decisionModelId" : "59229e33ea6141b5b179e14cea639d2f",
    "exceptionLocation" : null,
    "exceptionMessage" : null,
    "executedRules" : [
        {
            "instanceCount" : 1,
            "nodeName" : "Degree",
            "ruleName" : "default-value"
        },
        {
            "instanceCount" : 1,
            "nodeName" : "Courtesy Title",
            "ruleName" : "title"
        },
        {
            "instanceCount" : 1,
            "nodeName" : "Greeting",
            "ruleName" : "greeting"
        },
        {
            "instanceCount" : 1,
            "nodeName" : "Salutation",
            "ruleName" : "salutation"
        }
    ],
    "executionTime" : 37,
    "firedRules" : 4,
    "input" : "{\n  "Name" : "Jones",\n  "Hour" : 10,\n  "Gender" : "Male",\n  "Degree" : null\n}",
    "notes" : [
        "?????????, Mr. Jones!"
    ],
    "outputParams" : {
        "Salutation" : "?????????, Mr. Jones!"
    },
    "params" : {
        "Courtesy Title" : "Mr.",
        "Degree" : "",
        "Gender" : "Male",
        "Greeting" : "?????????",
        "Hour" : 10,
        "Name" : "Jones",
        "Salutation" : "?????????, Mr. Jones!"
    }
}`

このRun機能は、サーバー側にデプロイされたモジュールは、テンポラリー領域に入るので、テストが終わると消されるので、テストが終わって動作確認が取れたら、別途、モジュールをサーバーにデプロイするオペレーションが必要です。

モデルをデプロイするために、画面を切り替えて、モデル定義の四角の右上に縦に3つの点が並んでいるアイコンをクリックすると、Deployのメニューが出てきます。Downloadを選択すると、モデルデータが含まれた1つのファイルがダウンロードできます。

Deployのウインドウでは、BluemixのBusiness Rulesの接続設定タブの内容をコピペしてDeployボタンをクリックすればOK。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/7b1b4e69-dd8d-c9aa-3a6d-6754e592dfcb.png)

デプロイされたモジュールの確認は、意思決定サービスタブを見ます。この画面のアクション列にある"サービスのテスト"アイコンで、デプロイされたモジュールのテストが出来るようになっています(Decision Composerを使わない開発の時にも使えるわけです)。

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/fa90f857-43fb-d29c-1163-c06e4d5dbb1d.png)

こちらのツールだと、日本語は通ります。（Decision Composerが実験用なので多言語が対応は対応していないのでしょう。）

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130412/0881b0ba-4d6c-b8ea-8a7d-1bc8b99577e3.png)

----
ここでは、サンプルデータをメインに紹介しましたが、モデルを自分で定義していくことも当然出来ますし、データモデルは、XMLスキーマ・ファイルや.jarファイルを食わせたり、swagger URLを渡してデータモデルを自動生成したりすることも出来ます。

製品が元々使っていた、データモデル(XOM)を基準に開発を始めていくスタイルと同じことが出来るようになっていたり、ルール記述のお作法が同じであったり、ODM利用者からすると分かりやすい部分が多いなという感想です。ただ、現時点では、製品では出来る日本語ルールの定義はサポートしていないようです。

BluemixのBusiness Rulesサービス自体が、1,000アクセスまで無償、その後、1,000アクセス毎に105円の課金であることを考えると、製品版を使うよりハードルが随分低くなっているのと、製品版との互換性も有ることから、開発用にこの環境を使っていくような使い方もありなのかもしれません。