ナレッジNEW
【連載】概念モデリングを習得しよう:概念情報を使った現実世界の参照と更新(第16回)

【前回の連載記事はこちら】
【連載】概念モデリングを習得しよう:概念情報モデルの活用(第15回)
読者の皆さん、こんにちは。Knowledge & Experience 代表の太田 寛です。この連載コラムでは概念モデリングの解説を行っています。
今回から、概念情報モデルを使って、現実世界の参照・更新について解説していきます。
概念情報モデルをもとに、圏Iのモデルを通じて、現実世界を観察する
まず、“樹木に生っているリンゴの数を数える”ことにします(図表1)。
圏I のモデルは、果樹園という意味の場を通じてみた現実世界の写しでした。
このモデルの意味的な構造は、果樹園という概念ドメインの概念情報モデルで規定されています。ここでは、“樹木に生っているリンゴの数を数える”という目的を、ある果樹園におけるリンゴの出荷数を見積もるためと、しておきます。
これを受けて、ここでは、
“ある特定の果樹園の、樹木に生っているリンゴの数を数える”
が、より正確な問いになります。
この問いを、概念情報モデルを使って答えると、
1.果樹園に対し、果樹園ID(名前でも可)をもとに、ある果樹園を一つ見つける
2.見つけたある果樹園から R5 でリンクされた樹木を見つけ、それぞれの樹木から R2でリンクされた栽培中のリンゴを見つける
3.見つけた栽培中のリンゴの数を数える
※ 説明文を簡略化するため、概念クラス*は記号*を付記し、概念インスタンス(単体、または集合)をアンダーライン付きの斜体で表現することにします
という流れになります。現実世界の写しである圏I のモデルを観察者が脳内に思い浮かべ、概念情報モデルをもとに、事柄を拾い上げていくことをイメージしてみてください。
手順を日本語で書くと、どうしても曖昧になってしまいます。
ここでは、概念モデリングの専用ツールとして利用可能な BridgePointで使われている OAL(Object Action Language)を使って表記します。
OAL の詳細は、
https://xtuml.org/wp-content/uploads/2012/09/Object_Action_Language_Reference_Manual2.pdf
で参照可能です。
このコラムでは必要な部分だけ適宜取り上げて説明していきます。
OAL による記述は以下の通りです。
アクション記述例1.
1. SELECT ANY 果樹園 FROM INSTANCES OF OR
2. WHERE SELECTED.果樹園ID == PARAM.果樹園ID ;
3. IF NOT EMPTY 果樹園
4. SELECT MANY 栽培中のリンゴ RELATED BY 果樹園->FT[R5]->AUC[R2] ;
5. リンゴの数 = CARDINARITY 栽培中のリンゴ ;
6. ELSE
7. リンゴの数 = 0 ;
8. END IF ;
簡単な英語で書いてあるので、あまり苦労せずに読めることと思います。
1行目の“OR”や4行目の“FT”、“AUC”などは、果樹園の概念情報モデルに記述された概念クラスの名前の横に“{…}”で添え字した概念クラスの短縮名です。
1~2行目は、“OR”、つまり、“果樹園*”という概念クラスをひな型にした概念インスタンス群の中から、WHERE 句に続く条件を満たす概念インスタンスを一つ(“ANY”)選択して、“果樹園”という変数に格納するという意味です。PARAM.xxx は、この問いを行う際に外から与えられた引数セット(Parameters)です。
3行目は、“ IF NOT EMPTY”で、1~2行目での選択で条件に合致する概念インスタンスがある場合に、4~5行目を実行し、無かった場合は、“ELSE”に続く7行目を実行するという意味です。
4行目は、1~2行目で選択した果樹園からR5 でリンクされた樹木*の概念インスタンス群をたどり、更に、それぞれの樹木にR2でリンクされた栽培中のリンゴ*の概念インスタンス群全て(“MANY”)を選択して、“栽培中のリンゴ”という変数に格納するという意味です。“栽培中のリンゴ”という変数は、該当する概念インスタンス群の集合が格納されています。
選択した“果樹園”から、栽培中のリンゴを見つける道筋を、
- ->FT[R5.’栽培している’]->AUC[R2.’栽培している]
と表現しているわけです。ここでは二つのリレーションシップをたどっていますが、幾つたどっても構いません。
5行目のCARDINARITY は、その右にある概念インスタンスの集合の要素を取得するオペレータです。4行目で取得した、“栽培中のリンゴ”という概念インスタンスの集合を格納した変数の要素数を数え上げて、“リンゴの数”という変数に値を代入しています。
冒頭の、日本語の問いの記述では、想定した果樹園IDに該当する果樹園の有無は明確にはしてはいませんでしたが、OAL では明記しています。
最終的に、問いの結果は“リンゴの数”に入ることになります。
概念モデリングでは、圏I のモデルに対する問いや、後ほど詳述する更新も含め、“アクション”と呼びます。
OAL で記述したテキスト列は、一見すると、通常のプログラミング言語のように見えるかもしれません。通常のプログラミング言語であれば、上から順に書かれた内容が実行されていきますが、 “アクション”は、必ずしもそうとは限らないので注意が必要です。
通常の手続き的なプログラミング言語とは異なり、データフローモデルをテキストで記述したものと考えます。
データフローモデルとは、複数の円形で表記されたプロセス(バブルとも呼ぶ)と、そのプロセスへの・からのデータの流れで表現するモデルです(図表3)。
それぞれのバブルは、それに流れ込むデータフロー上のデータが全てそろった時に計算などの処理が行われ、その処理が完了すると、それから流れ出すデータフロー上のデータが使えるようになります。その際、バブルに流れ込んだデータは消費されて、再利用はできません。
モデルに書かれたバブルの実行順序は、図表3で紹介しているように、入出力データの依存関係によってのみ決まります。
また、バブル実行開始から完了までは0でない有限の時間がかかるものとします。
これらの決まり事をまとめて、データフローモデルの実行セマンティクスと呼びます。
アクション記述例1. をデータフローモデルで記述してみると
といったモデルになります(図表4)。図中の上下のみに線が書かれた四角形には、“All instance of XX*”とテキストが振られていますが、これは、問いの対象の圏I に存在するXX *という概念クラスをひな型とする全概念インスタンスがデータフローの入力であることを示しています。簡単に言い換えれば、あるプロセスが実行する任意の時点で、圏Iに存在する概念インスタンスの全てが参照可能だということです。
参考までに、アクション記述例1. で使われている基本的なプロセスをリストで示します。
A) SELECT ANY ~ FROM INSTANCES OF ~ WHERE CONDITION
- ある概念クラスの概念インスタンスのうち、CONDITION の条件に合致するものを一つ選ぶ
B) IF CONDITION ~ END IF
- CONDITION が True の時 ~ を実行する
C) SELECT MANY ~ RELATED BY I->~
- ある概念インスタンス I から、意味的リンクでつながっている概念インスタンスの集合を選ぶ
D) CARDINARITY instanceSet
- instanceSet に含まれる概念インスタンスの数
次に、果樹園がある仲卸業者と結んでいる仲買契約の買取予定数に対する、収穫予定のリンゴの数を問うアクションを書いてみます。
アクション記述例2.
1. SELECT ANY 果樹園 FROM INSTANCES OF OR
2. WHERE SELECTED.果樹園ID == PARAM.果樹園ID ;
3. SELECT MANY 栽培中のリンゴ RELATED BY 果樹園->FT[R5]->AUC[R2] ;
4. SELECT MANY 収穫済みのリンゴ RELATED BY 果樹園->FT[R5]->PHA[R3] ;
5. SELECT ANY 仲買契約 RELATED BY 果樹園->MC[R6]
6. WHERE SELECTED.業者ID == PARAM.業者ID ;
7. 残必要数 = 仲買契約.買取予定数
– ( CARDINARITY 栽培中のリンゴ + CARDINARITY 収穫済みのリンゴ ) ;
ここでは、説明にかかわる本質ではないNOT EMPTY チェックは省きました。これをデータフローモデルで表現してみます(図表5)。

この時、
- 3行目:“果樹園”から R5、R2 とたどって“栽培中のリンゴ”を探すプロセス
- 4行目:“果樹園”から R5、R3 とたどって“収穫済みのリンゴ”を探すプロセス
- 5行目:“果樹園”から R6 でたどって条件に合致する“仲買契約”を探すプロセス
の間には直接的なデータフローのつながりはありません。データフローモデルの実行セマンティクスから、この三つのプロセスは、どれかが先でも同時並行的な実行でも構いません。
ここで、アクション記述1.、2. の中に現れたプロセスを、形式ごとに分類してみることにします。例えば、アクション記述例2.の3行目と4行目では、たどるリレーションシップや概念クラスは異なりますが、リレーションシップをたどってリンク先の概念インスタンスの集合を構成することに変わりはないので、一つの分類とする、といった具合です。
こんな感じで分類したプロセスの種類を以下にリスト化します。
- ある概念クラスの概念インスタンスの中から条件に合致する概念インスタンスを選択する
- ある概念インスタンスからリレーションシップをたどってリンク先の概念インスタンスを選択する
- 概念インスタンスの属性を参照する
- 二つの値を比較する ― 論理演算
- 論理演算の結果の True|False を振り分ける
- 概念インスタンス集合の要素数を数える
- 二つの値を加減乗除する
圏Iのモデルに対する参照操作は、目的に応じて千差万別ではありますが、これらのプロセスの組み合わせでほぼ記述可能です。
次回は、概念情報モデルをもとに圏Iのモデルについて現実世界と整合を取る方法について解説します。
この記事は面白かったですか?
今後の改善の参考にさせていただきます!