本実施の形態においては、様々なデータ項目からなるデータを複数格納しているデータファイルから、ある計算に必要な情報を取り出すための方法を示す。以下では、データファイルとしてXBRLを例として用いるが、データファイル中のデータ項目について、他のデータ項目を導出可能であるという依存関係が別途定義されているようなデータファイルに同様に適用できる。
XBRLは、企業の貸借対照表等の財務情報を表現するためのXML文書の仕様である。XBRLは財務情報をXBRLインスタンスおよびタクソノミの複数のXMLファイルとして記録する。インスタンスとは財務情報の本体であり、勘定科目毎にその科目の値を記録する。図2にインスタンス内の勘定科目のデータの例201を示す(XBRLインスタンスの一部について概要を示すもので、正確なXBRLインスタンスではない)。図2のXMLは2つの勘定科目(売上高と純利益)を含むものであり、要素の値としてその勘定科目の値を記録する。これらの勘定科目の要素は多くの場合図2の例201に示すように、XMLのタグの階層として同じ階層にあり、フラットに並ぶ(それぞれの勘定科目の要素が他の要素の下位にならない)。
また、XBRLの仕様では勘定科目の要素は順不同である(要素の順序は財務情報として意味を持たない)。タクソノミはタクソノミスキーマとリンクベースからなる。このうちタクソノミスキーマは、XML Schemaであり、インスタンスで用いられる勘定科目の要素名、値の型等を定義する。リンクベースは勘定科目の様々な付加情報を表すもので、勘定科目の名称を表す名称リンクや、財務諸表として表示する際の表示順序を示す表示リンク、勘定科目間の計算関係を示す計算リンクなどを含む。このうち計算リンクは、ある科目の値が他のどの(1つ以上の)科目を足し合わせることによって算出できるか、というような各勘定科目の間の計算関係を示す。例えば「資産」という科目は、科目「流動資産」と科目「固定資産」を足したものであるというような情報である。このようにXBRLは、財務情報の本体となるインスタンスの物理構造(XMLのタグの階層構造)とは別に、タクソノミのリンクベースにおいて論理構造(計算リンクによる科目と科目の計算関係)を管理するという特徴を持ったデータである。
XBRLは企業の様々な財務情報を管理するものであり、この財務情報は例えば企業の株式投資のための分析に用いることができる。このとき、XBRLに含まれる勘定科目の値をそのまま用いたり、いくつかの科目から計算式によって指標を算出して用いたりする。例えば企業の安全性(倒産しないこと)を示す指標として、流動資産÷流動負債のような計算を行って指標値を求めることがある。XBRLデータは例えば企業か証券取引所等に提出し、これを証券取引所等が一般に公開する。公開されると投資家はこの情報を参照して、株式投資の行動を決定する。このとき、公開された情報が株価に影響するような内容である場合、他の投資家よりも先にXBRLの内容を判断して株式の売買注文を出すことが重要である。このためには、XBRLデータを入手後、高速に特定の科目の値や、複数の科目から指標を算出することが必要であるが、勘定科目は一般に多数の種類のものがあり、インスタンスにはその一部の科目の値(のみ)が記録される。
そのため、必要な科目の値がインスタンスに記録されていない場合も多い。このとき、計算リンクの情報を用いると、インスタンスに含まれていない科目の値を補うことができる。例えば計算リンクにおいて、「A引当金」「B引当金」「C引当金」の3つの科目の値の合計が「引当金合計」という科目であると定義されている場合で、「引当金合計」の値が必要な場合、「引当金合計」の値がインスタンスに含まれている場合にはその値、含まれていない場合には3つの科目の値のうちインスタンスに含まれる科目の値の合計の値を出力することで、必要な情報を得ることができる。そのため、「引当金合計」がインスタンスに含まれているか否かが不明であれば、インスタンスからは3つの科目の情報も探す必要がり、「引当金合計」が含まれていることが分かったならば3つの科目の情報はインスタンスから抽出する必要はない。
図1は、本発明の一実施例のデータ抽出を行うシステムの構成図である。データ抽出装置101は、たとえばPCであり、処理装置120、記憶装置150、入出力装置110からなる。処理装置120は例えばCPUであり、記憶装置150に格納したプログラムを読み込み実行する。記憶装置150は例えばメモリ、ハードディスクであり、プログラム、データを記憶する。入出力装置110は、ネットワークインターフェースやキーボード、ディスプレイ、外部記憶装置とのインターフェースである。記憶装置150は、データである構造情報151、計算式152、依存情報153、データファイル154、抽出済み一覧155やその他のデータと、処理プログラムである依存情報生成機能161、抽出機能162等を記録する。以降、データ抽出装置101の動作を説明するが、これは処理装置120が記憶装置150から処理プログラムを読み込み、プログラムを実行して記憶装置150からのデータの読み込み、データの書き込み、入出力装置110による外部とのデータの入出力により実行することで動作するものとする。
図3は、XBRLなどのデータファイルからデータ項目の値を取り出して、必要な計算式の値を算出する実施例の全体の処理のフローであり、依存情報生成機能161、抽出機能162、計算実行機能163の処理を示す。なお、XBRL以外のXML、CSV、その他のデータ形式でも、データ項目の並び順がXMLスキーマ、その他の規定により定められておらず、順不同であるようなデータファイルについては同様の処理が行える。また、本フローは、上述した図1のプログラムで実行される。
図3のステップ301が依存情報生成機能161の処理、ステップ352が計算実行機能163の処理、その他のステップが抽出機能162の処理である。データファイルからのデータの抽出において、ステップ301は事前に実行し、その他のステップは処理対象となるデータファイルがデータ抽出装置に入力された後、または入力される都度、実行する。依存情報生成機能161であるステップ301では、処理対象とするデータファイルの論理構造の情報(構造情報151)と、データファイルから取り出したい内容を表す計算式152から、抽出機能162が用いる依存情報153を生成する処理である。
次に、図4に構造情報151の構成を示す。構造情報151は処理対象とするデータファイル内の論理構造(データ項目間の依存関係)を表すものであり、データ項目の親子関係を表す表である。構造情報151は事前にデータ抽出装置101が入出力装置110からデータの入力を受け、記憶装置150に格納する。構造情報151は、親項目401、子項目402からなる表であり、それぞれデータ項目を識別するための符号を記録する。親項目401に示されるデータ項目が上位である親、子項目402に示されるデータ項目が会である子であることを示す。親、子とは例えばデータ項目がXBRLの勘定科目において、子の科目の値を足し合わせることで親の科目の値になることを示す。つまり、データ項目の依存関係において、親は子のデータ項目の値がそろうことで算出可能である。なお、数値を足し合わせることにより算出可能であるという関係のほか、他のデータ型や他の関係(関数、アルゴリズム)を用いて親の項目の値を導出する関係でもよい。以下では数値を足し合わせて算出する場合を例とする。
図5は、構造情報151の図4の例の表す内容の模式図501である。図5は、データ項目を頂点、親子の依存関係(図4の構造情報151の1レコード)を辺とし、親を上位として子から親の向きに矢印を置いたグラフ(有向グラフ)である。図4での親項目が1で子項目が2であるレコードは、模式図501では項目2から項目1へ結ぶ辺となる。
計算式152は、データファイル内のデータ項目から計算して出力する出力情報の条件であり、例えば、「計算式1=項目2÷項目7」というようなデータである。なお、数値から計算する計算式のみではなく、他のデータ型に対する様々な関数、アルゴリズムなどの情報の導出条件でもよい。以下では、導出条件として、数値からなる計算式を例とする。また、複数の計算式を保持してもよい。
依存情報153は、構造情報151と計算式152から、処理対象のデータファイルに現れうるデータ項目同士、データ項目と計算式152の依存関係を表す情報である。依存情報153の目的は、データ項目同士、データ項目と計算式152の依存関係を高速に判定することである。依存情報153の構成を図6に示す。依存情報153はデータ項目または計算式を区別するための項目601、前置順602、後置順603からなる表である。前置順602と後置順603はデータ項目または計算式の依存関係を管理ための数値である。データ抽出装置101はある二つのデータ項目またはデータ項目と計算式の依存関係を調べる場合に、依存情報153から、それぞれの前置順と後置順の値を取り出す。データ項目または計算式のそれぞれをα、βとし、αの前置順<βの前置順であり、かつ、αの後置順>βの後置順であれば、αはβの上位(親または親の親、さらにその親など)にあると判断する。これは一般に範囲ラベルと呼ばれるラベルである。
依存関係153を作成する依存情報生成処理161の処理フローを、図8に示す。まずデータ抽出装置101は、記憶装置150から構造情報151と計算式152を取り出す(ステップ801)。
次に、構造情報151と計算式152の情報から、データ抽出装置101は図9に示すツリー構造データ951を記憶装置150内に作成する(ステップ802)。ツリー構造データ951は、構造情報151と計算式152の依存関係を表す情報で、図5の構造情報151と、計算式「計算式1=項目2÷項目7」から図5と同様に表したものが模式図701である。計算式1が「計算式1=項目2÷項目7」である場合、図7は項目1と項目2から計算式1を算出可能であることを示す。図6の依存情報153は図7のグラフの依存関係を表した表である。ツリー構造データ951はこの図7の情報を表すデータであり、親項目に計算式が現れることを除けば構造情報151と同様の構成である。このツリー構造データ951は次のように作成する。なお値903は後の処理において、データファイルから取り出した項目の値と、その値から算出した値を格納する領域であり、ここでの処理では空欄としておく。
まず、構造情報151の全ての情報をツリー構造データ951にコピーする。次に計算式152から、計算式を親項目901、計算式が用いるデータ項目を子項目902としてツリー構造データ951にレコードを追加する。計算式が「計算式1=項目2÷項目7」のように複数のデータ項目を利用する場合、それぞれのデータ項目についてレコードを作成する。次に、ツリー構造データ951から、上位に計算式がないデータ項目が親項目901となっているレコードを削除する。これはツリー構造データ951の各レコードについて、上位に辿って親項目901に計算式が現れないレコードを削除することである。
上位に辿るとは、親項目901が他のレコードの子項目902となるレコード、さらにその親項目901が他のレコードの子項目902となるレコードというように、再帰的に上位のレコードを特定することである。図5に示す構造情報の例501と計算式「計算式1=項目2÷項目7」からは、図7に示すようなツリー構造データ951の例701を作成することができ、これは、図5に計算式の依存関係(項目2と項目3の上位に計算式1がある)を加え、上位に計算式が無い項目(項目1)が親項目901となっているレコードを削除したものである。
次に、データ抽出装置101の依存情報生成処理161で、依存情報153の作成として、ラベル付けを行う(ステップ803)。この処理ではまず、記憶装置150に数値を記録するための領域であるカウンタを用意し、初期値として1を記録する。次にツリー構造データ951からルートとなる項目を特定し、その項目についてステップ804以降の処理を行う。ルートとなる項目の特定とは、ツリー構造データ951の内容を記憶装置150から読み込み、親項目901の内容が、子項目902に現れないような親項目901を特定することである。図9のツリー構造データ951の例では、「計算式1」が、親項目901には現れるが、子項目902には現れないためルートとなる項目となる。ルートとなる項目を特定した後、データ抽出装置101は、そのルートの項目をパラメータとして、ステップ804を開始する。
ステップ804以降は、ツリー構造データ951を深さ優先探索を行いながらカウンタを更新し、始めに項目に到達したときに前置順602に、最後に項目に到達したときに後置順603にカウンタの値を記録する処理である。以下にその処理を示す。
ステップ804では、パラメータとして与えられたデータ項目について、依存情報153にレコードを追加する。項目604をパラメータとして与えられたデータ項目とし、前置順602はカウンタの値を記録する。また、カウンタの値を更新(1を加算)する。
次にデータ抽出装置101は、ステップ804でパラメータとして与えられた項目の子項目を特定し、それらの項目についてラベル付けする(ステップ805)。この処理では、ステップ804でパラメータとして与えられた項目が、ツリー構造データ951の親項目901であるレコードを特定し、その子項目902を特定する。データ抽出装置101は、この子項目902をパラメータとしてステップ804を再帰的に呼び出す。また、ステップ804でパラメータとして与えられた項目が、ツリー構造データ951の親項目901であるレコードが複数ある場合には、それらの子項目902について、繰り返しステップ804を呼び出す。
データ抽出装置101は、各子項目902について再帰的なラベル付け処理の呼び出しを完了した後、ステップ804でパラメータとして与えられた項目について、依存情報153に作成したレコードの後置順603をカウンタの値で更新し、また、カウンタを更新(+1)する(ステップ806)。ステップ806が終了した場合、ステップ804の呼び出し元へ処理を復帰させる。すなわち、ステップ804がステップ803から呼び出された場合には、全体の処理を終了し、ステップ805から呼び出された場合はステップ805に復帰し、未処理の子項目902がある場合にはその処理、各子項目902について処理が終了した場合は、ステップ806へ進む。
以上の処理により、依存情報生成機能161(処理フローのステップ301)の依存情報153の生成が完了する。この依存情報153の生成までは事前に行っておき、次のステップ302以降の処理は、処理対象のデータファイル154としてデータ抽出装置101が入出力装置110により受信し、記憶装置150に格納した後に実行する。
次に、ステップ321について説明する。ステップ321は処理対象のデータファイルから次のデータ項目を特定する。データ項目の特定とは、データファイルから読み出そうとしている項目の種類を特定することである。例えばデータファイルがXBRLのXMLである場合には、XMLのテキストを解析して、次に現れるXMLの開始タグの要素名と、必要な属性名、属性値を特定することである。すなわち、データ抽出装置101は記憶装置150に記憶した処理対象のデータファイルのXMLのテキストを順次読み込み、開始タグの要素名を取り出す。
また、その他のデータ項目を特定するために必要な属性を見つけるまで、開始タグ内の属性の情報を読み込む。要素名等による項目の特定のため、データ抽出装置101はあらかじめ記憶装置150に、要素名等と項目を識別する情報の対応を記録しておくものとする。データ抽出装置101は、この対応の情報により、XMLから取り出した要素名等の情報から、項目を特定し、ステップ322へ進む。なお、この段階では、XMLの要素の値を読み出す必要はない。また、ステップ321において、データファイルから次のデータ項目の特定を行う途中でデータファイルの終端に達した場合、ステップ352の計算実行へ進む。
次に、ステップ321で特定した項目が、指標の下位であるか否かをチェックする(ステップ322)。これは、ステップ321で特定したデータ項目が、計算式152の算出のために必要となる可能性があるか否かを確認するもので、具体的にはデータ抽出装置101が、取り出したデータ項目が依存情報153の項目601と一致するレコードを選択し、その情報(前置順602、後置順603)を取得して記憶装置150に記録する。取得できた場合には計算式152の算出のために必要となる可能性があると判断しステップ323へ進み、取得できない場合には不要であると判断してステップ321へ戻り、XMLのテキストから次の開始タグを見つける処理へと進む。
またここで、計算式152が複数ある場合にデータ抽出システム101は、データファイルから取り出したデータ項目が、どの計算式に影響を与える可能性があるかを判断してもよい。これは、計算式152が複数ある場合、その計算式の計算の実行をデータ抽出システム101の他の処理プロセス、処理スレッド、またはデータ抽出システム101以外のシステムが行う場合に、取り出したデータの送信先を決定するためである。これは、依存情報153の項目601が計算式であるレコードについて、その前置順602 、後置順603と、取り出したデータ項目の前置順、後置順を比較することで判断する。取り出したデータ項目が計算式の下位である場合(計算式をα、取り出したデータ項目をβとしたとき、αの前置順<βの前置順かつ、αの後置順>βの後置順)には、当該計算式に影響を与える可能性があると判断する。そして、以降のステップ324、ステップ340において、データ抽出システム101はデータファイルから抽出した項目とその値を抽出した場合、当該計算式を計算する他の処理プロセス、処理スレッド、他システムに、記憶装置150、入出力装置110などを利用して送信する。これを受信した他システム等は、ステップ352と同様の処理により、計算式352の計算を実行する。
次に、データ抽出装置101は、ステップ321で特定した項目と既にデータファイルから抽出したデータ項目との関係をチェックし、データ項目の要否を決定する(ステップ323)。この処理は抽出済み一覧155を用いて行う。抽出済み一覧155の構成を図10に示す。抽出済み一覧155は項目1001、前置順1002、後置順1003、値1004からなる表である。項目1001はデータファイルから取り出したデータの項目を識別する情報を記録する。前置順1002、後置順1003は依存情報153と同様であり、項目1001に項目601が対応する依存情報153の前置順602および後置順603を記録する。値1004は項目1001についてデータファイルから取り出した値である。例えばXBRLの財務情報であれば、項目は勘定科目を表すものであるため、値1001は勘定科目の値である。また抽出済み一覧155は、はじめは空であり、データファイルの処理を進める中で追加、削除されるものである。
抽出済み一覧155を用いてステップ323の処理は、次のように行う。まず、データファイルから取り出したデータ項目の前置順および後置順(ステップ322で依存情報153から取得)と、抽出済み一覧155の各レコードの前置順1002、後置順1003を比較する(抽出済み一覧155に複数のレコードが登録されている場合は複数のレコードと比較する)。データファイルから取り出したデータ項目の前置順が抽出済み一覧155の前置順より大きく、かつ、データファイルから取り出したデータ項目の後置順が抽出済み一覧155の後置順より小さい場合、取り出したデータ項目は抽出済み一覧155内の比較を行ったレコードの項目1001の下位であると判断する(図3の分岐の「廃棄」へ)。これは例えば、図7の計算式1の計算を行う場合に、データファイルから項目2の情報を取り出し、その後に項目3の情報を取り出した場合である。このとき、計算式1の計算を実行するためには、項目2の情報が存在する場合には項目3の情報は不要である。すなわち、取り出したデータ項目の値を用いなくても、抽出済み一覧155内の項目の情報により、計算式152の計算を実行可能であることが分かる。よって、この場合、取り出したデータ項目の情報は不要であるため、その情報を廃棄(データ項目を特定する情報を削除し、データの値をデータファイルから読み込まないことを決定)して、ステップ321へ戻り次のデータ項目の特定へ進む。
データファイルから取り出したデータ項目の前置順が抽出済み一覧155の前置順より小さく、かつ、データファイルから取り出したデータ項目の後置順が抽出済み一覧155の後置順より大きい場合、取り出したデータ項目は抽出済み一覧155内の比較を行ったレコードの項目1001の上位であると判断する(図3の分岐の「置換」へ)。これは例えば、図7の計算式1の計算を行う場合に、データファイルから項目3の情報を取り出し、その後に項目2の情報を取り出した場合である。このとき、計算式1の計算を実行するためには、項目2の情報があれば項目3の情報は不要である。すなわち、取り出したデータ項目の値を用いることで、抽出済み一覧155内の項目の情報は不要となることが分かる。よって、この場合、取り出したデータ項目の値を出力して、抽出済み一覧155の情報を更新するステップ340、ステップ341の処理へ進む。
その他の場合、抽出済み一覧155内の次のレコードと、同様のチェックを繰り返す。抽出済み一覧155内のいずれのレコードの項目とも、上位、下位との判断ができなかった場合には、当該データ項目は抽出済み一覧155の上位でも下位でも無いと判断する(図3の分岐の「抽出」へ)。これは例えば、図7の計算式1の計算を行う場合に、データファイルから項目3の情報を取り出し、その後に項目8の情報を取り出した場合である。このとき、計算式1の計算を実行するためには、項目3が必要になる可能性があり、項目8の値も必要になる可能性がある状態である。以降の処理で項目2や項目7の情報がデータファイルから得られなかった場合には、これらの項目の情報を組み合わせて項目2や項目7の値を算出して、そこから計算式1の計算を実行することが可能である。そのため、データファイルから取り出したデータ項目の情報を抽出するステップ324、ステップ325の処理へ進む。
以上のようにステップ323では、データファイルから取り出したデータ項目のラベルと、抽出済み一覧のラベルを比較することで、そのデータ項目が必要であるか否かを判断する。この判断は、取り出したデータ項目から、ツリー構造データ951を上位に辿ることでも判断することができるが、これはツリー構造データの階層の深さに処理時間が依存してしまう。また抽出済み一覧155の項目の数値の比較のみでデータが必要であるか否かを判断できるこの方法は、処理速度の向上を図ることができる。
図3の分岐の「置換」の場合、まず、データファイルからデータ項目の値を抽出する(ステップ340)。これはステップ321において、XMLの要素名等のみによりデータ項目の特定のみを行っていて、XMLの値を取り出していなかった場合に、そのXMLの要素の値を取り出す処理である。
次にデータ抽出システム101は、ステップ323において、ステップ321で取り出したデータ項目と比較を行った抽出済み一覧155のレコードを削除し、代わりに抽出済み一覧155に取り出したデータ項目とその値の情報を記録して、抽出済み一覧155のデータの置換を行う(ステップ341)。項目1001にはステップ321で取り出したデータ項目を識別する情報を記録し、前置順1002、後置順1003にはステップ322で依存情報153から取得して記憶装置150に記録しておいた前置順602、後置順603の値を記録する。また、値1004にはステップ340で抽出した値を記録する。
ステップ341の終了後、データ抽出システム101はステップ321へ戻る。なお、ステップ341で抽出済み一覧155にデータを記録することに加え、データの削除も行ってもよい。このことは、データファイルから取り出したデータ項目により、以降では不要であることが判断が可能である。このように判断されたデータ項目の情報を削除し、抽出済み一覧155のデータ量を削減し、以降のステップ323の処理で比較対象とする抽出済み一覧155の件数を削減する。例えば、図7に示すような構造の場合、項目3の値をデータファイルより取得し、その後項目2の値を取得した場合、計算式の算出に項目3の情報は不要である。よって、抽出済み一覧155では、不要となる項目3の情報を削除して項目2の情報を追加する。また、抽出済み一覧155とともに値1004を管理することで、不要となったデータ項目の値も削除ができることとなる。
図3の分岐の「抽出」の場合、まず、データファイルからデータ項目の値を抽出する(ステップ324)。この処理はステップ340と同様である。次にデータ抽出システム101は、抽出済み一覧155に取り出したデータ項目とその値の情報を記録する(ステップ325)。記録の内容はステップ341と同様である。ステップ324の終了後、データ抽出システム101はステップ321へ戻る。
以上により、データ抽出システム101はデータファイルから、計算に必要となる可能性のあるデータの値を抽出することを完了したこととなる。データ抽出システム101はステップ321において、データファイルの終端に達した後、実際に計算式の計算の実行を行う(ステップ352)。なお、計算の実行はデータ抽出システム101が行っても、他のシステムが行ってもよい。他のシステムが行う場合、データ抽出システム101は入出力装置110により他のシステムへ、抽出済み一覧155の項目1001と値1004の情報を送信する。また、データ抽出システム101は、ステップ321においてデータファイルの終端に達する前でも、ステップ325、ステップ341において、データファイルから項目の値を取り出した場合に、その項目の情報が得られたことで計算可能になった計算式を順次計算してもよい。
計算式の計算は、次のように行う(ステップ352)。複数の依存関係のあるデータ項目について、その一部のデータ項目の値が得られている場合の計算は、例えば図7で項目3と項目4と項目7の値が得られている場合、項目3と項目4から項目2の値を算出し、これにより項目2と項目7の値から計算式1の計算を実行することにより行う。これはデータファイルから値が得られる都度、その値が得られた項目について図7の上位の項目の算出が可能であれば行い、また、算出したことによりさらにその上位の項目が算出可能である場合には算出することを、図7の内容を表すツリー構造データ951で上位に辿りながら繰り返すものである。または、データファイルの全てのデータ項目を抽出後(ステップ352)、抽出済み一覧155に集められた項目1001と値1004により、行ってもよい。具体的には次のように行う。
ステップ325 またはステップ341で新たに抽出済み一覧155に記録した項目1001と値1004について、ツリー構造データ951の子項目902が項目1001と一致するレコードの値903に記録する。次に、記録したツリー構造データ951のレコードの親項目901を取得する(この親項目901を上位項目とする)。次に、上位項目の値が他のレコードの親項目901と一致するレコードを選択する(複数ある場合は複数選択する)。次に、選択した(1つ以上の)レコードの値903の情報を取得する。これらは上位項目の下位の項目の値である。ここでいずれかのレコードで値903が空である場合は、当該上位項目の値はその時点では算出不可能であると判断する。全てのレコードで値903に値が格納されている場合には、この上位項目の値は算出可能であると判断し、この上位項目の値を算出する(例えば足し合わせる)。そして、上位項目がツリー構造データ951の子項目902となっているレコードを特定し、その値903に算出した値を記録する。
なお、ステップ321でデータファイルの読み込みを終了後に計算の実行を行う場合には、上位項目の下位の項目値が全て得られない場合でも、それらの項目から上位項目を導出する条件によっては上位項目の値を導出してもよい。例えば、上位項目が下位の項目を加算したものであるときは、値が得られなかった項目は無視し(0として扱う)、その他の項目のみの加算を行う。また、この上位項目の値を算出した場合は、ツリー構造データ951のさらに上位項目の値の算出を繰り返す。これは新たに値903に記録したレコードの親項目901を前記の上位項目として同様の処理を行う。また、処理の中でツリー構造データ951から選択した上位項目が計算式であった場合で、その上位項目が算出可能であると判断できた場合には、データ抽出システム101は、計算式152を実行してその結果の算出を行う。
以上説明した処理により、基本的な場合について、データ抽出システム101はデータファイルから計算式152の計算に必要なデータの抽出、計算を実行したこととなる。この処理の仕組みについて、一部の処理を効率化するため、またツリー構造データ951の構造がツリーとならないような複雑な場合に対応するための、図3の処理フローの処理の別パターンについて示す。まず、図3のステップ323において、取り出したデータ項目と抽出済み一覧155の比較を行った。このとき、抽出済み一覧の件数が多い場合に処理に時間がかかる可能性がある。そこで、抽出済み一覧155をソートする方法と、抽出済み一覧155を統合する方法について示す。
抽出済み一覧155をソートする方法について示す。ステップ301で示した依存情報153の作成方法による、範囲ラベル(前置順、後置順)の付与方法を示した。一般に2つの項目α、βについて、範囲ラベルではαの前置順<βの前置順でありかつ、αの後置順>βの後置順であれば、αはβの上位にあると判断できる。このような前置順、後置順のラベル付けの方法は複数存在するが、ステップ301で示したラベル付けの方法は、一つのカウンタを更新(1を加算)しながら前置順、後置順を付与するものである。よって、一つの項目について見れば、前置順は後置順よりも必ず小さくなっている。そのため、αがβの上位にあるならば、αの前置順<βの前置順<βの後置順<αの後置順の関係が成りたつ。
逆に、βがαの上位にあるならば、βの前置順<αの前置順<αの後置順<βの後置順の関係が成りたつ。よって、抽出済み一覧155を前置順1002でソートした場合、あるレコードαについて、そのレコード以降ではαの下位のレコード、上位でも下位でもないレコードは存在しても、上位となる項目のレコードは存在しない。また、その下位となる可能性のあるレコードβについて、βの前置順<βの後置順<αの後置順となり、αの後置順より大きな前置順の項目は、αの下位とはならない。つまり、抽出済み一覧155を順にチェックしていき、データファイルから取り出した項目の前置順が、抽出済み一覧155の後置順1003より大きい場合、抽出済み一覧155の以降のレコードで、データファイルから取り出した項目の上位または下位となる項目は存在しないことが確定することとで、抽出済み一覧155のチェックを終了することができ、抽出済み一覧155の全体をチェックする場合に比較して短時間で処理を完了させることができる。このために、ステップ325、ステップ341で抽出済み一覧155にデータを登録する際に、前置順でソートした状態で格納するものとする。なお、ソートした状態で格納する場合でも、ステップ323において抽出済み一覧155を小さいほうから順次チェックしているため、その挿入位置を決定することが容易に可能である。
次に、抽出済み一覧155を統合する方法について示す。抽出済み一覧155は、図3の処理を行うなかで、徐々にデータ件数が増えていくことが想定される。このデータ件数の増加を抑えるために、依存情報153の管理内容と、記録方法を変更する。まず、依存情報153について、図6に示すものに代わり、図11の依存情報1151に示すように項目1101、前置順1102、後置順1103からなるデータを用いる。項目1101、前置順1102、後置順1103は図6の項目601、前置順602、後置順603と同様であるが、前置順、後置順の作成方法が異なる。図11は図7に示す構造を表した状態を例として示している。この図11の情報の模式図を図12に示す。図12は、図11の前置順1102、後置順1103を、前置順1102の値から後置順1103の値までの数値の範囲としたときに、各項目が占める範囲を図示するものである。このように、上位の項目は下位の項目よりも広い範囲を占める(上位が下位よりも広い範囲を占めるのは、図6でも同様である)。また、図8で示したラベル付けの方法では、カウンタを+1ずつ更新しているため、ある項目の両端(前置順と後置順)は、他の項目の両端とは同じ数値とならないが、図11、図12の例では同じ数値となる場合がある。このようなラベル付けをすることで、隣接する項目の把握を容易とし、隣接する項目が抽出済み一覧155に登録された場合には、それらの情報を統合する。
まず、図11に示すようなラベルの付与方法について示す。これは図8で示したラベル付け方法において、カウンタの更新タイミングを変更するものである。具体的には、ステップ804の最後、ステップ806の最後にカウンタを更新(1を加算)していたものを、ステップ805において子の項目に対するラベル付けを行う場合に、子の項目が0個の場合、もしくは1つの場合で子の項目のラベル付けが終了した場合にカウンタを更新(1を加算)するものである。これにより、図7に示すような構造において、ツリーの葉(末端の項目)については前置順と後置順が1だけ異なり、その他の項目ではその項目の下位の葉の項目の数だけ異なることとなる(ただし、項目に子が1つのみの場合は、親の後置順は子の後置順より1だけ大きくなる。これは子が1つの項目とその子の項目について、範囲ラベルに差をつけて依存関係を把握できるようにするためである)。以上の処理により、依存情報1151の作成が完了する。
次に、この依存情報1151を用いた場合の抽出済み一覧155のデータ構造を図13に示す。図13の抽出済み一覧1351の項目1301、前置順1302、後置順1303、値1304は図10の抽出済み一覧155と同様であるが、一つの前置順1302、後置順1303に対して複数組の項目1301、値1304を記録可能とする。
次に、この依存情報1151を用いたデータ抽出処理システム101の処理について示す。具体的には、図3のステップ323の変更と、ステップ325とステップ341の後への処理の追加である。まずステップ323では前置順、後置順の比較の条件を「より大きい」「より小さい」を用いていたが、これを「より大きいか等しい」「より小さいか等しい」とする。等しいことを条件に加えるのは、前置順、後置順が図8に示したように異なる階層の項目が、前置順や後置順で同じ値を持つ場合があるためである。
具体的には、データファイルから取り出したデータ項目の前置順が抽出済み一覧1351の前置順より大きいか等しく、かつ、データファイルから取り出したデータ項目の後置順が抽出済み一覧1351の後置順より小さいか等しい場合、取り出したデータ項目は抽出済み一覧155内の比較を行ったレコードの項目1001の下位であることが判断する(図3の分岐の「廃棄」へ)。
また、データファイルから取り出したデータ項目の前置順が抽出済み一覧1351の前置順より小さいか等しく、かつ、データファイルから取り出したデータ項目の後置順が抽出済み一覧1351の後置順より大きいか等しい場合、取り出したデータ項目は抽出済み一覧1351内の比較を行ったレコードの項目1001の上位であることが判断する(図3の分岐の「置換」へ)。
また、ステップ325、ステップ341で抽出済み一覧155(この場合では抽出済み一覧1351)にデータを追加(または置換)した後、登録したレコードと、既存のレコードと統合できるものがある場合にはそれらのレコードを統合して記録する。具体的には、抽出済み一覧1351に登録した項目をαとした場合、抽出済み一覧1351のレコード(βとする)について、αの前置順≦βの前置順≦αの後置順≦βの後置順となるか、βの前置順≦αの前置順≦βの後置順≦αの後置順となるβがあった場合に、αとβの範囲ラベルが統合するように更新する。これは例えば、図7の項目4と項目8の情報がデータファイルから得られた場合に、抽出済み一覧でそれらの情報を統合することである。項目4と項目8は、図12に示すように範囲ラベルが連続しており、数値の範囲として統合することができる。また、さらにその後に、項目7の情報がデータファイルから得られた場合にも、抽出済み一覧1351で情報を統合する。統合する場合、αの前置順とβの前置順1302の小さいほうを新たな前置順1302とし、αの後置順とβの後置順1303の大きいほうを新たな後置順1303とする。項目1301、値1304はα、βの両方のものを記録する。
以上、図3で示した処理について、一部の処理を効率化する仕組みとして、抽出済み一覧155をソートする方法と、抽出済み一覧155を統合する方法を示した。次に、ツリー構造データ951がツリーとならないような場合への対応について示す。
これまでの説明においては、範囲ラベルを用いて抽出済み一覧155と、データファイルから取り出したデータ項目の依存関係をチェックする処理の前提となる依存情報153は、ツリー構造データ951が計算式をルートとするツリーの場合にのみ、図8に示した深さ優先探索による範囲ラベルを付与することができる。すなわち、構造情報151および計算式152が単純な場合、具体的には計算式152が一つのみで、ツリー構造データ951(図7に表すような構造の情報を保持する)が計算式をルートとするツリーになる場合のみに適用することができる。
例えば構造情報151がツリーとなっていない場合や、計算式が複数ある場合には、ツリー構造データ951を図7のように表してもツリーとはならない。このようにツリー構造データ951がツリーとならない場合については、ツリー構造データ951の内容を修正しツリー構造とするか、ツリー構造以外でも対応できるラベル付けを行う必要がある。以下、その方法として、ルートを追加する方法、リンクを切断する方法、ラベルを拡張する方法を示す。なお、ツリー構造データ951の情報は、計算式の計算実行においても用いるため、ラベル付けのためのデータとして、ラベル用データ156を用いるものとする。ラベル用データ156の構成はツリー構造データ951と同様に親項目901、子項目902を持ち、初期値としてはツリー構造データ951と同じ内容とする(ラベル用データ156は値903は持たない)。
次に、ルートを追加する方法について述べる。計算式が複数ある場合、ラベル用データ156はツリーとならない。これは、計算式は他のどの項目よりも上位にあり、また、計算式は依存関係が無いため、ツリーのルートが1つに定まらないためである。このような場合には、それぞれの計算式の上位に、1つの仮想的な項目を加えて、その項目をルートとすることでツリーとする。例えば、ラベル用データ156が図14の左側のような模式図1501の内容を表している場合、計算式が複数あるために図が2つに分かれ、全体としてツリーとなっていない。このような場合、図14の右側の図の模式図1502の項目0のように、上位にノードを加えれば、全体をツリーとすることができる。
この処理は、より具体的には、次のように行う。ラベル用データ156の全てのレコードについて、親項目901に現れる項目または計算式を取り出し、それらのうち、ツリー構造データ951の他のいずれかのレコードの子項目902に現れない項目または計算式を抽出する(ルート候補とする)。これらの項目または計算式が複数あった場合、それぞれについてラベル用データ156に新たにレコードを追加し、親項目901は他の項目と区別できる符号を記録し、子項目902には抽出した項目または計算式を記録する。
以上の処理により、図14の左側の図のような場合には、全体をツリーに変換することが可能となり、深さ優先探索でのラベル付けが可能となる。なお、この方法が利用できるのは、ラベル用データ156が計算式ごとに複数のツリーに分かれている場合である。これは複数あるルート候補から、ラベル用データ156を下位に辿った場合に、同一の項目または計算式が現れないことにより確認する(ルート候補からラベル用データ156の子項目902を特定し、その子項目902が他のレコードの親項目901となるレコードを特定する。これを再帰的に繰り返し、特定したレコードの子項目902となる項目に、重複がないことを確認する)。
次に、リンクを切断する方法について述べる。計算式が複数ある場合、それらの計算式が用いるデータ項目間に依存関係があると、ラベル用データ156がツリーとならない。例えば図15の左側に表すような場合(1501)、2つの計算式が依存関係を持つ項目1と項目5を用いるため、全体がツリーとならない。また、ルートの追加で示した方法を行っても、この例ではツリーとすることができない。(複数あるルート候補から、ラベル用データ156を下位に辿ると、項目5、項目6、項目7がそれぞれのルート候補の下位に共通して現れる。
このような場合、図15の右側(1502)に示すように、既存のリンクを1つ切断することで、共通に現れる項目をなくし、ルートの追加で示した方法で全体をツリーに変換できるようになる。これは、ラベル用データ156で必要な情報は、各データ項目と計算式の依存関係であるが、依存関係の全てが必要ではないことによる。例えば1502に示す例の項目5の値は、項目3の算出に必要であることを示すが、項目5は計算式2の算出に利用される。そのため、項目3の値がデータファイルから得られたとしても、項目5の値が必要であることには変わりが無い。図3に示したような方法で、データファイルから項目3の情報が得られた後は、その下位の項目5の情報をデータファイルから抽出しないこととしてはいけない。そこでこのような場合には、項目5から上位へのリンクを切断することで、図3の処理の整合性を確保し、かつ、ラベル用データ156をツリーに変換できるようになる。
また、ステップ322で、データファイルから取り出した項目がいずれの計算式152に影響を与えるかの判断を行ったが、これを正しく行うために、リンクの切断後、1つリンクを加える。これは図15の右側の1502における計算式2から計算式1へのリンクであり、このリンクにより、項目5、項目6、項目7が計算式1にも影響を与えることを表現する。(図15の右側に示すラベル用データ156では項目3と項目5のリンクを切断しているが、ツリー構造データ951としては、項目3を親項目901とするレコードの一つに子項目902が項目5であるレコードがある。そのため、ラベル用データ156でリンクを切断していてもステップ352で項目5から項目3を算出できる)
この処理は、より具体的には次のように行う。まず、複数ある計算式152を算出するために直接必要な項目の集合を計算式ごとに特定する。次にそれらの項目について、ラベル用データ156内での依存関係を確認する。ある計算式αの算出に必要な項目の集合(項目α1、α2・・・とする。これは例えば計算式がα1+α2+・・・等の場合)と、他の計算式βの算出に必要な項目の集合(項目β1、β2・・・とする)を特定する。このとき、α1、α2、・・・などαに必要な項目の全てが、ラベル用データ156において、βに必要な項目β1、β2、・・・のいずれか一つ(β0とする)の項目の下位にあり、かつ、α1、α2などがβ1、β2などのいずれの項目よりも上位にない場合にリンクの切断を行える。このとき、α1、α2、・・・の中で、もっともβ0に近いものから、β0へ向かうリンクを切断する。例えば図15の1501では、計算式2をα、計算式1をβとすると上記の条件が成立する。
この処理は、データ抽出システム101が次のように処理を行う。まず、計算式152のうち一つ(αとする)について、直接必要とする項目を特定する。次に、計算式152のうち別の一つ(βとする)について、直接必要とする項目を特定する。これらは、計算式152から、当該計算式を構成するデータ項目を特定する情報を抽出することによって行う。次に、βが直接必要とする項目から1つを選択し、ラベル用データ156内で当該項目が親項目901となっているレコードから下位に辿り(当該レコードの子項目902が他のレコードの親項目901となっているレコードを探す。これを再帰的に繰り返す)、子項目902にαが必要とする項目の全てが現れるか否かを確認する。現れない場合には、βが直接必要とする項目のうち他の項目を選択して同様に確認する。いずれのβが直接必要とする項目でも下位にαが必要とする項目の全てが現れない場合は、当該βとαの組み合わせではリンクの切断は不可能であると判断する。
現れた場合には、次にαが直接必要とする項目のうち一つを選択し、それがβが直接必要とする項目の上位に無いことを確認する(ラベル用データ156で、αが直接必要とする項目が子項目902となるレコードの親項目901、その親項目901が他のレコードの子項目902となるレコードを探す。これを再帰的に繰り返す)。これをαが直接必要とする項目の全てで確認し、βが直接必要とする項目が上位に無いことを確認する。αが直接必要とする項目のいずれか一つでも、上位にβが直接必要とする項目が無い場合には、当該βとαの組み合わせではリンクの切断は不可能であると判断する。このようにして複数ある計算式152から他のα、βの組み合わせについて同様に調べる。リンクの追加については、上記のαとβにおいて、αを子項目902、βを親項目901とするレコードを追加する。
上記のようにルートの追加、リンクの切断を行ってもラベル用データ156がツリーとならない場合がある。例えば図16の模式図1601に示すような場合、項目5が複数の親項目を持っているため、ルートの追加やリンクの切断ではツリーに変換することができない。そこでこのような場合には、図17の模式図1701と模式図1702のようにツリーを仮想的に2つに分割し、それぞれについてラベル付けを行うものとする。このように分割することで、ある項目と他の項目、またはある項目と計算式の依存関係は、図17のいずれかのツリーで上位または下位の関係にある場合、元の図16でも上位または下位の関係にあると判断できる。分割は、ラベル用データを複数個用意し、それぞれのラベル用データに、分割したツリーのそれぞれのデータを格納することによって行う。
なお、本実施例では、分割の対象は図16のように親項目を複数持つ項目が、1つのみか、複数ある場合でもそれらの項目同士に依存関係は無いものとする。(末端または末端に近い部分でのみ親項目を複数持つ項目があり、そのような項目の下位には親項目を複数持つ項目はない。)
このような図の分割は、次のように行う。まず、ツリー構造データ951の複数のレコードで子項目902が共通するレコードを抽出する(下位共通部分とする)。このレコード数だけのツリー(ラベル用データ)に分割することとなる。次に、子項目902が共通するレコードそれぞれから上位に辿る(親項目901が他のレコードの子項目902となるレコードを抽出する。これを再帰的に繰り返す)。このとき、子項目902が共通するレコードそれぞれから辿ったときに、共通して現れるレコード(上位共通部分とする)と、共通して現れないレコード(個別部分とする)を抽出する。上位共通部分、下位共通部分から下位に辿り(子項目902が他のレコードの親項目901となるレコードを特定する。これを再帰的に繰り返す)、現れるレコードを分割したラベル用データ156のそれぞれに加える。ただし、個別部分のレコードが現れた場合は、再帰的な処理を行わない。次に個別部分から下位に辿り(子項目902が他のレコードの親項目901となるレコードを特定する。これを再帰的に繰り返す)、現れるレコードをラベル用データのそれぞれ1つに加える。例えば図16では、上位共通部分はなく、下位共通部分は、項目5以下の部分である。ただし、共通部分のレコードが現れた場合は、再帰的な処理を行わない。個別部分は、計算式1から項目2、項目3、項目5につながるリンクの部分と、計算式1から項目6、項目7、項目5につながるリンクである。共通部分の下位は分割後もそれぞれの分割したグループに共通に属し、個別部分とその下位はグループの1つにのみ属する。
このようにすることで、ラベル用データ156を複数のツリー(複数のラベル用データ)に分割することができた。これら複数のツリーのそれぞれについて依存情報153を作成することで、項目や計算式間の依存関係は、いずれかのツリーの依存情報153で上位または下位にあると判断できれば、それらの項目や計算式は上位または下位にあると判断できる。よって、図3の処理においても、複数のツリーごとの依存情報153を管理することで処理を行うことが可能となる。また、抽出済み一覧155も、前置順1002、後置順1003を一組ではなく、それぞれのツリーごとに管理することで、データファイルから取り出したデータ項目と、抽出済み一覧との依存関係の確認も行える。
しかし、この場合、依存情報153においては、ツリーごとに前置順601、後置順602を管理することとなり、これらのデータ量が増加してしまう。このデータ量を抑えるために、依存情報153を図18に示す依存情報1851のような構成とする。依存情報1851は依存情報153と同様な構成だが、後置順が後置順ア1803と後置順イ1804の2つを持つ。これは、前置順601、後置順602をツリーごとに管理するのではなく、前置順については共有し、後置順のみツリーごとに管理するものである。前置順は複数のツリーで、その順序に矛盾が生じないような数値を各項目に付与する。ツリーが3つ以上の場合は後置順ア1803、後置順イ1804の2つではなく、これを3つ以上にする。以下、ツリーが2つの場合について示すが、3つ以上の場合も同様である。
依存情報1851のラベル付け方法について説明する。まず、複数のツリー(ラベル用データ)のうち一つについて、図8で示した方法によりラベル付けを行い、前置順1802、後置順ア1803に記録する。次に別のツリーについて、図8で示した方法と同様にラベル付けを行い、後置順については後置順イ1804にそのまま記録する。このとき、前置順1802については始めのツリーへのラベル付けと重複するため、これと矛盾がないようにラベル付けする。具体的には、ルートとなる項目に既に前置順1802が付与されている場合はその値を保持してカウンタをその値にする。その後、図8でカウンタを1ずつ加算していたが、この加算する数値を1またはより小さい数値として処理を行う。ラベル付けの深さ優先探索において、既に前置順1802が付されている項目があった場合には、そのときのカウンタが前置順1802より小さいか等しい場合は、カウンタをその前置順1802にして以降の処理を進める。カウンタが既にある前置順1802より大きい場合には、それまでの前置順と矛盾となってしまうため、2つ目ツリーにおけるラベルを一旦削除し、カウンタに加算する数値を小さくして(例えば半分にする)、2つ目のツリーのラベル付けをやり直す。3つ以上のツリーがある場合には同様に繰り返す。
なお、複数あるツリーについてラベル付けを行う順序によっては、上記により矛盾なく前置順を付与できない場合がある(カウンタを更新する値を小さくしても、ラベル付けができない)。この場合は複数あるツリーから、ラベル付けを行うツリーの順序を変えてやり直す。また、ツリー構造データ951について、ステップ805で参照すべき子項目902が複数ある場合には、このうちのどの子項目902について、先にラベル付けするかを変更してやり直す。以上の処理により、矛盾の無い前置順を付与できるまで処理を繰り返す。
図18の依存情報1851は、依存情報153と同様に項目、計算式間の依存関係を示すが、後置順が複数あるため、依存情報の確認は、後置順の比較を行う際に、比較対象の項目について、後置順ア1803または後置順イ1804の両方の値が揃っているものを使う。また、抽出済み一覧155についても後置順1003の欄を増やして、後置順ア、後置順イを記録できるようにし、ステップ323においてデータファイルから取り出した項目と抽出済み一覧とのチェックでは、データファイルから取り出した項目の後置順について依存情報1851から複数の後置順の情報を取得し、これと抽出済み一覧の複数の後置順をチェックする(後置順ア、後置順イで比較対象の両方で値があるものを用いる)。
データ項目間に他のデータ項目の値を算出可能であるというような依存関係があるデータファイルに対して、データファイルから抽出したい情報の計算式の計算に必要なデータ項目の値を効率よく特定することで、計算式の計算結果を効率よく得ることが可能となる。