まず、周知技術のBDD(Binary Decision Diagrams)法について説明する。このBDD法は、論理変数の入力順序(この入力順序が、論理変数の評価順序の優先順位となる)を定義することにより、検索クエリに含まれる論理式を2分木で表現し、評価する手法である。図1は、周知技術のBDD法を説明するための図である。
例えば、論理式「a and b or c and d」をそのまま2分木で表現すると、2分木20のように表現することが出来る。図1に示すように、この2分木20は、論理式の論理変数「a〜d」に対応するノード「A〜D」によって構成されている。なお、2分木20は、レベルテーブル20aおよび遷移テーブル20bによって定義される。
レベルテーブル20aは、各ノードのレベルと、ノードに対応する論理変数を管理するテーブルである。例えば、ノードテーブル20aの1段目では、ノード「D」のレベルが「0」であり、ノード「D」に対応する論理変数が「d」である旨の情報が登録されている。そして、各ノードに割り当てられたレベルが、すなわち、入力順序となっている。
遷移テーブル20bは、各ノードの論理値と、論理値に対応したノードの遷移先を管理するテーブルである。例えば、遷移テーブル20bの1段目では、ノード「D」の論理値が「0」である場合に、ノード「B」に遷移する旨の情報が登録されている。
そして、論理変数a〜dの論理値が、論理値テーブル10aのように既に計算されているものとすれば、文書ID「0」の各論理変数の論理値は、「a=0 b=1 c=0 d=1」なので、2分木20より、文書ID「0」の文書データに対する論理式の評価結果は「0(偽)」となる。一方、文書ID「1」の各論理変数の論理値は、「a=1 b=1 c=1 d=0」なので、2分木20より、文書ID「1」の文書データに対する論理式の評価結果は「1(真)」となる。
しかしながら、従来の技術では、図1に示したように、予め、全ての論理変数の論理値を計算しておく必要があり、論理値の計算コストが高い場合(論理値が「1」か「0」かを計算する時間が所定時間以上となる場合)には、処理時間が大きくなるという問題があった。また、従来の技術では、論理変数のレベルを決定する際に、各論理変数の計算コストを考慮してこなかった。上述した特許文献1も、ノードの数を減らすことしか言及しておらず、最終的に残ったノードの入力順序を各論理変数の計算コストを考慮して決定してはいない。
更に、計算コストを考慮しないノードの入力順序では、例えば、次のような問題が起きてしまう。図1を参照すると、ノードCは入力順序ではノードDに続く第二番目の順序となっている。そして、ノードCの計算コストが他のノードよりも非常に大きいとする。このような条件でも、検索対象となる全ての文書について必ずノードCを評価しなければならない場合は、計算コストの観点から見れば全体的な処理コストはどのような入力順序でもあまり影響ないかもしれない。しかし、図1の場合、文書ID「1」のように論理値が、「a=1 b=1 c=1 d=0」となる場合には、ノードCを通過していないので、ノードCの論理変数を利用しておらず、論理変数「c」の論理値の計算時間が無駄となっている。そして、このようにノードCの論理変数を利用しない文書が多数ある場合は、ノードCにかけた計算時間の無駄は無視できなくなってしまう。だから、ノードCの入力順序を極力後方へもってくる方が望ましい。そうすることで、ノードCを評価する以前の段階で、最終的な真偽決定が決定されノードCの計算処理が不要となるケースを増やすことができる。
次に、本実施例1にかかる検索装置の概要および特徴について説明する。図2は、本実施例にかかる検索装置の概要および特徴を説明するための図である。本実施例1にかかる検索装置は、検索クエリの論理式に含まれる各論理変数の論理値を計算するための計算時間を予測することで、計算コストの大きい論理変数(以下、第1論理変数)と計算コストの少ない論理変数(以下、第2論理変数)とを判定し、第2論理変数が第1論理変数の前になるように、検索クエリに含まれる論理変数の順序を変換し、変換した検索クエリに基づいて、計算コストの少ない論理変数を含む部分から先に評価する。
また、本実施例1にかかる検索装置は、計算コストの少ない第2論理変数の論理値のみを予め算出しておき、検索クエリの評価の過程で必要になった場合にはじめて、該当する第1論理変数の論理値を算出する。
例えば、検索装置は、図2に示すように、検索クエリの論理式「A and B or(C and D or E)and (F or G and H)」を評価する場合に、各論理変数A〜Hの論理値を計算するための時間を予測することで、各論理変数A〜Hが第1論理変数か第2論理変数かを判定する。
検索装置は、過去の経験則、あるいは論理変数の論理値が真であるか否かを判定するための条件式の種別に基づいて、論理変数A〜Hが第1論理変数か第2論理変数かを判定する。ここでは一例として、論理変数A,Cが第1論理変数に属し、その他の論理変数B,D,E,F,G,Hが第2論理変数に属するものとする。
そして、検索装置は、逆ポーランド表記などを用いることにより、変換前の検索クエリと、変換後の検索クエリとの関係を等価(変換前の検索クエリと変換後の検索クエリとの評価結果が等価)に保った状態で、第2論理変数が第1論理変数の前になるように、検索クエリに含まれる論理変数の順序を変換する。図2に示す例では、検索クエリの論理変数の順序を「B,A,D,C,E,F,G,H」から「H,G,F,E,D,C,B,A」に変換している。
図2の2分木30は、変換前の検索クエリの2分木を表し、2分木40は、変換後の検索クエリの2分木を示している。ここで、2分木30と2分木40とを比較すると、2分木30では、ノードBの論理値が「1」というだけで、計算コストの大きいノードAの論理値が必要となるが、2分木40では、ノードBの論理値が「1」だとしても、論理変数H,G,F,E,D次第で、計算コストの大きな論理値A,Cを評価しなくて済む。
このように、本実施例にかかる検索装置は、各論理変数の計算コストに基づいて、第2論理変数が第1論理変数の前になるように、検索クエリに含まれる論理変数の順序を変更することで、第1論理変数の論理値を評価する機会を減らし、必要な場合にのみ、第1論理変数の論理値を算出するので、検索クエリの評価時における計算処理負荷を軽減させることができ、検索処理を高速化することが出来る。
次に、本実施例にかかる検索装置を備えた検索システムの構成について説明する。図3は、本実施例にかかる検索システムの構成を示す図である。同図に示すように、この検索システムは、端末装置60と検索装置100とをネットワーク50で接続して構成される。
端末装置60は、入力装置(図示略)を介して利用者等から検索クエリを入力された場合に、検索クエリを検索装置に送信し、検索装置100からの検索結果を出力装置(図示略)に出力する装置である。
検索装置100は、端末装置60から検索クエリを受信した場合に、検索クエリを評価し、XMLデータから該当するデータを検索して検索結果を端末装置60に送信する装置である。以下において、本実施例3にかかる検索装置100の構成を具体的に説明する。
図4は、本実施例にかかる検索装置100の構成を示す機能ブロック図である。同図に示すように、この検索装置100は、入力部110と、出力部120と、通信制御IF部130と、入出力制御IF部140と、記憶部150と、制御部160とを備えて構成される。
入力部110は、各種の情報を入力する入力手段であり、例えば、キーボードやマウス、マイクなどによって構成される。なお、後述するモニタ(出力部120)も、マウスと協働してポインティングデバイス機能を実現する。
出力部120は、各種の情報を出力する出力手段であり、モニタ(若しくはディスプレイ、タッチパネル)やスピーカなどによって構成される。通信制御IF部130は、主に端末装置60との間における通信を制御する手段である。なお、入出力制御IF部140は、入力部110、出力部120、通信制御IF部130、記憶部150、制御部160によるデータの入出力を制御する手段である。
記憶部150は、制御部160による各種処理に必要なデータおよびプログラムを記憶する記憶手段であり、特に本発明に密接に関連するものとしては、XMLデータ150aと、検索クエリ150bと、分解検索クエリ150cと、計算量見積テーブル150dと、計算量テーブル150eと、抽出結果テーブル150fと、論理値テーブル150gと、変換論理式データ150hと、論理式判定ダイアグラムデータ150iと、評価結果テーブル150jと、検索結果データ150kとを備える。
ここで、XMLデータ150aは、要素識別子「<」、「</」等により要素が区切られた階層構造を有する文書データである。図5は、XMLデータ150aのデータ構造の一例を示す図である。なお、同図に示す例では、「/busyo」で表される要素が3種類あるので、説明の便宜上、「name」要素に「第一開発部」、「ID」要素に「2222」を有する「/busyo」の要素を第1要素、「name」要素に「第一研究部」、「ID」要素に「3333」を有する「/busyo」の要素を第2要素、「name」要素に「第三開発部」、「ID」要素に「1223」を有する「/busyo」の要素を第3要素とする。
検索クエリ150bは、XMLデータ150aから照合位置のデータを取り出すためのデータである。図6は、検索クエリ150bのデータ構造の一例を示す図である。同図に示す検索クエリは、「/busyo」で表される各要素のうち、「name」の要素に「開発部」を含み、かつ「ID」の要素に「"1.*3"」(先頭の数字が1、末尾の数字が3となる数列)を含む要素を選択し、選択した要素の「name」に登録された文書データを検索対象として指定する検索クエリである。
例えば、図5に示したXMLデータ150aに対して、図6に示した検索クエリ150bが指定された場合には、第3要素、すなわち、「name」の要素に「第三開発部」、「ID」の要素に「1223」を有する「/busyo」の要素が検索クエリ150bの条件を満たすので、かかる第3要素の「name」に登録された文書データ「第三開発部」が検索対象のデータとなる。
分解検索クエリ150cは、検索クエリ150bが検索クエリ分解部160a(後述する)によって分解された結果得られるデータである。図7は、分解検索クエリ150cのデータ構造の一例を示す図である。
同図に示すように、この分解検索クエリ150cは、検索クエリ(図6参照)を論理変数および論理演算子で表した論理式「Q=q1 and q2」と、各論理変数q1,q2の評価式「q1./busyo/name="開発部"」、「q2./busyo/ID=="1.*3"」と、検索結果を送信する際の定義式「Return /bunsyo/name/test()」を有する。
ここで、論理変数q1,q2には、評価式の評価結果に応じて、「1(真)」または「0(偽)」の論理値が算出される。例えば、q1の評価式「q1./busyo/name="開発部"」によって第1要素を評価すると、「name」の要素に、開発部が含まれるので、評価結果は「1」となる。一方、q2の評価式「q2./busyo/ID=="1.*3"」によって第1要素を評価すると、「ID」の要素に、該当文書データが含まれないので、評価結果(論理値)は「0」となる。
計算量見積テーブル150dは、論理変数の論理値を評価する評価式の計算コストを管理するテーブルである。図8は、計算量見積テーブル150dのデータ構造の一例を示す図である。同図に示すように、この計算量見積テーブル150dは、評価式種別と、計算コストとを対応付けて記憶しており、例えば、評価式種別は、単純検索、正規表現、数値演算、日時計算、近傍検索を有する。また、各評価式種別に対応する計算コストの値は、管理者の経験により適宜設定・更新される。
ここで、単純検索に分類される評価式は、所定の文書データが、検索対象の要素に含まれているか否かを判定する評価式である。例えば、図7の評価式q1が単純検索の評価式に該当する。
正規表現に分類される評価式は、各種の複雑な処理を要する評価式である。数値演算に分類される評価式は、比較や四則演算、複雑な関数などを含む(単なる一致判定は含まない)評価式である。たとえば、図7の評価式q2が数値演算に該当する。
日時計算に分類される評価式は、2008年1月以降以前などのように、様々なフォーマットに対応しながら判定が必要となる評価式である。近傍検索に分類される評価式は、「情報」と「統合」の間が5文字以内などのように、文字間隔等を数える必要がある評価式である。
計算量テーブル150eは、評価式に対応する計算コストを管理するテーブルである。図9は、計算量テーブル150eのデータ構造の一例を示す図である。同図に示すように、この計算量テーブル150eは、論理式識別情報と、計算コストとを対応付けて記憶している。ここでは、評価式「q1」の計算コストが「1」、評価式「q2」の計算コストが「100」となっている。
抽出結果テーブル150fは、評価式の評価対象となる情報と、検索クエリ150bの評価結果が真であった場合に、端末装置60に返答する項目を管理するテーブルである。図10は、抽出結果テーブル150fのデータ構造の一例である。同図に示すように、この抽出結果テーブル150fは、データ種別と、第1論理変数情報と、第2論理変数情報と、返答項目とを有する。なお、データ種別「Data0〜2」は、図5に示した、第1〜3要素の情報にそれぞれ対応する。
例えば、図10の1段目では、データ種別「Data0」の第1論理変数情報(ここでは、評価式q1の文書「開発部」が存在しているか否かを示す情報)が「○(存在している)」、第2論理変数情報(ここでは、評価式q2の比較対象となる情報)が「2222」、返答項目が「第一開発部」となっている。
論理値テーブル150gは、各評価式の評価結果(初期段階では、計算コストの大きい論理変数の評価結果を除く)を管理するテーブルである。図11は、論理値テーブル150gのデータ構造の一例を示す図である。同図に示すように、この論理値テーブル150gは、データ種別と、第1論理値と、第2論理値とを有する。
ここで、第1論理値は、評価式(例えば、評価式q1)による第1論理変数の評価結果であり、第2論理値は、評価式(例えば、評価式q2)による第1論理変数の評価結果である。なお、図11に示す論理値テーブル150gは、第2論理変数の計算コストが大きい場合の論理値テーブルであるため、初期段階では、計算コストの大きい第2論理値は未評価となっている。
ただし、データ種別「Data0」および「Data2」に対応する第2論理値は、検索クエリ150bの論理式(図7参照)を評価する場合に、第2論理値の値が必要となるので、必要となった時点で、評価式q2によって論理値を求める。一方、データ種別「Data1」に対応する第2論理値は、第1論理値が「0」であるため、検索クエリの論理式より、第2論理値の値によらず、評価結果が「0」となる(第2論理値の論理値を算出しなくて良い)。
変換論理式データ150hは、論理式(図7参照)が、論理式変換部160e(後述する)によって変換されたデータである。論理式判定ダイアグラムデータ150iは、ダイアグラム生成部160f(後述する)によって生成されるデータである。
図12は、論理式判定ダイアグラムデータ150iのデータ構造の一例を示す図である。同図に示すように、この論理式判定ダイアグラムデータ150iは、レベルテーブル151、遷移テーブル152を有する。
レベルテーブル151は、各ノードのレベルと、ノードに対応する論理変数を管理するテーブルである。例えば、ノードテーブル151の1段目では、ノード「q1」のレベルが「0」であり、ノード「q1」に対応する論理変数が「q1」である旨の情報が登録されている。なお、レベルテーブル151において、レベル「2」のノードが最終レベルのノードとなり、ノード「0」あるいはノード「1」が、検索クエリ150bの評価結果となる。
遷移テーブル152は、各ノードの論理値と、論理値に対応したノードの遷移先を管理するテーブルである。例えば、遷移テーブル152の1段目では、ノード「q1」の論理値が「0」である場合に、ノード「0」に遷移する旨の情報が登録されている。なお、図12に示すレベルテーブル151および遷移テーブル152によって、図12の下段に示す2分木が定義される。
評価結果テーブル150jは、各データ種別(例えば、Data0〜2)に対する評価結果を管理するテーブルである。図13は、評価結果テーブル150jのデータ構造の一例を示す図である。同図に示すように、この評価結果テーブル150jは、データ種別と評価結果とを対応付けて記憶している。
例えば、図13の1段目では、データ種別「Data0」に対する論理式の評価結果が「0(偽)」である旨の情報が登録されている。なお、図13の3段目では、データ種別「Data2」に対する論理式の評価結果が「1(真)」である旨の情報が登録されている。
検索結果データ150kは、XMLデータ150aに対する検索クエリ150bの検索結果を記憶するデータである。この検索結果データは、評価結果テーブル150j(図13参照)の評価結果が「1」となるデータ種別の返答項目が記憶される。図13を参照すると、この場合は、データ種別「Data2」の評価結果が「1」となっているので、データ種別「Data2」の返答項目(図10参照)が、検索結果データ150kに記憶される。図14は、検索結果データ150kのデータ構造の一例を示す図である。
図4の説明に戻ると、制御部160は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する制御手段であり、特に本発明に密接に関連するものとしては、図4に示すように、検索クエリ分解部160aと、計算量見積部160bと、抽出結果テーブル生成部160cと、論理値算出部160dと、論理式変換部160eと、ダイアグラム生成部160fと、ダイアグラム実行部160gと、検索結果出力部160hとを備える。
このうち、検索クエリ分解部160aは、端末装置60から検索クエリを受信した場合に、受信した検索クエリを検索クエリ150bとして記憶部150に記憶すると共に、周知の手法を用いて、検索クエリ150b(図6参照)から分解検索クエリ150c(図7参照)を生成する手段である。
計算量見積部160bは、分解検索クエリ150cに含まれる各評価式(図7に示す例では、評価式q1,q2)の計算コストを判定し、計算量テーブル150e(図9参照)を生成する処理部である。具体的に、計算量見積部160bは、分解検索クエリ150cの評価式と、計算量見積テーブル150d(図8参照)とを比較することにより、評価式の計算コストを判定する。
抽出結果テーブル生成部160cは、分解検索クエリ150cに含まれる評価式に基づいて、第1〜n(n>1)論理変数および返答項目をXMLデータ150a(図5参照)から抽出し、抽出結果テーブル150fを生成する手段である。
例えば、抽出結果テーブル生成部160cは、評価式が「/busyo/name="開発部"」である場合には、「busyo」要素を親とする「name」要素に「開発部」が含まれているか否かを判定し、含まれている場合には、「○」を抽出結果テーブル150fに登録し、含まれていない場合には、「×」を抽出結果テーブル150fに登録する。
また、抽出結果テーブル生成部160cは、評価式が「/busyo/ID=="1.*3"」である場合には、「busyo」要素を親とする「ID」要素に含まれる数列をXMLデータ150aから抽出し、抽出結果テーブル150fに登録する。
論理値算出部160dは、計算コストに基づいて検索クエリ150bの各論理変数を第1論理変数あるいは第2論理変数に属するのかを判定すると共に、第2論理変数に属する論理変数の論理値のみを算出して(評価式を評価して)、論理値テーブル150g(図11参照)を生成する手段である。
具体的に、論理値算出部160dは、計算コストが100以上となる論理変数を第1論理変数に属すると判定し、計算コストが100未満となる論理変数を第2論理変数に属すると判定する。例えば、図9に示すように、論理変数q1の計算コストが「1」、論理変数q2の計算コストが「100」に設定されている場合には、論理値算出部160dは、論理変数q1を第2論理変数と判定し、論理変数q2を第1論理変数と判定する。
そして、論理値算出部160dは、第2論理変数の評価式と、抽出結果テーブル150f(図10参照)とを比較することにより、論理値を算出する。なお、論理変数q1の評価式の種別は、単純検索に属しているため、抽出結果テーブル150fの「○」が「1(真)」に対応し、「×」が「0(偽)」に対応する。
一方、論理値算出部160dは、初期の段階で、第1論理変数の論理値を算出しない。論理値算出部160dは、ダイアグラム実行部160g(後述する)からの要求に応じて、該当する第2論理変数の論理値を算出する。
論理式変換部160eは、逆ポーランド記法を用いることにより、変換前の検索クエリと、変換後の検索クエリとの関係を等価に保った状態で、第2論理変数が第1論理変数の前になるように、検索クエリの論理式に含まれる論理変数の順序を変換する手段である。論理式変換部160eは、変換後の論理式を変換論理式データ150hとして記憶部150に記憶する。
逆ポーランド記法は、括弧が不要なので、コンピュータが単純なスタック構造を構築するだけで演算が出来るという特徴があり、論理式変換部160eが逆ポーランド記法を用いることで、論理式変換にかかる処理負荷を軽減させることが出来る。
図15は、論理式変換部160eの処理を説明するための図である。なお、ここでは説明の便宜上、変換前の検索クエリの論理式を「(A&B)|(〜((〜D&C)|E)&((H&G)|F))」とする。ここで、A〜Fは、論理式の論理変数を示し、論理変数A,Cが第1論理変数に属し、論理変数B、D〜Fが第2論理変数に属しているものとする。なお、上記論理式中の「&」は論理積、「|」は論理和、「〜」は否定を示す。
まず、論理式変換部160eは、論理式を逆ポーランド表記する。例えば、論理式「(A&B)|(〜((〜D&C)|E)&((H&G)|F))」を逆ポーランド表記すると「AB&D〜C&E|〜HG&F|&|」となる。
そして、論理式変換部160eは、逆ポーランド表記した論理式の先頭(図15に示す例では、論理変数A)から、論理変数および演算子を順次読み出し、各種の処理を実行する。ここで、論理式変換部160eが論理変数を取り出した場合の処理、および演算子を読み出した場合の処理について説明する。
(論理変数を読み出した場合の処理)
論理式変換部160eが論理変数を読み出した場合には、論理変数をスタック(一時記憶部<スタック>に論理変数を登録する。かかる一時記憶部に一番最後に登録された論理変数が、一番最初に取り出される。)すると共に、論理変数に対応する評価関数値を対応付けて記憶する。なお、各論理変数に対する評価関数値は、論理変数が、第1論理変数に属する場合には「1」、第2論理変数に属する場合には「0」となる。この評価関数値は、論理式を並びかえる場合の指標となる値である。
(演算子を読み出した場合の処理)
論理式変数部160eが演算子を読み出した場合には、スタックをポップし第1項とし、さらに、スタックをポップ(スタックに登録された論理変数のうち、一番最後に登録されたものを取り出す)し第2項とする。そして、第1項を先に第2項を後に並べた場合の評価関数値(以下、第1評価関数値)と、第2項を先に第1項を後に並べた場合の評価関数値(第2評価関数値)とをそれぞれ算出する。
論理式変換部160eは、第1評価関数値と第2評価関数値とを比較して、第1評価関数値が第2評価関数値よりも小さい場合には、第1項を先に第2項を後ろに並べたものの後ろに演算子を加え、スタックする。
一方、論理式変換部160eは、第2評価関数値が第1論理関数値よりも小さい場合には、第2項を先に第1項を後ろに並べたものの後ろに演算子を加え、スタックする。なお、第1評価関数値と第2評価関数値とが等しい場合には、予め、管理者に設定された順序に各項を並べ、並べたものの後ろに演算子を加え、スタックする。
ここで、逆ポーランド表記Xから論理変数だけを取り出した列をx
n−1・・・x
0として、評価関数値を算出するための評価関数e(X)を定義すると、
となる。ただし、x
iが第1論理変数に属する場合には、f(x
i)=1となり、x
iが第2論理変数に属する場合には、f(x
i)=0となる。
例えば、逆ポーランド表記の論理式「AB〜C&|〜」から、論理変数だけを取り出した列を、「A,B,C」とし、論理変数A,Cが第1論理変数、論理変数Bが第2論理変数に属する場合には、
e(AB〜C&|〜)=22×f(A)+21×f(B)+20×f(C)
=4×1+2×0+1×1
=5
となる。
次に、論理式変換部160eが逆ポーランド記法された論理式を変換する処理を具体的に説明する(ここでは、変換対象の論理式「AB&D〜C&E|〜HG&F|&|」を変換する場合について説明する)。図15に示すように、論理式変換部160eは、論理式の論理変数A、Bを読み出して、順にスタックする(ステップS10)。「A」の評価関数値は「1」、「B」の評価関数は「0」となる。
論理式変換部160eは、演算子「&」を読出し、第1項「B」、第2項「A」に対する第1評価関数値(BAの評価関数値)および第2評価関数値(ABの評価関数値)を比較すると、第1評価関数値<第2評価関数値となるので、「BA&」をスタックする。また、論理式変換部160eは、論理変数「D〜」、「C」を順次読出し、スタックする(ステップS11)。「BA&」の評価関数値は「1」、「D〜」の評価関数値は「0」、「C」の評価関数値は「1」となる。
論理式変換部160eは、演算子「&」を読出し、第1項「C」、第2項「D(D〜)」に対する第1評価関数値(CDの評価関数値「2」)および第2評価関数値(DCの評価関数値「1」)を比較すると、第2評価関数値<第1評価関数値となるので、「D〜C&」をスタックする。また、論理式変換部160eは、論理変数「E」を読み出してスタックする(ステップS12)。「D〜C&」の評価関数値は「1」、「E」の評価関数値は「0」となる。
論理式変換部160eは、演算子「|」を読出し、第1項「E」、第2項「DC(D〜C&)」に対する第1評価関数値(EDCの評価関数値「1」)および第2評価関数値(DCEの評価関数値「2」)を比較すると、第1評価関数値<第2評価関数値となるので、「ED〜C&|」をスタックする。また、否定「〜」を読み出し、第1項の最後尾に否定「〜」を付加する(ステップS13)。「ED〜C&|〜」の評価関数値は「1」となる。
論理式変換部160eは、論理変数「H」,「G」を読み出して、順にスタックする。また、論理式変換部160eは、演算子「&」を読み出し、第1項「H」、第2項「G」に対する第1評価関数値(HGの評価関数値「0」)および第2評価関数値(HGの評価関数値「0」)を比較すると、第2評価関数値=第1評価関数値となるので、例えば、「HG&」をスタックする(ステップS14)。「HG&」の評価関数値は「0」となる。
論理式変換部160eは、論理変数「F」を読み出して、スタックする。そして、論理式変換部160eは、演算子「|」を読み出し、第1項「F」、第2項「HG(HG&)」に対する第1評価関数値(FHGの評価関数値「0」)および第2評価関数値(HGFの評価関数値「0」)を比較すると、第2評価関数値=第1評価関数値となるので、例えば、「HG&F|」をスタックする(ステップS15)。「HG&F|」の評価関数値は「0」となる。
論理式変換部160eは、演算子「&」を読み出し、第1項「HGF(HG&F|)」、第2項「EDC(ED〜C&|〜)」に対する第1評価関数値(HGFEDCの評価関数値「1」)および第2評価関数値(EDCHGFの評価関数値「8」)を0比較すると、第1評価関数値<第2評価関数値となるので、「HG&F|ED〜C&|〜&」をスタックする(ステップS16)。
論理式変換部160eは、演算子「|」を読出し、第1項「HGFEDC(HG&F|ED〜C&|〜&)」、第2項「BA(BA&)」に対する第1評価関数値(HGFEDCBAの評価関数値「5」)および第2評価関数値(BAHGFEDCの評価関数値「64」)を比較すると、第1評価関数値<第2評価関数値となるので、「HG&F|ED〜C&|〜&BA&|」をスタックする(ステップS17)。「HG&F|ED〜C&|〜&BA&|」の評価関数値は、「5」となる。
論理式変換部160eは、上記ステップS10〜17を実行することによって、逆ポーランド表記の論理式「AB&D〜C&E|〜HG&F|&|」を論理式「HG&F|ED〜C&|〜&BA&|」に変換する。
このように、論理式変換部160eが、第1評価関数値と第2評価関数値との比較結果に基づいて、評価関数値の小さい方の論理変数の集合を、評価関数値の大きい方の論理変数の集合の前に出すことにより、論理式を変換するので、第1論理変数の前に第2論理変数を配置することができ、結果的に、計算コストの大きい論理変数の論理値を求めなければならない機会を減らすことが出来る。
図4の説明に戻ると、ダイアグラム生成部160fは、変換論理式データ150hに基づいて、論理式判定ダイアグラムデータを生成する手段である。ダイアグラム生成部160fは、変換論理式データ150h(逆ポーランド表記の論理式)の文字を先頭から順次読出し、読み出した文字(演算子、論理変数等)に応じて、レベルテーブル151、遷移テーブル152に各種の情報を登録する。
以下において、ダイアグラム生成部160fが、論理変数を読み出した場合の処理、否定(〜)を読み出した場合の処理、AND(&)を読み出した場合の処理、OR(|)を読み出した場合の処理、終了時の処理(最後の文字を読み出した後の処理)について順に説明する。なお、ダイアグラム生成部160fは、先頭(Top)スタック、Trueスタック、Falseスタックを保持しているものとする。
(論理変数を読み出した場合の処理)
ダイアグラム生成部160fが、論理変数を読み出した場合には、新しいノード変数を定義し、定義したノード変数、現在のレベル、読み出した論理変数からなるエントリをレベルテーブル151(図12参照)に追加する。
また、ダイアグラム生成部160fは、定義したノード変数を先頭スタックにプッシュ(一時記憶部<スタック>にノード変数を登録する)し、定義したノード変数1つからなる集合をTrueスタック、Falseスタックにプッシュすると共に、現在のレベルに1を加算する。
(否定「〜」を読み出した場合の処理)
ダイアグラム生成部160fは、否定を読み出した場合には、新しくユニークなノード変数T,Fを定義し、Trueスタックをポップ(一時記憶部<スタック>に一番最後に登録された情報を取り出す)し、ポップした集合内の各ノード変数において、ノード変数、論理値1、遷移先ノード変数Fからなるエントリを遷移テーブル152(図12参照)に追加する。
また、ダイアグラム生成部160fは、Falseスタックをポップし、ポップした集合内の各ノード変数において、ノード変数、論理値0、遷移先ノード変数Tからなるエントリを遷移テーブル152に追加する。ダイアグラム生成部160fは、Trueスタックにノード変数Tからなる集合をプッシュし、Falseスタックにノード変数Fからなる集合をプッシュする。
(AND「&」を読み出した場合の処理)
ダイアグラム生成部160fは、ANDを読み出した場合には、先頭スタックをポップし、ポップしたノード変数をAとする。そして、ダイアグラム生成部160fは、Trueスタックを2回ポップし、1回目にポップした集合をTrueスタックにプッシュする。
ダイアグラム生成部160fは、2回目にポップした集合内の各ノード変数をノード項目として、論理値1、遷移先ノード変数Aとをあわせたエントリを遷移テーブル152に追加する。また、ダイアグラム生成部160fは、Falseスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数すべてからなる集合をFalseスタックにプッシュする。
(OR「|」を読み出した場合の処理)
ダイアグラム生成部160fは、ORを読み出した場合には、先頭スタックをポップし、ポップしたノード変数をAとする。そして、ダイアグラム生成部160fは、Falseスタックを2回ポップし、1回目にポップした集合をFalseスタックにプッシュする。
ダイアグラム生成部160fは、2回目にポップした集合内の各ノード変数をノード項目として、論理値0、遷移先ノード変数Aをあわせたエントリを遷移テーブル152に追加する。また、ダイアグラム生成部160fは、Trueスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合をTrueスタックにプッシュする。
(終了時の処理)
ダイアグラム生成部160fは、新しいノード変数0,1を定義し、定義したノード変数、現在のレベル、論理変数NULLからなるエントリをレベルテーブルに追加する。また、ダイアグラム生成部160fは、Tureスタックをポップし、ポップした集合内の各ノード変数において、論理値1と遷移先ノード変数1とを合わせたエントリを遷移テーブル152に追加する。
ダイアグラム生成部160fは、Falseスタックをポップし、ポップした集合内の各ノード変数において、論理値0と遷移先ノード変数0とを合わせたエントリを遷移テーブル152に追加する。そして、ダイアグラム生成部160fは、遷移テーブル152において、遷移先項目がノード変数T,Fとして生成されたノード変数である全てのエントリに対し、そのノード変数をノード項目としてもつエントリを削除し、削除したエントリの遷移先ノード変数を該当エントリの遷移先項目として上書きする。
次に、ダイアグラム生成部160fの処理を具体的に説明する。ここでは、一例として、変換論理式データ150hが「HG&F|ED〜C&|〜&BA&|」であるものとする。図16〜図18は、TOPスタックとTrueスタックとFalseスタックの状態変化を示す図であり、図19〜図27は、レベルテーブル151と遷移テーブル152の状態変化を示す図である。
(「H」G&F|ED〜C&|〜&BA&|)
まず、ダイアグラム生成部160fは、「H」を読み、(H<ノード>,0<レベル>,H<論理変数>)をレベルテーブル151に追加し、「H」を先頭スタック、Trueスタック、Falseスタックにプッシュする。また、現在のレベル「0」に1を加算する。
(H「G」&F|ED〜C&|〜&BA&|)
ダイアグラム生成部160fは、「G」を読み、(G,1,G)をレベルテーブル151に追加し、「G」を先頭スタック、Trueスタック、Falseスタックにプッシュする。また、現在のレベル「1」に1を加算する(ステップS20および図19の左側参照)。
(HG「&」F|ED〜C&|〜&BA&|)
ダイアグラム生成部160fは、「&」を読み、先頭スタック「G」をポップする。そして、ダイアグラム生成部160fは、Tureスタックを2回ポップし、1回目にポップした集合「G」をTureスタックにプッシュする。
また、ダイアグラム生成部160fは、2回目にポップした集合「H」のノード変数が「H」なので、(H<ノード>,1<論理値>,G<遷移先>)を遷移テーブル152に追加する(図19の右側参照)。ダイアグラム生成部160fは、Falseスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合「H,G」をFalseスタックにプッシュする(ステップS21)。
(HG&「F」|ED〜C&|〜&BA&|)
ダイアグラム生成部160fは、「F」を読み、(F,2,F)をレベルテーブル151に追加し、「F」を先頭スタック、Trueスタック、Falseスタックにプッシュする(ステップS22および図20の左側参照)。また、現在のレベル「2」に1を加算する。
(HG&F「|」ED〜C&|〜&BA&|)
ダイアグラム生成部160fは、「|」を読み、先頭スタック「F」をポップする。そして、ダイアグラム生成部160fは、Falseスタックを2回ポップし、1回目にポップした集合「F」をFalseスタックにプッシュする。
ダイアグラム生成部160fは、2回目にポップした集合「H,G」内の各ノード変数をノード項目として、論理値0と遷移先ノード変数「F」とを合わせたエントリを遷移テーブル152に追加する(図20の右側参照)。
ダイアグラム生成部160fは、Tureスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合「G,F」をTrueスタックにプッシュする(ステップS23)。
(HG&F|「E」D〜C&|〜&BA&|)
ダイアグラム生成部160fは、「E」を読み、(E,3,E)をレベルテーブル151に追加し、「E」を先頭スタック、Trueスタック、Falseスタックにプッシュする。また、現在のレベル「3」に1を加算する。
(HG&F|E「D」〜C&|〜&BA&|)
ダイアグラム生成部160fは、「D」を読み、(D,4,D)をレベルテーブル151に追加し、「D」を先頭スタック、Trueスタック、Falseスタックにプッシュする。また、現在のレベル「4」に1を加算する(ステップS24および図21の左側参照)。
(HG&F|ED「〜」C&|〜&BA&|)
ダイアグラム生成部160fは、「〜」を読み、ユニークなノード「Dt」、「Df」を定義し、Trueスタックをポップし、ポップした集合内「D」のノード変数において、ノード変数「D」、論理値1、遷移先ノード変数「Df」からなるエントリを遷移テーブル152に追加する。
ダイアグラム生成部160fは、Falseスタックをポップし、ポップした集合内「D」のノード変数において、ノード変数「D」、論理値0、遷移先ノード変数「Dt」からなるエントリを遷移テーブル152に追加する(図21の右側参照)。また、ダイアグラム生成部160fは、Tureスタックに「Dt」をプッシュし、Falseスタックに「Df」をプッシュする(ステップS25)。
(HG&F|ED〜「C」&|〜&BA&|)
ダイアグラム生成部160fは、「C」を読み、(C,5,C)をレベルテーブル151に追加し、「C」を先頭スタック、Trueスタック、Falseスタックにプッシュする。また、現在のレベル「5」に1を加算する(ステップS26および図22の左側参照)。
(HG&F|ED〜C「&」|〜&BA&|)
ダイアグラム生成部160fは、「&」を読み、先頭スタック「C」をポップする。そして、ダイアグラム生成部160fは、Trueスタックを2回ポップし、1回目にポップした集合「C」をTrueスタックにプッシュする。
また、ダイアグラム生成部160fは、2回目にポップした集合「Dt」のノード変数が「Dt」なので、(Dt,1,C)を遷移テーブル152に追加する(図22の右側参照)。ダイアグラム生成部160fは、Falseスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合「Df,C」をFalseスタックにプッシュする(ステップS27)。
(HG&F|ED〜C&「|」〜&BA&|)
ダイアグラム生成部160fは、「|」を読み、先頭スタック「D」をポップする。そして、ダイアグラム生成部160fは、Falseスタックを2回ポップし、1回目にポップした集合「Df,C」をFalseスタックにプッシュする。
ダイアグラム生成部160fは、2回目にポップした集合「E」のノード変数をノード項目として、論理値0と遷移先ノード変数「D」とを合わせたエントリを遷移テーブル152に追加する(図23の左側参照)。
ダイアグラム生成部160fは、Tureスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合「E,C」をTrueスタックにプッシュする(ステップS28)。
(HG&F|ED〜C&|「〜」&BA&|)
ダイアグラム生成部160fは、「〜」を読み、ユニークなノード「Ct」、「Cf」を定義し、Trueスタックをポップし、ポップした集合内「E,C」のノード変数において、ノード変数「C」、論理値1、遷移先ノード変数「Cf」からなるエントリを遷移テーブル152に追加する。また、ノード変数「E」、論理値1、遷移先ノード変数「CF」からなるエントリを遷移テーブル152に追加する。
ダイアグラム生成部160fは、Falseスタックをポップし、ポップした集合内「Df,C」の各ノード変数において、ノード変数「C」、論理値0、遷移先ノード変数「Ct」からなるエントリを遷移テーブル152に追加すると共に、ノード変数「Df」、論理値0、遷移先ノード変数「Ct」からなるエントリを遷移テーブル152に追加する(図23の右側参照)。また、ダイアグラム生成部160fは、「Ct」をTrueスタックにプッシュし、「Cf」をFalseスタックにプッシュする(ステップS29)。
(HG&F|ED〜C&|〜「&」BA&|)
ダイアグラム生成部160fは、「&」を読み、先頭スタック「E」をポップする。そして、ダイアグラム生成部160fは、Tureスタックを2回ポップし、一回目にポップした集合「Ct」をTrueスタックにプッシュする。
また、ダイアグラム生成部160fは、2回目にポップした集合「G,F」内の各ノード変数が「G,F」なので、(G,1,E)および(F,1,E)を遷移テーブル152に追加する(図24の左側参照)。ダイアグラム生成部160fは、Falesスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合「Cf,F」をFalseスタックにプッシュする(ステップS30)。
(HG&F|ED〜C&|〜&「B」A&|)
ダイアグラム生成部160fは、「B」を読み、(B,6,B)をレベルテーブル151に登録し、「B」を先頭スタック、Trueスタック、Falseスタックにプッシュする。また、現在のレベル「6」に1を加算する。
(HG&F|ED〜C&|〜&B「A」&|)
ダイアグラム生成部160fは、「A」を読み、(A,7,A)をレベルテーブル151に登録し、「A」を先頭スタック、Trueスタック、Falseスタックにプッシュする。また、現在のレベル「7」に1を加算する。
(HG&F|ED〜C&|〜&BA「&」|)
ダイアグラム生成部160fは、「&」を読み、先頭スタック「A」をポップする。そして、ダイアグラム生成部160fは、Trueスタックを2回ポップし、1回目にポップした集合「A」をTrueスタックにプッシュする。
また、ダイアグラム生成部160fは、2回目にポップした集合「B」のノード変数が「B」なので、(B,1,A)を遷移テーブル152に追加する(図24の右側参照)。ダイアグラム生成部160fは、Falseスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合「B,A」をFalseスタックにプッシュする(ステップS31)。
(HG&F|ED〜C&|〜&BA&「|」)
ダイアグラム生成部160fは、「|」を読み、先頭トラック「B」をポップする。そして、ダイアグラム生成部160fは、Falseスタックを2回ポップし、1回目にポップした集合「B,A」をFalseスタックにプッシュする。
ダイアグラム生成部160fは、2回目にポップした集合「Cf,F」の各ノード変数をノード項目として、ノード変数「Cf」、論理値0、遷移先ノード変数「B」と、ノード変数「F」、論理値0、遷移先ノード変数「B」を遷移テーブル152に追加する(図25参照)。
ダイアグラム生成部160fは、Tureスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合「A,Ct」をTrueスタックにプッシュする(ステップS32)。
(終了時の処理)
ダイアグラム生成部160fは、新たしいノード変数「0」、「1」を定義し、定義したノード変数、現在のレベル、論理変数NULLからなるエントリをレベルテーブル151に追加する。そして、ダイアグラム生成部160fは、Trueスタックをポップし、ポップした集合内「A,Ct」の各ノード変数において、論理値1と遷移先ノード変数1とを合わせたエントリ(Ct,1,1,)および(A,1,1)を遷移テーブル152に追加する。
ダイアグラム生成部160fは、Falseスタックをポップし、ポップした集合内「B,A」の各ノード変数において、論理値0と遷移先ノード変数0とを合わせたエントリ(B,0,0)および(A,0,0)を遷移テーブル152に登録する(ステップS33および図26参照)。
ダイアグラム生成部160fは、遷移テーブル152(図26参照)において、遷移先がノード変数T,Fとして生成されたノード変数(例えば、Dt,Df,Ct,Cf)である全てのエントリに対し、そのノード変数をノード項目としてもつエントリを削除し、削除したエントリの遷移先ノード変数を該エントリの遷移先項目として上書きする(ステップS34および図27参照)。
例えば、ダイアグラム生成部160fは、
(E,1,Cf)、(Cf,0,B)を(E,1,B)に変換し、
(D,0,Dt)、(Dt,1,C)を(D,0,C)に変換し、
(D,1,Df)、(Df,0,Ct)を(D,1,Ct)に変換し、
(D,1,Ct)、(Ct,1,1)を(D,1,1)に変換する。
図4の説明に戻ると、ダイアグラム実行部160gは、論理値テーブル150g(図11参照)と、論理式判定ダイアグラムデータ150i(図12参照)とを比較して、論理式が「1(真)」であるか否かを判定する。
そして、ダイアグラム実行部160gは、判定結果が「1」となったデータ種別に対応する返答項目を抽出結果テーブル150f(図10参照)から検出し、検出した返答項目を検索結果データ150kとして記憶部150に記憶する。例えば、データ種別「Data3」の判定結果は「1」となるので、返答項目「第三開発部」を検索結果データ150kとして記憶する。
なお、ダイアグラム実行部160gは、論理値テーブル150gと論理式判定ダイアグラムデータ150iとを比較している途中で、論理値未算出の第1論理変数にヒットした場合には、ヒットした第1論理値変数の論理値を論理値算出部160dに要求し、該当論理値を取得する。
例えば、ダイアグラム実行部160gは、データ種別「Data0」の第1論理変数「q2」が必要になった場合には、データ種別「Data0」の第1論理変数「q2」の論理値を論理値算出部160dに要求する。論理値算出部160dは、データ種別「Data0」の第1論理変数「q2」の論理値の要求を受け付けた場合に、評価式q2「q2./busyo/ID=="1.*3"」によって「2222」(図10参照)を評価し、評価結果の論理値「この場合は0」をダイアグラム実行部160gに出力すると共に、算出した論理値を論理値テーブル150gに登録する。
検索結果出力部160hは、記憶部150に記憶された検索結果データ150kを端末装置60(図3参照)に送信する手段である。端末装置60は、検索結果データ150kを受信した場合に、受信した検索結果データ150kをモニタ画面に出力する。図28は、検索結果データを出力したモニタ画面の一例を示す図である。
次に、本実施例1にかかる検索装置100の処理手順について説明する。図29は、本実施例1にかかる検索装置100の処理手順を示すフローチャートである。同図に示すように、検索装置100が検索クエリを受信し(ステップS101)、検索クエリ分解部160aが分解検索クエリ150cを生成する(ステップS102)。
そして、計算量見積部160bが、論理変数の計算量を見積もることで計算量テーブル150eを生成し(ステップS103)、抽出結果テーブル生成部160cが、分解検索クエリに対応するデータを抽出して、抽出結果テーブル150fを生成する(ステップS104)。
続いて、論理値算出部160dが、計算量が閾値未満となる論理変数(第2論理変数)の論理値を算出することで論理値テーブル150gを生成し(ステップS105)、論理式変換部160eが、BDD入力順序決定処理を実行する(ステップS106)。
そして、ダイアグラム生成部160fがBDD構築処理を実行し(ステップS107)、ダイアグラム実行部160gが論理式判定ダイアグラム実行処理を行う(ステップS108)。ダイアグラム実行部160gは、評価結果データを格納し(ステップS109)、検索結果出力部160hが、返答項目出力処理を実行する(ステップS110)。
次に、図29のステップS106に示したBDD入力順序決定処理について説明する。図30は、BDD入力順序決定処理を示すフローチャートである。同図に示すように、論理式変換部160eは、論理式を逆ポーランド表記に変換し(ステップS201)、逆ポーランド表記の初めの文字を読み出す(ステップS202)。
そして、演算子を読み出したか否かを判定し(ステップS203)、演算子でない場合には(ステップS204,No)、論理変数をスタックし(ステップS205)、ステップS212に移行する。
一方、演算子を読み出した場合には(ステップS204,Yes)、スタックをポップして第1項に設定し、さらに、スタックをポップして第2項に設定し(ステップS206)、第1項、第2項の順に並べた場合の第1評価関数値と、第2項、第1項の順に並べた場合の第2評価関数値とを比較する(ステップS208)。
第1評価関数値が第2評価関数値よりも小さい場合には(ステップS209,Yes)、第1項、第2項の順に並べたものの後に演算子を加えスタックし、(ステップS210)、ステップS212に移行する。
一方、ステップS209の条件を満たさない場合には(ステップS209,No)、第2項、第1項の順に並べたものの後に演算子を加えスタックし(ステップS211)、次に文字が存在するか否かを判定する(ステップS212)。
次に文字が存在する場合には(ステップS213,Yes)、次の文字を読出し(ステップS214)、ステップS203に移行する。一方、次の文字が存在しない場合には(ステップS213,No)、BDD入力順序決定処理を終了する。
次に、図29のステップS107に示したBDD構築処理について説明する。図31は、BDD構築処理を示すフローチャートである。同図に示すように、ダイアグラム生成部160fは、現在のレベルを0に設定し(ステップS301)、逆ポーランド表記の初めの文字を読出し(ステップS302)、文字が論理変数か否かを判定する(ステップS303)。
文字が論理変数である場合には(ステップS304,Yes)、論理変数対応処理を実行し(ステップS305)、ステップS316に移行する。一方、文字が論理変数ではない場合には(ステップS304,No)、文字が「NOT」か否かを判定する(ステップS306)。
文字がNOTである場合には(ステップS307,Yes)、NOT対応処理を実行し(ステップS308)、ステップS316に移行する。一方、文字がNOTではない場合には(ステップS307,No)、文字が「AND」か否かを判定する(ステップS309)。
文字がANDである場合には(ステップS310,Yes)、AND対応処理を実行し(ステップS311)、ステップS316に移行する。一方、文字がANDではない場合には(ステップS310,No)、文字が「OR」か否かを判定する(ステップS312)。
文字がORではない場合には(ステップS313,No)、エラーを出力する(ステップS314)。一方、文字がORの場合には(ステップS313,Yes)、OR対応処理を実行し(ステップS315)、次に文字が存在するか否かを判定する(ステップS316)。
次の文字が存在する場合には(ステップS317,Yes)、次の文字を読出し(ステップS318)、ステップS303に移行する。一方、次の文字が存在しない場合には(ステップS317,No)、終了処理を実行し(ステップS319)、BDD構築処理を終了する。
次に、図31のステップS305に示した論理変数対応処理について説明する。図32は、論理変数対応処理を示すフローチャートである。同図に示すように、ダイアグラム生成部160fは、新しいノード変数を定義し(ステップS401)、定義したノード変数、現在のレベル、読み出した論理変数からなるエントリをレベルテーブル151に追加する(ステップS402)。
そして、ダイアグラム生成部160fは、定義したノード変数を先頭スタックにプッシュし(ステップS403)、定義したノード変数1つからなる集合をTrueスタック、Falseスタックにプッシュし(ステップS404)、現在のレベルに1を加算し(ステップS405)、論理変数対応処理を終了する。
次に、図31のステップS308に示したNOT対応処理について説明する。図33は、NOT対応処理を示すフローチャートである。同図に示すように、ダイアグラム生成部160fは、新しくユニークなノード変数T,Fを定義し(ステップS501)、Trueスタックをポップし、ポップした集合内の各変数において、ノード変数、論理値1、遷移先ノード変数Fからなるエントリを遷移テーブル152に追加する(ステップS502)。
そして、ダイアグラム生成部160fは、Falseスタックをポップし、ポップした集合内の各ノード変数において、ノード変数、論理値0、遷移先ノード変数Tからなるエントリを遷移テーブル152に追加し(ステップS503)、Trueスタックにノード変数Tからなる集合をプッシュし、Falseスタックにノード変数Fからなる集合をプッシュし(ステップS504)、NOT対応処理を終了する。
次に、図31のステップS311に示したAND対応処理について説明する。図34は、AND対応処理を示すフローチャートである。同図に示すように、ダイアグラム生成部160fは、先頭スタックをポップし、ポップしたノードを変数Aに設定し(ステップS601)、Trueスタックを2回ポップし、1回目にポップした集合をTrueスタックにプッシュする(ステップS602)。
そして、2回目にポップした集合内の各ノード変数をノード項目として、論理値1、遷移先ノード変数Aと合わせたエントリを遷移テーブルに追加し(ステップS603)、Falseスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合をFalseスタックにプッシュし(ステップS604)、AND対応処理を終了する。
次に、図31のステップS315に示したOR対応処理について説明する。図35は、OR対応処理を示すフローチャートである。同図に示すように、ダイアグラム生成部160fは、先頭スタックをポップし、ポップしたノードを変数Aに設定し(ステップS701)、Falseスタックを2回ポップし、1回目にポップした集合をFalseスタックにプッシュする(ステップS702)。
そして、2回目にポップした集合内の各ノード変数をノード項目として、論理値0、遷移先ノード変数Aと合わせたエントリを遷移テーブル152に追加し(ステップS703)、Trueスタックを2回ポップし、1回目および2回目にポップした集合内のノード変数全てからなる集合をTureスタックにプッシュする(ステップS704)。
次に、図31のステップS319に示した終了処理について説明する。図36は、終了処理を示すフローチャートである。同図に示すように、ダイアグラム生成部160fは、新しいノード変数0,1を定義し、定義したノード変数、現在のレベル、論理変数NULLからなるエントリをレベルテーブル151に追加し(ステップS801)、Trueスタックをポップし、ポップした集合内の各ノード変数において、論理値1と、遷移先ノード変数1とを合わせたエントリを遷移テーブル152に追加する(ステップS802)。
そして、ダイアグラム生成部160fは、Falseスタックをポップし、ポップした集合内の各ノード変数において、論理値0と、遷移先ノード変数0とを合わせたエントリを遷移先テーブルに追加する(ステップS803)。
続いて、ダイアグラム生成部160fは、遷移テーブル152において、遷移先項目がノード変数T,Fとして生成されたノード変数である全てのエントリに対し、そのノード変数をノード項目としてもつエントリを削除し、削除したエントリの遷移先ノード変数を該エントリの遷移先項目として上書きする(ステップS804)。
次に、図29のステップS108に示した論理式判定ダイアグラム実行処理について説明する。図37は、論理式判定ダイアグラム実行処理を示すフローチャートである。同図に示すように、ダイアグラム実行部160gは、初期ノードを現在のノードに設定し(ステップS901)、ノードテーブルを参照し、現在のノードレベルと論理変数とを取得する(ステップS902)。
ダイアグラム実行部160gは、ノードレベルが最終レベルか否かを判定し(ステップS903)、最終レベルの場合には(ステップS904,Yes)、ノードに割り当てられている真偽値(論理値)を評価結果として判定し(ステップS905)、他の論理式判定ダイアグラムが存在するか否かを判定する(ステップS906)。
他の論理式判定ダイアグラムが存在する場合には(ステップS907,Yes)、未選択の論理式判定ダイアグラムを選択し(ステップS908)、ステップS901に移行する。一方、他の論理式判定ダイアグラムが存在しない場合には(ステップS907,No)、論理式判定ダイアグラム実行処理を終了する。
ところで、ステップS904において、ノードレベルが最終レベルでない場合には(ステップS904,No)、論理変数の論理値が既知か否かを判定し(ステップS909)、既知でない場合には(ステップS910,No)、論理値算出部160dが論理変数の論理値を算出し(ステップS911)、ステップS913に移行する。
一方、論理値が既知の場合には(ステップS910,Yes)、論理値を論理値テーブルから読出し(ステップS912)、遷移テーブル152を参照し、遷移先情報を取得し(ステップS913)、現在のノードを遷移先のノードに設定し(ステップS914)、ステップS902に移行する。
次に、図29のステップS110に示した返答項目出力処理について説明する。図38は、返答項目出力処理を示すフローチャートである。同図に示すように、検索結果出力部160hは、評価結果テーブルを読出し(ステップS1001)、評価結果が真であるか否かを判定する(ステップS1002)。
評価結果が偽である場合には(ステップS1003,No)、ステップS1006に移行する。評価結果が真である場合には(ステップS1003,Yes)、抽出結果テーブル150fから対応する返答項目を抽出し(ステップS1004)、返答項目を送信先に出力する(ステップS1005)。
そして、検索結果出力部160hは、他の評価結果が存在するか否かを判定し(ステップS1006)、他の評価結果が存在する場合には(ステップS1007,Yes)、未選択の評価結果を読出し(ステップS1008)、ステップS1002に移行する。一方、他の評価結果が存在しない場合には(ステップS1007,No)、返答項目出力処理を終了する。
上述してきたように、本実施例1にかかる検索装置100は、端末装置60から検索クエリを取得した場合に、論理式に含まれる各論理変数の論理値を計算するための時間を予測することで、計算コストの大きい論理変数(第1論理変数)と計算コストの少ない論理変数(第2論理変数)とを判定し、計算コストの少ない論理変数が計算コストの大きい論理変数よりも前になるように、検索クエリに含まれる論理変数の順序を変換し、変換した検索クエリに基づいて計算コストの少ない論理変数を含む条件式から先に評価するので、検索クエリによる検索処理を高速化することが可能となる。
すなわち、第2論理変数が第1論理変数の前に配置される場合と、第2論理変数が第1論理変数の後ろに配置される場合とを比較すると、第2論理変数が第1論理変数の前に配置される方が第1論理変数の論理値が必要となる機会が少なくなるので、結果的に、計算コストの大きい論理値を算出すべき回数が減るので、検索クエリによる検索処理を高速化することが出来る。