(57)【特許請求の範囲】
【請求項１】
論理式を含む検索クエリを評価して、階層構造を有する文書データから該当するデータを検索する検索装置のクエリ変換方法であって、
前記検索装置は、
前記検索クエリに逆行軸が含まれるか否かを判定する逆行軸判定ステップと、
前記検索クエリに逆行軸が含まれている場合に、当該検索クエリ中にｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分のｏｒ演算子の中で、前記検索クエリをサブクエリに分解するための分割ポイントとなるｏｒ演算子を判定する分割判定ステップと、
前記分割ポイントとなるｏｒ演算子に基づいて、前記検索クエリをサブクエリに分割した上で、サブクエリに含まれる逆行軸を順行軸に変換する変換ステップと、
を含んだことを特徴とするクエリ変換方法。
【請求項２】
前記分割判定ステップは、前記ｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、当該ｏｒ条件部分に含まれるｏｒ演算子を分割ポイントとして判定することを特徴とする請求項１に記載のクエリ変換方法。
【請求項３】
前記逆行軸判定ステップは、前記検索クエリの木構造でｏｒ条件以降の階層で、親軸を含む場合に、逆行軸が含まれていると判定することを特徴とする請求項１または２に記載のクエリ変換方法。
【請求項４】
論理式を含む検索クエリを評価して、階層構造を有する文書データから該当するデータを検索する検索装置であって、
前記検索クエリに逆行軸が含まれるか否かを判定する逆行軸判定手段と、
前記検索クエリに逆行軸が含まれている場合に、当該検索クエリ中にｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分のｏｒ演算子の中で、前記検索クエリをサブクエリに分解するための分割ポイントとなるｏｒ演算子を判定する分割判定手段と、
前記分割ポイントとなるｏｒ演算子に基づいて、前記検索クエリをサブクエリに分割した上で、サブクエリに含まれる逆行軸を順行軸に変換する変換手段と、
を備えたことを特徴とする検索装置。
【請求項５】
前記分割判定手段は、前記ｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、当該ｏｒ条件部分に含まれるｏｒ演算子を分割ポイントとして判定することを特徴とする請求項４に記載の検索装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、論理式を含む検索クエリを評価して、階層構造を有する文書データから該当するデータを検索する検索装置等に関し、特に、計算コストを削減することができるクエリ変換方法および検索装置に関するものである。
【背景技術】
【０００２】
近年、コンピュータで処理される文書データとして、ＸＭＬ（Extensible  Markup  Language）データが利用されている。このＸＭＬデータは、タグとして参照される要素識別子「＜」や、「／＞」を使用した階層構造を含み、テキスト形式よりも多くの情報を含ませることが可能となっているため、コンピュータにおいてますます多用されてきている。
【０００３】
そして、ＸＭＬデータに対するデータ検索時には、クエリ（ＸＰａｔｈ式）などの検索式を利用して、クエリに該当する文書データおよびノード等を検索する方法が用いられている（例えば、特許文献１参照）。
【０００４】
その一方で、ＸＭＬデータはますます巨大化しているため、コンピュータにかかる負荷を軽減するべく、ストリーム処理に基づいてクエリに該当する文書データおよびノードを検索すること（ＸＭＬデータを順次参照し、後戻りすることなく、クエリに該当する文書データおよびノードを検索すること）が求められているが、クエリに逆行軸などが含まれている場合には、ストリーム処理によってＸＭＬデータを検索することが困難であるという問題があった。
【０００５】
図３２は、クエリに逆行軸が含まれる場合の問題点を説明するための図である。同図に示すように、ストリーム指向に基づいた処理では、既に読んだデータを再度読むことが出来ないが、クエリに逆行軸が含まれていると、現在のデータ位置（図３２のＤｎ）よりも過去のデータ位置（図３２のＤ１〜Ｄｎ−１）にアクセスする必要があり、メモリを節約すべく、一度読んだデータを破棄するストリーム指向に基づいた処理を実行できない（クエリに逆行軸が含まれている場合には、過去に読んだデータをメモリに残しておく必要がある）。
【０００６】
したがって、逆行軸を含むクエリは、順行軸のみを含むクエリ（検索時に、一度読んだデータにアクセスする必要がないクエリ、換言すれば、上位階層ノードへの逆戻りが生じないクエリ）に変換するほうが計算コストを少なく出来る。
【０００７】
そこで、従来では、クエリの逆行軸を順行軸に変換する各種の技術が考案されている。例えば、非特許文献１では、検索式内にあるＯＲ条件を全て分解してサブクエリに分解した上で、そのサブクエリ内の逆行軸を順行軸に変換している。
【０００８】
【特許文献１】特開２００３−３２３３３２号公報
【非特許文献１】D.Olteanu,Forward  node-selecting  queries  over  trees,ACM  Transactions  on  Database  System(TODS),Volume  32  Issue  1,ACM,March  2007  ISSN:0362-5915
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上述した従来の技術（例えば、非特許文献１）では、分解する必要のないｏｒ条件まで分解しているため、不要なサブクエリを作成してしまい、計算コストの削減に悪影響を与えてしまうという問題があった。
【００１０】
この発明は、上述した従来技術による問題点を解消するためになされたものであり、分割するサブクエリの数を減らし、計算コストを削減することができるクエリ変換方法および検索装置を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上述した課題を解決し、目的を達成するため、このクエリ変換方法は、論理式を含む検索クエリを評価して、階層構造を有する文書データから該当するデータを検索する検索装置のクエリ変換方法であって、前記検索装置は、前記検索クエリに逆行軸が含まれるか否かを判定する逆行軸判定ステップと、前記検索クエリに逆行軸が含まれている場合に、当該検索クエリ中にｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分のｏｒ演算子の中で、前記検索クエリをサブクエリに分解するための分割ポイントとなるｏｒ演算子を判定する分割判定ステップと、前記分割ポイントとなるｏｒ演算子に基づいて、前記検索クエリをサブクエリに分割した上で、サブクエリに含まれる逆行軸を順行軸に変換する変換ステップと、を含んだことを要件とする。
【００１２】
また、このクエリ変換方法は、上記のクエリ変換方法において、前記分割判定ステップは、前記ｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、当該ｏｒ条件部分に含まれるｏｒ演算子を分割ポイントとして判定することを要件とする。
【００１３】
また、このクエリ変換方法は、上記のクエリ変換方法において、前記逆行軸判定ステップは、前記検索クエリの木構造でｏｒ条件以降の階層で、親軸を含む場合に、逆行軸が含まれていると判定することを要件とする。
【００１４】
また、この検索装置は、論理式を含む検索クエリを評価して、階層構造を有する文書データから該当するデータを検索する検索装置であって、前記検索クエリに逆行軸が含まれるか否かを判定する逆行軸判定手段と、前記検索クエリに逆行軸が含まれている場合に、当該検索クエリ中にｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分のｏｒ演算子の中で、前記検索クエリをサブクエリに分解するための分割ポイントとなるｏｒ演算子を判定する分割判定手段と、前記分割ポイントとなるｏｒ演算子に基づいて、前記検索クエリをサブクエリに分割した上で、サブクエリに含まれる逆行軸を順行軸に変換する変換手段と、を備えたことを要件とする。
【００１５】
また、この検索装置は、上記の検索装置において、前記分割判定手段は、前記ｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、当該ｏｒ条件部分に含まれるｏｒ演算子を分割ポイントとして判定することを要件とする。
【発明の効果】
【００１６】
このクエリ変換方法によれば、逆行軸が含まれる場合に、ｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分の中で分割ポイントとなるｏｒ演算子を判定し、分割ポイントに基づいてクエリをサブクエリに分割した上で、逆行軸を順行軸に変換するので、評価対象となるサブクエリの数を減らすことが出来、計算コストを削減することができる。
【００１７】
また、このクエリ変換方法によれば、ｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、かかるｏｒ条件部分のｏｒ演算子を分割ポイントとして判定するので、分割すべきクエリを効率よく分割することが出来る。
【００１８】
また、このクエリ変換方法によれば、検索クエリの木構造でｏｒ条件以降の階層で、親軸を含む場合に、逆行軸が含まれていると判定するので、分割ポイントを正確に判定することが出来る。
【００１９】
また、この検索装置によれば、逆行軸が含まれる場合に、ｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分の中で分割ポイントとなるｏｒ演算子を判定し、分割ポイントに基づいてクエリをサブクエリに分割した上で、逆行軸を順行軸に変換するので、評価対象となるサブクエリの数を減らすことが出来、計算コストを削減することができる。
【００２０】
また、この検索装置によれば、ｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、かかるｏｒ条件部分のｏｒ演算子を分割ポイントとして判定するので、分割すべきクエリを効率よく分割することが出来る。
【発明を実施するための最良の形態】
【００２１】
以下に添付図面を参照して、この発明に係るクエリ変換方法および検索装置の好適な実施の形態を詳細に説明する。
【実施例１】
【００２２】
（ＸＭＬデータおよびクエリについて）
まず、本実施例１で利用するＸＭＬ（Extensible  Markup  Language）データについて説明する。図１は、ＸＭＬデータのデータ構造およびＸＭＬデータの木表現の一例を示す図である。同図の左側に示すように、このＸＭＬデータは、要素識別子「＜」、「＜／」等により要素が区切られた階層構造を有している。そして、ＸＭＬデータの木表現は、図１の右側のように表すことができる。
【００２３】
このＸＭＬデータの木構造では、ＸＭＬデータは、ノードＩＤ１，２，４，５，７，８，１０，１１，１３，１４，１６，１７，１９，２０，２２，２３，２５，２６の要素ノードと、ノードＩＤ３，６，９，１２，１５，１８，２１，２４，２７のテキストノードとを有し、各要素ノード、各テキストノードをそれぞれ接続している。例えば、ノードＩＤ「１」の要素ノード「Syain」は、ノードＩＤ「２」の要素ノード「title」、ノードＩＤ「４」の要素ノード「ACT」、ノードＩＤ「１３」の要素ノード「ACT」、ノードＩＤ「２２」の要素ノード「ACT」に接続されている。
【００２４】
また、クエリ（ＸＰａｔｈクエリ）には、親（親軸）、子（子供軸）、兄（兄軸）、弟（弟軸）等の概念が存在し、ＸＭＬデータには親（親ノード）、子（子供ノード）、兄（兄ノード）、弟（弟ノード）等の概念が存在する。図１を用いて説明すると、例えば、ノードＩＤ「１」のSyainと、ノードＩＤ「２」のtitle、ノードＩＤ「４」のACT、ノードＩＤ「１３」のACT、ノードＩＤ「２２」のACTとの関係は親と子と定義される。
【００２５】
また、ノードＩＤ「２」のtitleと、ノードＩＤ「４」のACTと、ノードＩＤ「１３」のACTと、ノードＩＤ「２２」のACTとの関係は兄弟と定義され、ノードＩＤ「２」のtitleは、ノードＩＤ「４」のACTの兄となり、ノードＩＤ「４」のACTは、ノードＩＤ「１３」のACTの兄となり、ノードＩＤ「１３」のACTは、ノードＩＤ「２２」のACTの兄となる。
【００２６】
ところで、クエリ（ＸＰａｔｈクエリ）を指定することによって、上記のＸＭＬデータからクエリの照合位置のデータを取得することが可能となる。なお、Ｗ３Ｃ（World  Wide  Web  Consortium）によるクエリのサブセットは、例えば、下記のように定義される。
Query::=Path("|"Path)  （クエリ同士のｏｒの意味）
Path::="/"RPath
RPath::=Step("/"Step)*
Step::=Axis"::"Nodetest  Pred*
Axis::=ForwardAxis|ReverseAxis
ForwardAxis::="child"
ReverseAxis::="parent"
NodeTest::=Tagname|"*"|"text()"|"node()"
Pred::="["Expr"]"
Expr::=RPath|Expr"and"Expr|Expr"or"Expr|"not"Expr
【００２７】
上記のサブセットにおいて、軸名がない場合は、子供軸（child）が省略されているものとする。また、後述するクエリの「../」は、親軸（parent）の省略形である。また、ＡＮＤ演算子およびｏｒ演算子は、ＡＮＤ演算子を優先する。なお、演算子の優先度は（）で決定する記法も許すものとする。
【００２８】
続いて、ＸＭＬデータからデータを検索するクエリを具体的に説明する。図２〜図５は、クエリの具体例を説明するための図である。まず、図２に示すクエリ「Q1=/Syain/ACT/id/../cast/name」について説明すると、このクエリは、Syain、ACT、idを順に辿った後に、idの親ノードとなる「ACT」に一旦逆戻りし、ACT、cast、nameを辿って参照位置を特定する。
【００２９】
したがって、クエリ「Q1=/Syain/ACT/id/../cast/name」によって参照されるノードは、ノードＩＤ「１１」の「name」、ノードＩＤ「２０」の「name」、ノードＩＤ「２６」の「name」となり、図２のＸＭＬデータの内、矩形で囲まれた情報が検索結果として出力される。
【００３０】
しかしながら、このクエリ「Q1=/Syain/ACT/id/../cast/name」は、逆行軸（親軸；以下同様）「../」が存在しているため、要素ノード「id」まで辿った後に、「id」の親ノードとなる「ACT」に逆戻りする必要があるため、ストリーム処理に基づいてクエリの該当ノードを検索することが出来ない（逆行軸がクエリに含まれているという前提では、親ノードに相当する＜あるいは、親ノードとなり得る＞データを残しておく必要があり、ストリーム処理のように、一度読んだデータを順次廃棄していく手法をとることができない）。
【００３１】
次に、図３に示すクエリ「Q2=/Syain/ACT[id]/cast/name」について説明すると、このクエリは、Syainを辿った後に、配下に「id」を有するACTを特定し、特定したACTからcast、nameを辿ることにより、参照位置を特定する。
【００３２】
したがって、クエリ「Q2=/Syain/ACT[id]/cast/name」によって参照されるノードは、図１に示したクエリの参照位置と同じ（クエリQ1とクエリQ2とは、同値なクエリ）ノードＩＤ「１１」の「name」、ノードＩＤ「２０」の「name」、ノードＩＤ「２６」の「name」となり、図３のＸＭＬデータの内、矩形で囲まれた情報が検索結果として出力される。
【００３３】
ここで、このクエリ「Q2=/Syain/ACT[id]/cast/name」は、逆行軸（親軸）が存在していないため、一度読んだデータに再度アクセスする必要がなく、ストリーム処理に基づいてクエリの該当ノードを検索することが出来る。例えば、図３に示す例では、述部に「id」を有する「ACT」を特定した時点で、ACT以前のデータが不要になるので、ストリーム処理のように、一度読んだデータを順次廃棄していく手法をとることが出来る。
【００３４】
次に、図４に示すクエリ「Q3=/Syain/ACT/id[../cast/name]」について説明すると、このクエリは、Syain、ACT、idを辿った後に、idの制約条件を満たすか否かを確認すべく、idの親ノードとなる「ACT」に一旦逆戻りし、ACTの配下にcast、nameが存在する場合に、初めて該当idが参照位置であると特定する。
【００３５】
したがって、クエリ「Q3=/Syain/ACT/id[../cast/name]によって参照されるノードは、ノードＩＤ「５」の「id」、ノードＩＤ「１４」の「id」、ノードＩＤ「２３」の「id」となり、図４のＸＭＬデータの内、矩形で囲まれた情報が検索結果として出力される。
【００３６】
しかしながら、このクエリは、図２に示したクエリと同様にして、逆行軸（親軸）「../」が存在しているため、要素ノード「id」まで辿った後に、「id」の親ノードとなる「ACT」に逆戻りする必要があるため、ストリーム処理に基づいてクエリの該当ノードを検索することが出来ない。
【００３７】
次に、図５に示すクエリ「Q4=/Syain/ACT[cast/name」/id」について説明すると、このクエリは、Syainを辿った後に、配下に「cast/name」を有するACTを特定し（制約条件を満たすACTを特定し）、特定したACTからidを辿ることにより、参照位置を特定する。
【００３８】
したがって、クエリ「Q4=/Syain/ACT[cast/name」/id」によって参照されるノードは、図４に示したクエリの参照位置と同じ（クエリQ3とクエリQ4とは、同値なクエリ）ノードＩＤ「５」の「id」、ノードＩＤ「１４」の「id」、ノードＩＤ「２３」の「id」となり、図５のＸＭＬデータの内、矩形で囲まれた情報が検索結果として出力される。
【００３９】
上述したように、ストリーム処理に基づいて、ＸＭＬデータからデータを検索する場合に、クエリに逆行軸が含まれている場合には、クエリに逆行軸が含まれないようにクエリを変換する必要がある（例えば、クエリQ1（Q3）をクエリQ2（Q4）に変換する必要がある）。
【００４０】
（親軸変換規則について）
従来では、逆行軸を含むクエリを、逆行軸を含まないクエリに変換する場合に、親軸変換ルールを適用する。親軸変換規則は、例えば、
（ルール１）π/a/../≡π[a]
（ルール２）a[../π]≡.[π]/a
が存在する。
【００４１】
例えば、クエリ「Q1=/Syain/ACT/id/../cast/name」に親軸変換規則（ルール１）を適用することにより、「Q1'=/Syain/ACT[id]/cast/name」にクエリが変換され、逆行軸が含まれないクエリとなるので、データ検索時に逆戻りが発生せず、ストリーム処理に基づいてクエリの該当ノードを検索することが出来るようになる。
【００４２】
また、クエリ「Q3=/Syain/ACT/id[../cast/name]」に親軸変換規則（ルール２）を適用することにより、「Q3'=/Syain/ACT[cast/name」/id」にクエリが変換され、逆行軸が含まれないクエリとなるので、データ検索時に逆戻りが発生せず、ストリーム処理に基づいてクエリの該当ノードを検索することが出来るようになる。
【００４３】
ところで、上記のクエリQ１、Q3に対しては、親軸変換規則をそのまま利用することで、逆行軸を含まないクエリに変換することが可能であったが、例えば、クエリ中にｏｒ演算子および逆行軸が混在している場合には、親軸変換規則をそのまま利用することができない。例えば、クエリ「Q5=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」に対して、親軸変換規則（ルール１、ルール２）をそのまま適用することが出来ない。
【００４４】
（従来の手法について）
そこで、非特許文献１では、クエリに含まれるｏｒ演算子を特定し、特定したｏｒ演算子を分割ポイントとして、クエリを複数のサブクエリに分割した上で、親軸変換規則を利用し、逆行軸を含むクエリを変換していた。
【００４５】
例えば、Q5=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]に含まれるｏｒ演算子を特定し、特定したｏｒ演算子を分割ポイントとして、クエリQ5をサブクエリに分割すると、
q1=/Syain/ACT[id  and  chara]
q2=/Syain/ACT[id  and  cast]
q3=/Syain/ACT[../title  and  chara]
q4=/Syain/ACT[../title  and  cast]
の各サブクエリq1〜q4に分割される。但し、Q5=q1|q2|q3|q4とする。
【００４６】
そして、各サブクエリq1〜q4の内、逆行軸を含むq3、q4に対して、親軸変換規則を適用することにより、最終的にサブクエリq1〜q4は、
q1=/Syain/ACT[id  and  chara]
q2=/Syain/ACT[id  and  cast]
q3=/Syain[title]/ACT[chara]
q4=/Syain[title]/ACT[cast]
に変換される。なお、サブクエリq1、q2には、逆行軸が存在しないため、そのままのクエリとなる。
【００４７】
クエリQ5の参照位置は、サブクエリq1の参照位置、または、サブクエリq2の参照位置、または、サブクエリq3の参照位置、または、サブクエリq4の参照位置となる。例えば、クエリQ5によって、図１に示すＸＭＬデータを検索すると、ノードＩＤ「４」の「ACT」、ノードＩＤ「１３」の「ACT」、ノードＩＤ「２２」の「ACT」が参照されるので、図１に示すＸＭＬデータの内、破線で囲まれた情報が検索結果として出力される。
【００４８】
しかしながら、非特許文献１の手法にしたがってクエリをサブクエリに分割すると、分割する必要のないクエリまで分割してしまうため、不要なサブクエリを作成し、計算コストの削減に悪影響を与えてしまう。
【００４９】
そもそも、クエリの分割が必要なのは、ｏｒ条件部分内の逆行軸に、親軸変換規則を適用できないためである。例えば、クエリ「Q5=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」におけるｏｒ条件部分は、「id  or  ../title」と、「chara  or  cast」となる。そして、ｏｒ条件部分「id  or  ../title」に対しては、親軸変換規則を適用できないが、ｏｒ条件部分「chara  or  cast」に対しては、親軸変換規則をそのまま適用できるため、「chara  or  cast」のｏｒ演算子を分割ポイントとしてサブクエリに分割する必要がない。
【００５０】
すなわち、ｏｒ条件部分に基づいて、分割するか否かを判定することで、ｏｒ演算子を含むクエリの同値変換において発生するサブクエリの数を減らすことができ、クエリによるデータ検索の計算コストを削減することが可能となる。
【００５１】
（本実施例１にかかる検索装置について）
次に、本実施例１にかかる検索装置の概要および特徴について説明する。本実施例１にかかる検索装置は、従来技術のように、クエリ中の全てのｏｒ演算子を分割ポイントとしてサブクエリに分割するのではなく、分割が必要となるｏｒ演算子を特定し、特定したｏｒ演算子のみを分割ポイントとしてサブクエリに分割する。
【００５２】
この検索装置は、クエリからｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分に逆行軸およびｏｒ演算子が含まれている場合に、かかるｏｒ条件部分に含まれるｏｒ演算子を分割ポイントとしてサブクエリに分割する。
【００５３】
例えば、クエリ「Q5=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」のうち、ｏｒ条件部分は、「id  or  ../title」と、「chara  or  cast」となる。そして、かかるｏｒ条件部分のうち、逆行軸およびｏｒ演算子を含むｏｒ条件部分は、「id  or  ../title」となるので、「id  or  ../title」に含まれるｏｒ演算子を分割ポイントとしてサブクエリに分解する。
【００５４】
具体的に、本実施例１の手法によって、クエリ「Q5=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」をサブクエリに分割すると、
q1=/Syain/ACT[id  and  (chara  or  cast)]
q2=/Syain/ACT[../title  and  (chara  or  cast)]
となる。但し、Q5=q1|q2とする。
【００５５】
そして、各サブクエリq1、q2のうち逆行軸を含むq2に対して、親軸変換規則を適用することにより、最終的にサブクエリq1、q2は、
q1=/Syain/ACT[id  and  (chara  or  cast)]
q2=/Syain[title]ACT[chara  or  cast]
に変換される。なお、サブクエリq1には、逆行軸が存在しないため、そのままのクエリとなる。
【００５６】
クエリQ5の参照位置は、サブクエリq1の参照位置、または、サブクエリq2の参照位置となる。例えば、クエリQ5によって、図１に示すＸＭＬデータを検索すると、ノードＩＤ「４」の「ACT」、ノードＩＤ「１３」の「ACT」、ノードＩＤ「２２」の「ACT」が参照されるので、図１に示すＸＭＬデータの内、破線で囲まれた情報が検索結果として出力される。
【００５７】
ここで、従来の技術によって分割されるサブクエリの数と、本実施例１の手法によって分割されるサブクエリの数を比較すると、本実施例１の手法によって分割されるサブクエリの数のほうが少なくなるので、検索装置は、クエリによる検索回数を削減することができ、計算コストを減らすことが出来る。例えば、上記のクエリQ5に関していえば、従来の手法では、４つのサブクエリが作成されるのに対して、本実施例１の手法では、２つのサブクエリしか作成されないので、クエリQ5に関しては、検索回数を２回削減することができる。
【００５８】
次に、本実施例１の検索装置が含まれる検索システムについて説明する（一例）。図６は、本実施例１にかかる検索システムの構成を示す図である。同図に示すように、この検索システムは、端末装置５０および検索装置１００を備え、端末装置５０および検索装置１００は、ネットワーク６０によって接続されている。
【００５９】
このうち、端末装置５０は、入力装置（図示略）を介してユーザからクエリを受け付けた場合に、受け付けたクエリの情報を検索装置１００に送信し、検索装置１００からの検索結果を出力装置（図示略）に出力する装置である。図７は、端末装置５０の出力装置に出力される検索結果の一例を示す図である。
【００６０】
検索装置１００は、端末装置５０からクエリの情報を受信した場合に、ＸＭＬデータからクエリに対応するデータを検索し、検索結果を端末装置５０に送信する装置である。図８は、本実施例１にかかる検索装置１００の構成を示す機能ブロック図である。
【００６１】
同図に示すように、この検索装置１００は、通信制御ＩＦ部１１０と、入力部１２０と、出力部１３０と、入出力制御ＩＦ部１４０と、記憶部１５０と、制御部１６０とを備えて構成される。
【００６２】
このうち、通信制御ＩＦ部１１０は、主に端末装置５０との間における通信を制御する手段である。入力部１２０は、各種の情報を入力する入力手段であり、キーボードやマウス、マイクなどによって構成される。
【００６３】
出力部１３０は、各種の情報を出力する出力手段であり、モニタ（若しくはディスプレイ、タッチパネル）やスピーカによって構成される。入出力制御ＩＦ部１４０は、通信制御ＩＦ部１１０、入力部１２０、出力部１３０、記憶部１５０、制御部１６０によるデータの入出力を制御する手段である。
【００６４】
記憶部１５０は、制御部１６０による各種処理に必要なデータおよびプログラムを記憶する記憶手段であり、特に本発明に密接に関連するものとしては、図８に示すように、ＸＭＬデータ１５０ａと、クエリデータ１５０ｂと、クエリ木データ１５０ｃと、分割管理テーブル１５０ｄと、スタック１５０ｅと、変換クエリデータ１５０ｆとを備える。
【００６５】
このうち、ＸＭＬデータ１５０ａは、要素識別子「＜」、「＜／」等により要素が区切られた階層構造を有する文書データである（図１の左側参照）。クエリデータ１５０ｂは、端末装置５０から送信されるクエリのデータである。例えば、クエリデータ１５０ｂは、「Q=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」となる。
【００６６】
クエリ木データ１５０ｃは、クエリデータ１５０ｂに基づいて作成されるクエリ木のデータである。このクエリ木データ１５０ｃは、ステップノードと論理記号ノードを有する。図９は、ステップノードおよび論理記号ノードのデータ構造の一例を示す図である。
【００６７】
ステップノードは、図９の上側に示すように、ＩＤ（ノードＩＤ）と、軸名（Axis）と、タグ名（Tag）と、次ステップポインタ（NextPT；ステップノードを指す）と、述部ポインタ（ParPT；ステップノードまたは論理記号ノードを指す）と、親ポインタ（ParPT；ステップノードまたは論理記号ノードを指す）とを有する。
【００６８】
また、論理記号ノードは、図９の下側に示すように、ＩＤ（ノードＩＤ）と、記号名（Symbl）と、左クエリポインタ（LeftPT；ステップノードまたは論理記号ノードを指す）と、右クエリポインタ（RightPT；ステップノードまたは論理記号ノードを指す）と、親ポインタ（ParPT；ステップノードまたは論理記号ノードを指す）とを有する。
【００６９】
なお、クエリにおけるステップは、
Step::=Axis"::"Nodetest  ([Predicate])*
と定義されている。すなわち、ステップとは、（軸、タグ名、述部）の三項組となる。例えば、/A[B]C[DorE]Fというクエリは、A[B]とC[D  or  E]とFという３つのステップを持つ。
【００７０】
図１０は、クエリ木データ１５０ｃのデータ構造の一例を示す図である。図１０に示すクエリ木データ１５０ｃは、クエリ「Q=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」のクエリ木を示す。
【００７１】
同図に示すように、このクエリ木データ１５０ｃは、ノードＩＤ「１」、軸名「子供」、タグ名「Syain」のステップノードと、ノードＩＤ「２」、軸名「子供」、タグ名「ACT」のステップノードと、ノードＩＤ「３」、記号名「∧；論理積」の論理記号ノードと、ノードＩＤ「４」、記号名「∨；論理積」の論理記号ノードと、ノードＩＤ「５」、軸名「子供」、タグ名「id」のステップノードと、ノードＩＤ「６」、軸名「親」、タグ名「title」のステップノードと、ノードＩＤ「７」、記号名「∨；論理積」の論理記号ノードと、ノードＩＤ「８」、軸名「子供」、タグ名「chara」のステップノードと、ノードＩＤ「９」、軸名「子供」、タグ名「cast」のステップノードとを有する。
【００７２】
そして、ノードＩＤ「１」のステップノードの次ステップポインタは、ノードＩＤ「２」のステップノードを指している。また、ノードＩＤ「２」のステップノードの述部ポインタは、ノードＩＤ「３」の論理記号ノードを示し、親ポインタは、ノードＩＤ「１」のステップノードを指している。
【００７３】
ノードＩＤ「３」の論理記号ノードの左クエリポインタは、ノードＩＤ「４」の論理記号ノードを指し、右クエリポインタは、ノードＩＤ「７」の論理記号ノードを指し、親ポインタは、ノードＩＤ「２」のステップノードを指す。
【００７４】
ノードＩＤ「４」の論理記号ノードの左クエリポインタは、ノードＩＤ「５」のステップノードを指し、右クエリポインタは、ノードＩＤ「６」のステップノードを指し、親ポインタは、ノードＩＤ「３」の論理記号ノードを指す。
【００７５】
ノードＩＤ「５」のステップノードの親ポインタは、ノードＩＤ「４」の論理記号ノードを指し、ノードＩＤ「６」のステップノードの親ポインタは、ノードＩＤ「４」の論理記号ノードを指す。
【００７６】
ノードＩＤ「７」の論理記号ノードの左クエリポインタは、ノードＩＤ「８」のステップノードを指し、右クエリポインタは、ノードＩＤ「９」のステップノードを指し、親ポインタは、ノードＩＤ「３」の論理記号ノードを指す。
【００７７】
ノードＩＤ「８」のステップノードの親ポインタは、ノードＩＤ「７」の論理記号ノードを指し、ノードＩＤ「９」のステップノードの親ポインタは、ノードＩＤ「７」の論理記号ノードを指す。なお、図１０中における「⊥」はヌル（空）を示す。以下の説明において、図１０に示すクエリ木データ１５０ｃは、図１１に示すような略図にて説明する。図１１は、クエリ木データ１５０ｃの略図である。
【００７８】
分割管理テーブル１５０ｄは、クエリと分割したサブクエリとの関係を管理するためのデータである。図１２は、分割管理テーブルのデータ構造の一例を示す図である。同図に示すように、この分割管理テーブル１５０ｄは、クエリと、各サブクエリとを有する。図１２に示す例では、クエリ「Q」がサブクエリ「q1」、「q2」に分割されている旨が記憶されている。
【００７９】
スタック１５０ｅは、分割ポイントの候補となる論理記号ノードのノードＩＤを管理するデータである。図１３は、スタック１５０ｅのデータ構造の一例を示す図である。同図に示すように、このスタック１５０ｅは、ノード深さと、ノードＩＤとを備える。ここで、ノード深さは、論理記号ノードの深さを示す。なお、論理記号ノードの深さはどのように定義しても構わないが、例えば、ルートから該当論理記号ノードまでに含まれる論理記号ノードの数と定義できる。
【００８０】
例えば、ノードＩＤ「４」の論理記号ノードをスタック１５０ｅに登録する場合には、ルートから該当論理記号ノードまでに含まれる論理記号ノードが１つなので、ノード深さは「１」となる。
【００８１】
変換クエリデータ１５０ｆは、逆行軸が含まれないように変換されたクエリデータである。例えば、クエリデータ「Q=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」に対応する変換クエリデータ１５０ｆは、「q1=/Syain/ACT[id  and  (chara  or  cast)]」および「q2=/Syain/ACT[../title  and  (chara  or  cast)]」となる。
【００８２】
制御部１６０は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する制御手段であり、特に本発明に密接に関連するものとしては、図８に示すように、クエリ受信部１６０ａと、逆行軸検出部１６０ｂと、分割ポイント判定部１６０ｃと、軸変換実行部１６０ｄと、クエリ評価部１６０ｅと、検出結果送信部１６０ｆとを備える。
【００８３】
クエリ受信部１６０ａは、端末装置５０からクエリの情報を受信した場合に、受信したクエリの情報をクエリデータ１５０ｂとして記憶部１５０に記憶する手段である。
【００８４】
逆行軸検出部１６０ｂは、クエリデータ１５０ｂに逆行軸（親軸「../」）が含まれるか否かを判定する手段である。逆行軸検出部１６０ｂは、逆行軸が含まれると判定した場合には、逆行軸が含まれる旨の情報を分割ポイント判定部１６０ｃに出力する。なお、逆行軸が含まれない場合には、クエリデータ１５０ｂをサブクエリに分割する処理を実行しないで、クエリ評価部１６０ｅ（後述する）がそのままクエリデータ１５０ｂを評価して、ＸＭＬデータ１５０ａから該当データを検出する。
【００８５】
分割ポイント判定部１６０ｃは、クエリデータ１５０ｂに逆行軸が含まれている場合に、クエリデータ１５０ｂの分割ポイントを判定し、分割ポイントに基づいてクエリデータ１５０ｂを分割する手段である。
【００８６】
具体的に、分割ポイント判定部１６０ｃは、クエリデータ１５０ｂにｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、当該ｏｒ条件部分に含まれるｏｒ演算子を分割ポイントとして判定する。
【００８７】
例えば、分割ポイント判定部１６０ｃは、クエリ「Q5=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」のうち、ｏｒ条件部分は、「id  or  ../title」と、「chara  or  cast」となり、かかるｏｒ条件部分のうち、逆行軸およびｏｒ演算子を含むｏｒ条件部分は、「id  or  ../title」となるので、「id  or  ../title」に含まれるｏｒ演算子を分割ポイントとして判定する。
【００８８】
以下において、分割ポイント判定部１６０ｃが、分割ポイントを判定する具体的な処理について説明する。分割ポイント判定部１６０ｃは、分割ポイントを判定する場合に、周知の手法を用いて、クエリデータ１５０ｂからクエリ木データ１５０ｃを生成する。そして、クエリ木データ１５０ｃのルート「ｒ」からステップノード「ａ」のパス「Ｐ」と定義し、ステップノード「ａ」の軸名が「逆行軸」である場合に、パス「Ｐ」上の論理記号ノードのうち、最下のｏｒノード（∨ノード）を分割ポイントとして判定する。
【００８９】
分割ポイント判定部１６０ｃは、クエリ木データ１５０ｃをプリオーダ巡回し、現在のパスに出現しているｏｒノードの深さをスタック１５０ｅで管理する。そして、ステップノードで逆行軸のものを見つけたら、スタック１５０ｅにアクセスして、分割ポイントを判定する。本手法では、クエリ木データ１５０ｃの分割は、下から順に（ボトムアップに）行う。したがって、分割ポイントはｏｒ条件部分内に逆行軸を含むｏｒノードのうちで、最下のものと定義される。
【００９０】
図１４〜図１７は、分割ポイント判定部１６０ｃの処理を説明するための図である（図１４〜図１７のノードＩＤ「１」〜「９」の詳細は、図１０参照）。まず、分割ポイント判定部１６０ｃは、述部ツリーを深さ優先検索して、ｏｒノード（∨ノード）を検出したら、スタック１５０ｅにノード深さとノードＩＤとを対応付けて登録する。図１４に示す例では、ノードＩＤ「４」の論理記号ノードが該当するので、ノード深さ「１」とノードＩＤ「４」とを対応付けてスタック１５０ｅに登録する。
【００９１】
続いて、分割ポイント判定部１６０ｃは、深さ優先検索時に、逆行軸を検出した場合に、スタック１５０ｅが空でなければ、最も深い位置に登録されているノードを分割ポイントとして判定する。図１５に示す例では、ノードＩＤ「６」のステップノードにおいて逆行軸が検出されるので、スタック１５０ｅ上で最下のｏｒノード（図１５に示す例では、ノードＩＤ「４」の論理記号ノード）を分割ポイントとして判定する。
【００９２】
分割ポイント判定部１６０ｃは、分割ポイントを判定した後に、分割ポイントに基づいて、クエリ木データを分割する。図１６に示す例では、図１６の左側に示すクエリQが、ノードＩＤ「４」の論理記号ノードを分割ポイントとして、サブクエリq1,q2に分割される。なお、分割前のクエリ木において、古い述部ツリーを新しい述部ツリーに置き換える（置き換えるクエリ木は、分解された数だけコピーを増やす）。分割ポイント判定部１６０ｃは、分割する前のクエリQと、分割後のサブクエリq1,q2とを対応付けて、分割管理テーブル１５０ｄに登録する。
【００９３】
分割ポイント判定部１６０ｃは、分割後のクエリ木に対しても上述した処理を繰り返し、クエリ木が分割できなくなるまで処理を継続する。なお、図１７に示す例では、どちらのクエリ木にも分割ポイントは存在しないので、クエリ木の分割を終了する。
【００９４】
分割ポイント判定部１６０ｃは、クエリ木データ１５０ｃを分割した後に、分割した各クエリ木に対して、同値性ルール
π[π1[π2]]≡π[π1/π2]
π[[π1[π2]≡π[π1][π2]
を適用することにより、分割後のクエリ木を正規化する。
【００９５】
図１８は、正規化を説明するための図である。ここでは、分割後のクエリq2に同値性ルールを適用する例を示している。クエリq2に同値性ルールを適用すると、ノードＩＤ「２」のステップノードの述部ポインタにノードＩＤ「６」のステップノードおよびノードＩＤ「７」の論理記号ノードが指定され、ノードＩＤ「３」の論理記号ノードが削除される。
【００９６】
分割ポイント判定部１６０ｃは、分割後のクエリデータを軸変換実行部１６０ｄに出力する。なお、クエリデータ「Q=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」は、分割ポイント判定部１６０ｃによって、サブクエリ「q1=/Syain/ACT[id  and  (chara  or  cast)]」および「q2=/Syain/ACT[../title  and  (chara  or  cast)]」に分割され、かかるデータが軸変換実行部１６０ｄに出力される。
【００９７】
軸変換実行部１６０ｄは、親軸変換規則を適用することにより、クエリを逆行軸を含まないクエリに変換する手段である。例えば、分割ポインタ判定部から、サブクエリ「q1=/Syain/ACT[id  and  (chara  or  cast)]」および「q2=/Syain/ACT[../title  and  (chara  or  cast)]」を取得した場合には、逆行軸を含むサブクエリq2に対して親軸変換規則を適用し、
q2=/Syain/ACT[../title  and  (chara  or  cast)]を
q2=/Syain[title]ACT[chara  or  cast]に変換する。なお、サブクエリq1は、逆行軸を含まないため、そのままのクエリとなる。
【００９８】
図１９は、親軸変換規則を適用した場合のクエリq2のクエリ木を説明するための図である。同図に示すように、クエリq2に親軸変換規則を適用すると、ノードＩＤ「１」のステップノードの述部ポインタにノードＩＤ「６」のステップノードが指定され、ノードＩＤ「６」のステップノードの軸名が「子供」に変換される。なお、ノードＩＤ「２」の述部ポインタに指定されていたノードＩＤ「６」のステップノードの情報はヌルに変更される。
【００９９】
軸変換実行部１６０ｄは、変換後のクエリデータを変換クエリデータ１５０ｆとして、記憶部１５０に記憶する。例えば、クエリ「Q=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」に対応する変換クエリデータ１５０ｆは、
q1=/Syain/ACT[id  and  (chara  or  cast)]
q2=/Syain/ACT[../title  and  (chara  or  cast)]
となる。
【０１００】
クエリ評価部１６０ｅは、変換クエリデータ１５０ｆを評価して、ＸＭＬデータ１５０ａから該当データを検索し、検索結果を検索結果送信部１６０ｆに出力する。例えば、クエリ評価部１６０ｅが
q1=/Syain/ACT[id  and  (chara  or  cast)]
q2=/Syain/ACT[../title  and  (chara  or  cast)]
を評価すると、該当するノードがノードＩＤ「４」のACT、ノードＩＤ「１３」のACT、ノードＩＤ「２２」のACTとなるので、図１のＸＭＬデータの破線部の情報が、検索結果として検出される。
【０１０１】
検索結果送信部１６０ｆは、検索結果をクエリ評価部１６０ｅから取得した場合に、取得した検索結果を端末装置５０に出力する手段である。
【０１０２】
次に、本実施例１にかかる検索装置１００の処理手順について説明する。図２０は、本実施例１にかかる検索装置１００の処理手順を示すフローチャートである。同図に示すように、この検索装置１００は、クエリを取得し（ステップＳ１０１）、クエリに逆行軸が含まれているか否かを判定する（ステップＳ１０２）。
【０１０３】
クエリに逆行軸が含まれていない場合には（ステップＳ１０３，Ｎｏ）、ステップＳ１０８に移行する。一方、クエリに逆行軸が含まれている場合には（ステップＳ１０３，Ｙｅｓ）、クエリ木生成処理を実行し（ステップＳ１０４）、クエリ木分割処理を実行し（ステップＳ１０５）、分割後のクエリ木をT(q1)、…、T(qn)とおき（ステップＳ１０６）、親軸変換処理を実行する（ステップＳ１０７）。
【０１０４】
続いて、検索装置１００は、クエリを評価し（ステップＳ１０８）、検索結果を出力する（ステップＳ１０９）。
【０１０５】
次に、図２０のステップＳ１０４に示したクエリ木生成処理について説明する。図２１は、クエリ木生成処理を示すフローチャートである。なお、図２１のフローチャートにおいて、入力はクエリQとなり、出力がクエリ木Tとなる。また、Curstep、Stepnode、Nextstep、Nextnodeは局所変数であり、Curstepは、現在のステップ、Stepnodeは、Curstepに対応するステップ構造体であり、Nextstepは、次のステップであり、Nextnodeは、Nextstepに対応するステップノード構造体である。
【０１０６】
図２１に示すように、クエリQの最初の段（ステップ）をCurstepとおき（ステップＳ２０１）、Curstepに対応するステップ節点（ステップノード）を作成し、Stepnodeとおく（ステップＳ２０２）。
【０１０７】
そして、（Nextstep、Nextnode）＝Step（Q、Curstep、Stepnode）とし（ステップＳ２０３）、（Nextstep、Nextnode）＝Step（Q、Curstep、Stepnode）を入力として、ステップ部対応処理を実行する（ステップＳ２０４）。
【０１０８】
続いて、検索装置１００は、Nextnodeが空節点か否かを判定し（ステップＳ２０５）、空節点の場合には（ステップＳ２０６，Ｙｅｓ）、完成したクエリ木を出力し（ステップＳ２０７）、クエリ木生成処理を終了する。
【０１０９】
一方、Nextnodeが空節点ではない場合には（ステップＳ２０６，Ｎｏ）、Curstepの次ステップポインタにNextnodeを指定し（ステップＳ２０８）、CurstepにNextstepを代入し（ステップＳ２０９）、StepnodeにNextnodeを代入し（ステップＳ２１０）、ステップＳ２０４に移行する。
【０１１０】
次に、図２１のステップＳ２０４に示したステップ部対応処理について説明する。図２２は、ステップ部対応処理を示すフローチャートである。図２２において、入力は、Q（クエリ）、Curstep（現在のステップ）、Stepnode（Curstepに対応するステップノード構造体）となり、出力はNextstep（次のステップ）、Nextnode（Nextstepに対応するステップノード構造体）となる。
【０１１１】
図２２に示すように、Curstepに述部が存在するか否かを判定し（ステップＳ３０１）、述部が存在する場合には（ステップＳ３０２，Ｙｅｓ）、Pred（Q、Curstep、Stepnode）を入力として、述部部分対応処理を実行し（ステップＳ３０３）、ステップＳ３０４に移行する。
【０１１２】
一方、Curstepに述部が存在しない場合には（ステップＳ３０２，Ｎｏ）、Curstepの次ステップが存在するか否かを判定し（ステップＳ３０４）、存在しない場合には（ステップＳ３０５，Ｎｏ）、（Nextstep＜空ステップ＞、Nextnode＜空節点＞）を出力し（ステップＳ３０６）、ステップ部対応処理を終了する。
【０１１３】
一方、Curstepの次ステップが存在する場合には（ステップＳ３０５，Ｙｅｓ）、次ステップをNextstepとおき（ステップＳ３０７）、Nextstepに対応するステップ節点を作成し、Nextnodeとし（ステップＳ３０８）、（Nextstep、Nextnode）を出力し（ステップＳ３０９）、ステップ部対応処理を終了する。
【０１１４】
次に、図２２のステップＳ３０３に示した述部部分対応処理について説明する。図２３は、述部部分対応処理を示すフローチャートである。図２３において、入力はQ（クエリ）、Curstep（現在のステップ）、Stepnode（Curstepに対応するステップノード構造体）となる。
【０１１５】
図２３に示すように、Curstepの述部に論理演算子が存在するか否かを判定し（ステップＳ４０１）、存在しない場合には（ステップＳ４０２，Ｎｏ）、T=Tree(Curstep)を作成し（ステップＳ４０３）、Stepnodeの述部ポインタにTのルート節点を指定し（ステップＳ４０４）、クエリ木生成処理を実行し（ステップＳ４０５）、述部部分対応処理を終了する。
【０１１６】
一方、Curstepの述部に論理演算子が存在する場合には（ステップＳ４０２，Ｙｅｓ）、Curstepの述部中、一番外側で作用する論理演算子をEとする（ステップＳ４０６）。ステップＳ４０６において、述部を「(id  or  ../title)and(chara  or  cast)」とすると、演算子は１つの論理積「and」と、２つの論理和「or」が含まれるが、この場合、一番外側で作用する論理演算子は、論理積「and」となる。
【０１１７】
続いて、Eの左側のクエリをLF、右側のクエリをRFとし（ステップＳ４０７）、Eに対応する論理記号ノードEnodeを指定する（ステップＳ４０８）。そして、Lefttree(LF,Enode)を入力として左木対応処理を実行し（ステップＳ４０９）、Righttree(RF,Enode)を入力として、右木対応処理を実行し（ステップＳ４１０）、述部部分対応処理を終了する。
【０１１８】
次に、図２３のステップＳ４０９に示した左木対応処理について説明する。図２４は、左木対応処理を示すフローチャートである。図２４において、入力はLF（クエリ）、Enode（論理記号ノード）となる。
【０１１９】
図２４に示すように、LFに論理演算子が存在するか否かを判定し（ステップＳ５０１）、論理演算子が存在しない場合には（ステップＳ５０２，Ｎｏ）、T=Tree(LF)を作成し（ステップＳ５０３）、Enodeの左クエリポインタにTのルート節点を指定し（ステップＳ５０４）、クエリ木生成処理を実行し（ステップＳ５０５）、左木作成処理を終了する。
【０１２０】
一方、LFに論理演算子が存在する場合には（ステップＳ５０２，Ｙｅｓ）、LFの述部中、一番外側で作用する論理演算子をE2とし（ステップＳ５０６）、E2の左側のクエリをLF2、右側のクエリをRF2とし（ステップＳ５０７）、E2に対応する論理記号ノードEnode2を指定する（ステップＳ５０８）。
【０１２１】
そして、Lefttree(LF2,Enode2)を入力として左木対応処理を実行し（ステップＳ５０９）、Righttree(RF2,Enode2)を入力として、右木対応処理を実行し（ステップＳ５１０）、左木対応処理を終了する。なお、ステップＳ５０９に示した左木対応処理は、図２４に示した左木対応処理と同様である。
【０１２２】
次に、図２３のステップＳ４１０に示した右木対応処理について説明する。図２５は、右木対応処理を示すフローチャートである。図２５において、入力はRF（クエリ）、Enode（論理記号ノード）となる。
【０１２３】
図２５に示すように、RFに論理演算子が存在するか否かを判定し（ステップＳ６０１）、論理演算子が存在しない場合には（ステップＳ６０２，Ｎｏ）、T=Tree(RF)を作成し（ステップＳ６０３）、Enodeの左クエリポインタにTのルート節点を指定し（ステップＳ６０４）、クエリ木生成処理を実行し（ステップＳ６０５）、右木作成処理を終了する。
【０１２４】
一方、RFに論理演算子が存在する場合には（ステップＳ６０２，Ｙｅｓ）、RFの述部中、一番外側で作用する論理演算子をE2とし（ステップＳ６０６）、E2の左側のクエリをLF2、右側のクエリをRF2とし（ステップＳ６０７）、E2に対応する論理記号ノードEnode2を指定する（ステップＳ６０８）。
【０１２５】
そして、Lefttree(LF2,Enode2)を入力として左木対応処理を実行し（ステップＳ６０９）、Righttree(RF2,Enode2)を入力として、右木対応処理を実行し（ステップＳ６１０）、左木対応処理を終了する。なお、ステップＳ６０９に示した左木対応処理は、図２４に示した左木対応処理と同様であり、ステップＳ６１０に示した右木対応処理は、図２５に示した右木対応処理と同様である。
【０１２６】
次に、図２０のステップＳ１０５に示したクエリ木分割処理について説明する。図２６、図２７は、クエリ木分割処理の処理手順を示すフローチャートである。図２６、図２７において、入力は、クエリ木T、クエリ木集合E、分割管理テーブルTab、ノードN（深さ優先で巡回されるTの各ノード）となる。
【０１２７】
図２６に示すように、Nをクエリ木Tのルートに設定し、E=EU{T}とし（ステップＳ７０１）、Nに次の節点（Next）が存在するか否かを判定し（ステップＳ７０２）、存在しない場合には（ステップＳ７０３，Ｎｏ）、クエリ木分割処理を終了する。
【０１２８】
一方、Nに次の節点（Next）が存在する場合には（ステップＳ７０３，Ｙｅｓ）、depth(N)≧depth(Next)の場合に、スタック１５０ｅのdepth（Next）番目以降をクリアし、N=Nextとする（ステップＳ７０４）。
【０１２９】
そして、Nが論理記号ノードで、かつor記号か否かを判定し（ステップＳ７０５）、Nが論理記号ノードで、かつor記号の場合には（ステップＳ７０６，Ｙｅｓ）、スタック１５０ｅのdepth（N）番目にNを登録し（ステップＳ７０７）、ステップＳ７０３に移行する。
【０１３０】
一方、Nが論理記号ノードで、かつor記号ではない場合に（ステップＳ７０６，Ｎｏ）、Nがステップノードで、かつ親軸か否かを判定し（ステップＳ７０８）、Nがステップノードで、かつ親軸ではない場合には（ステップＳ７０９，Ｎｏ）、ステップＳ７０３に移行する。
【０１３１】
一方、Nがステップノードで、かつ親軸の場合には（ステップＳ７０９，Ｙｅｓ）、スタック１５０ｅに１つでも節点が登録されているか否かを判定し（ステップＳ７１０）、登録されていない場合には（ステップＳ７１１，Ｎｏ）、ステップＳ７０３に移行する。
【０１３２】
一方、スタック１５０ｅに１つでも節点が登録されている場合には（ステップＳ７１１，Ｙｅｓ）、スタックに登録されている節点のうち、最も深い位置に登録されているもの（論理記号ノード）を分割点（ＤＰ）とする（ステップＳ７１２）。
【０１３３】
そして、(T1,T2)=Treesep(T,DP)とし（ステップＳ７１３）、(T1,T2)=Treesep(T,DP)を入力として、Treesep処理を実行する（ステップＳ７１４）。続いて、分割管理テーブル１５０ｄのレコードTの項目に、T1およびT2を登録し（ステップＳ７１５）、分割管理テーブル１５０ｄに新レコードT1およびT2を登録し、E=＼{T}とし（ステップＳ７１６）、T1、T2を入力として、クエリ木分割処理を実行し（ステップＳ７１７）、クエリ木分割処理を終了する。なお、ステップＳ７１７に示したクエリ木分割処理は、図２６，２７に示したクエリ木分割処理に対応する。
【０１３４】
次に、図２７のステップＳ７１４に示したTreesep処理について説明する。図２８は、Treesep処理の処理手順を示すフローチャートである。図２８において、入力は、T（クエリ木）、ＤＰ（分割点ノード＜分割ポイントのノード＞）となり、出力は、クエリ木Tの分割後のクエリ木T1、T2となる。なお、図２８中の各局所変数について説明すると、Sub1、Sub2は、最初はTの部分木、後に、それぞれT1とT2の部分木を示し、Curは、現在の節点を示し、Parは、Curの親節点を示し、TreeSPは、DPの先祖のステップ節点（Sub1とSub2の頂点）を示す。
【０１３５】
図２８に示すように、Cur（現在の節点）にDP（分割点ノード）を代入し（ステップＳ８０１）、Curの親節点をParとおき（ステップＳ８０２）、Parがステップ節点で、かつParの述部ポインタの行き先がCurか否かを判定する（ステップＳ８０３）。
【０１３６】
Parがステップ節点で、かつParの述部ポインタの行き先がCurではない場合には（ステップＳ８０４，Ｎｏ）、CurにParを代入し（ステップＳ８０５）、Curの親節点をParとし（ステップＳ８０６）、ステップＳ８０２に移行する。
【０１３７】
一方、Parがステップ節点で、かつParの述部ポインタの行き先がCurの場合には（ステップＳ８０４，Ｙｅｓ）、TreeSP=Parとおき（ステップＳ８０７）、TからTreeSP以下の部分木を切り出したものを２つ生成し、それぞれSub1、Sub2とする（ステップＳ８０８）。
【０１３８】
そして、(T1,T2)=Predsep(T,Sub1,Sub2,DP,TreeSP)とし（ステップＳ８０９）、(T1,T2)=Predsep(T,Sub1,Sub2,DP,TreeSP)を入力として、Predsep処理を実行する（ステップＳ８１０）。
【０１３９】
次に、図２８のステップＳ８１０に示した、Predsep処理について説明する。図２９は、Predsep処理の処理手順を示すフローチャートである。図２９において、入力は、T（クエリ木）、Sub1、Sub2（Tの部分木）、DP（Tの分割点ノード）、TreeSP（Sub1、Sub2の頂点）となり、出力は、Tの分割後のクエリ木T1、T2となる。なお、Parは、DPの親ノードを示す。
【０１４０】
図２９に示すように、DPの親節点をParとおき（ステップＳ９０１）、Tのコピーを２つ作成し、それぞれT1、T2とし（ステップＳ９０２）、Parのノードの種類がステップ節点か否かを判定する（ステップＳ９０３）。
【０１４１】
Parのノードの種類がステップ節点の場合には（ステップＳ９０４，Ｙｅｓ）、Sub1中のParの述部ポインタ指定先を、DPの右ポインタの指定先に変更し（ステップＳ９０５）、Sub2中のParの述部ポインタ指定先をDPの左ポインタの指定先に変更し（ステップＳ９０６）、ステップＳ９１３に移行する。
【０１４２】
一方、Parのノードの種類が論理記号節点の場合には（ステップＳ９０４，Ｎｏ）、Parの左ポインタがDPを指すか否かを判定し（ステップＳ９０７）、左ポインタがDPを指す場合には（ステップＳ９０８，Ｙｅｓ）、Sub1中のParの左ポインタ指定先をDPの右ポインタの指定先に変更し（ステップＳ９０９）、Sub2中の左ポインタ指定先をDPの左ポインタの指定先に変更し（ステップＳ９１０）、ステップＳ９１３に移行する。
【０１４３】
一方、Parの右ポインタがDPを指す場合には（ステップＳ９０８，Ｎｏ）、Sub1中のParの右ポインタの指定先を、DPの右ポインタの指定先に変更し（ステップＳ９１１）、Sub2中のParの右ポインタの指定先を、DPの左ポインタの指定先に変更する（ステップＳ９１２）。
【０１４４】
そして、T1のTreeSP以下の部分木をSub1に置き換え（ステップＳ９１３）、T2のTreeSP以下の部分木をSub2に置き換え（ステップＳ９１４）、T1およびT2を出力し（ステップＳ９１５）、Predsep処理を終了する。
【０１４５】
次に、図２０のステップＳ１０７に示した親軸変換処理について説明する。図３０は、親軸変換処理の処理手順を示すフローチャートである。図３０において、入力は、クエリ木Tとなる。また、図３０における各局所変数について説明すると、Nは、Tのノードをを示し、Parは、Nの親ノードを示す。
【０１４６】
図３０に示すように、Tの正規化を行い（ステップＳ１００１）、NをTのルートにし（ステップＳ１００２）、Nがステップ節点で、かつNの軸が親軸か否かを判定する（ステップＳ１００３）。
【０１４７】
Nがステップ節点で、かつNの軸が親軸ではない場合に（ステップＳ１００４，Ｎｏ）、次の節点をNとし（ステップＳ１００５）、ステップＳ１００３に移行する。一方、Nがステップ節点で、かつNの軸が親軸の場合には（ステップＳ１００４，Ｙｅｓ）、Nの親節点をParとし（ステップＳ１００６）、Parの述部ポインタの指定先がNか否かを判定する（ステップＳ１００７）。
【０１４８】
Parの述部ポインタの指定先がNの場合には（ステップＳ１００８，Ｙｅｓ）、Parの述部ポインタのうち、その指定先がNであるものを、空ポインタに変更し（ステップＳ１００９）、Parの親節点に述部ポインタを新設し、その指定先をNとし（ステップＳ１０１０）、ステップＳ１０１３に移行する。
【０１４９】
一方、Parの述部ポインタの指定先がNでない場合には（ステップＳ１００８，Ｎｏ）、Parの親節点に述部ポインタを新設し、その指定先をParとし（ステップＳ１０１１）、Parの親節点のステップポインタの指定先をParからNに変更する（ステップＳ１０１２）。
【０１５０】
そして、Nの軸名を、親軸から子供軸に変更し（ステップＳ１０１３）、Tを出力し（ステップＳ１０１４）、親軸変換処理を終了する。
【０１５１】
上述してきたように、本実施例１にかかる検索装置１００は、従来技術のように、クエリ中の全てのｏｒ演算子を分割ポイントとしてサブクエリに分割するのではなく、分割が必要となるｏｒ演算子（逆行軸およびｏｒ演算子が含まれているｏｒ条件部分のｏｒ演算子）を特定し、特定したｏｒ演算子のみを分割ポイントとしてサブクエリに分割するので、ｏｒ演算子を含むクエリの同値変換において発生するサブクエリの数を減らすことができ、クエリによるデータ検索の計算コストを削減することが可能となる。
【０１５２】
具体的に、本実施例１の手法によって、例えば、クエリ「Q5=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」をサブクエリに分割すると、
q1=/Syain/ACT[id  and  (chara  or  cast)]
q2=/Syain/ACT[../title  and  (chara  or  cast)]
となる。
【０１５３】
一方、従来技術に基づいて、クエリ「Q5=/Syain/ACT[(id  or  ../title)and(chara  or  cast)]」をサブクエリに分割すると、
q1=/Syain/ACT[id  and  chara]
q2=/Syain/ACT[id  and  cast]
q3=/Syain/ACT[../title  and  chara]
q4=/Syain/ACT[../title  and  cast]
となる。
【０１５４】
したがって、従来の技術によって分割されるサブクエリの数と、本実施例１の手法によって分割されるサブクエリの数を比較すると、本実施例１の手法によって分割されるサブクエリの数のほうが少なくなるので、検索装置は、クエリによる検索回数を削減することができ、計算コストを減らすことが出来る。
【実施例２】
【０１５５】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例１以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下では実施例２として本発明に含まれる他の実施例について説明する。
【０１５６】
（１）逆行軸について
例えば、上記の実施例１では、順行軸として子供軸を考察し、逆行軸として親軸を考察したが、これに限定されるものではない。順行軸には、子供軸の他に、子孫軸、子孫または自身軸、弟軸、先行軸が含まれ、逆行軸には、親軸の他に、先祖軸、先祖または自身軸、兄軸、後行軸が含まれる。
【０１５７】
そして、本実施例１にかかる検索装置１００は、順行軸が子供軸以外（例えば、子孫軸、子孫または自身軸、弟軸、先行軸）、逆行軸が親軸以外（例えば、先祖軸、先祖または自身軸、兄軸、後行軸）であっても、実施例１の手法を用いて同様にサブクエリの分割数を削減することができる。
【０１５８】
（２）システムの構成等
ところで、本実施例において説明した各処理のうち、自動的に行われるものとして説明した処理の全部または一部を手動的に行うこともでき、あるいは、手動的に行われるものとして説明した処理の全部あるいは一部を公知の方法で自動的に行うこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１５９】
また、図８に示した検索装置１００の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行われる各処理機能は、その全部または任意の一部がＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１６０】
図３１は、実施例１にかかる検索装置１００を構成するコンピュータ２００のハードウェア構成を示す図である。図３１に示すように、このコンピュータ（検索装置）２００は、入力装置２０１、モニタ２０２、ＲＡＭ（Random  Access  Memory）２０３、ＲＯＭ（Read  Only  Memory）２０４、記憶媒体からデータを読み取る媒体読取装置２０５、他の装置（例えば、端末装置５０）との間でデータの送受信を行う通信装置２０６、ＣＰＵ（Central  Processing  Unit）２０７、ＨＤＤ（Hard  Disk  Drive）２０８をバス２０９で接続して構成される。
【０１６１】
そして、ＨＤＤ２０８には、上記した検索装置１００の機能と同様の機能を発揮する検索プログラム２０８ｂ、が記憶されている。ＣＰＵ２０７が、検索プログラム２０８ｂを読み出して実行することにより、検索プロセス２０７ａが起動される。ここで、検索プロセス２０７ａは、図８に示した、クエリ受信部１６０ａ、逆行軸検出部１６０ｂ、分割ポイント判定部１６０ｃ、軸変換実行部１６０ｄ、クエリ評価部１６０ｅ、検索結果送信部１６０ｆに対応する。
【０１６２】
また、ＨＤＤ２０８は、ＸＭＬデータ１５０ａ、クエリデータ１５０ｂ、クエリ木データ１５０ｃ、分割管理テーブル１５０ｄ、スタック１５０ｅ、変換クエリデータ１５０ｆに対応する各種データ２０８ａを記憶する。ＣＰＵ２０７は、ＨＤＤ２０８に格納された各種データ２０８ａを読み出して、ＲＡＭ２０３に格納し、ＲＡＭ２０３に格納された各種データ２０３ａを利用して、クエリを分割した後に、各サブクラスを評価してデータ検索を行う。
【０１６３】
ところで、図３１に示した検索プログラム２０８ｂは、必ずしも最初からＨＤＤ２０８に記憶させておく必要はない。たとえば、コンピュータに挿入されるフレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」、または、コンピュータの内外に備えられるハードディスクドライブ（ＨＤＤ）などの「固定用の物理媒体」、さらには、公衆回線、インターネット、ＬＡＮ、ＷＡＮなどを介してコンピュータに接続される「他のコンピュータ（またはサーバ）」などに検索プログラム２０８ｂを記憶しておき、コンピュータがこれらから検索プログラム２０８ｂを読み出して実行するようにしてもよい。
【０１６４】
以上の実施例１，２を含む実施形態に関し、更に以下の付記を開示する。
【０１６５】
（付記１）論理式を含む検索クエリを評価して、階層構造を有する文書データから該当するデータを検索する検索装置のクエリ変換方法であって、
前記検索装置は、
前記検索クエリに逆行軸が含まれるか否かを判定する逆行軸判定ステップと、
前記検索クエリに逆行軸が含まれている場合に、当該検索クエリ中にｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分のｏｒ演算子の中で、前記検索クエリをサブクエリに分解するための分割ポイントとなるｏｒ演算子を判定する分割判定ステップと、
前記分割ポイントとなるｏｒ演算子に基づいて、前記検索クエリをサブクエリに分割した上で、サブクエリに含まれる逆行軸を順行軸に変換する変換ステップと、
を含んだことを特徴とするクエリ変換方法。
【０１６６】
（付記２）前記分割判定ステップは、前記ｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、当該ｏｒ条件部分に含まれるｏｒ演算子を分割ポイントとして判定することを特徴とする付記１に記載のクエリ変換方法。
【０１６７】
（付記３）前記逆行軸判定ステップは、前記検索クエリの木構造でｏｒ条件以降の階層で、親軸を含む場合に、逆行軸が含まれていると判定することを特徴とする付記１または２に記載のクエリ変換方法。
【０１６８】
（付記４）論理式を含む検索クエリを評価して、階層構造を有する文書データから該当するデータを検索する検索装置であって、
前記検索クエリに逆行軸が含まれるか否かを判定する逆行軸判定手段と、
前記検索クエリに逆行軸が含まれている場合に、当該検索クエリ中にｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分のｏｒ演算子の中で、前記検索クエリをサブクエリに分解するための分割ポイントとなるｏｒ演算子を判定する分割判定手段と、
前記分割ポイントとなるｏｒ演算子に基づいて、前記検索クエリをサブクエリに分割した上で、サブクエリに含まれる逆行軸を順行軸に変換する変換手段と、
を備えたことを特徴とする検索装置。
【０１６９】
（付記５）前記分割判定手段は、前記ｏｒ条件部分にｏｒ演算子および逆行軸が含まれている場合に、当該ｏｒ条件部分に含まれるｏｒ演算子を分割ポイントとして判定することを特徴とする付記４に記載の検索装置。
【０１７０】
（付記６）前記逆行軸判定手段は、前記検索クエリの木構造でｏｒ条件以降の階層で、親軸を含む場合に、逆行軸が含まれていると判定することを特徴とする付記４または５に記載の検索装置。
【０１７１】
（付記７）コンピュータに、
論理式を含む検索クエリに逆行軸が含まれるか否かを判定する逆行軸判定手順と、
前記検索クエリに逆行軸が含まれている場合に、当該検索クエリ中にｏｒ演算子が含まれるｏｒ条件部分を特定し、特定したｏｒ条件部分のｏｒ演算子の中で、前記検索クエリをサブクエリに分解するための分割ポイントとなるｏｒ演算子を判定する分割判定手順と、
前記分割ポイントとなるｏｒ演算子に基づいて、前記検索クエリをサブクエリに分割した上で、サブクエリに含まれる逆行軸を順行軸に変換する変換手順と、
を実行させることを特徴とするクエリ変換プログラム。
【図面の簡単な説明】
【０１７２】
【図１】ＸＭＬデータのデータ構造およびＸＭＬデータの木表現の一例を示す図である。
【図２】クエリの具体例を説明するための図（１）である。
【図３】クエリの具体例を説明するための図（２）である。
【図４】クエリの具体例を説明するための図（３）である。
【図５】クエリの具体例を説明するための図（４）である。
【図６】本実施例１にかかる検索システムの構成を示す図である。
【図７】端末装置の出力装置に出力される検索結果の一例を示す図である。
【図８】本実施例１にかかる検索装置の構成を示す機能ブロック図である。
【図９】ステップノードおよび論理記号ノードのデータ構造の一例を示す図である。
【図１０】クエリ木データのデータ構造の一例を示す図である。
【図１１】クエリ木データの略図である。
【図１２】分割管理テーブルのデータ構造の一例を示す図である。
【図１３】スタックのデータ構造の一例を示す図である。
【図１４】分割ポイント判定部の処理を説明するための図（１）である。
【図１５】分割ポイント判定部の処理を説明するための図（２）である。
【図１６】分割ポイント判定部の処理を説明するための図（３）である。
【図１７】分割ポイント判定部の処理を説明するための図（４）である。
【図１８】正規化を説明するための図である。
【図１９】親軸変換規則を適用した場合のクエリq2のクエリ木を説明するための図である。
【図２０】本実施例１にかかる検索装置の処理手順を示すフローチャートである。
【図２１】クエリ木生成処理を示すフローチャートである。
【図２２】ステップ部対応処理を示すフローチャートである。
【図２３】述部部分対応処理を示すフローチャートである。
【図２４】左木対応処理を示すフローチャートである。
【図２５】右木対応処理を示すフローチャートである。
【図２６】クエリ木分割処理の処理手順を示すフローチャート（１）である。
【図２７】クエリ木分割処理の処理手順を示すフローチャート（２）である。
【図２８】Treesep処理の処理手順を示すフローチャートである。
【図２９】Predsep処理の処理手順を示すフローチャートである。
【図３０】親軸変換処理の処理手順を示すフローチャートである。
【図３１】実施例１にかかる検索装置を構成するコンピュータのハードウェア構成を示す図である。
【図３２】クエリに逆行軸が含まれる場合の問題点を説明するための図である。
【符号の説明】
【０１７３】
５０    端末装置
６０    ネットワーク
１００    検索装置
１１０    通信制御ＩＦ部
１２０    入力部
１３０    出力部
１４０    入出力制御ＩＦ部
１５０    記憶部
１５０ａ  ＸＭＬデータ
１５０ｂ  クエリデータ
１５０ｃ  クエリ木データ
１５０ｄ  分割管理テーブル
１５０ｅ  スタック
１５０ｆ  変換クエリデータ
１６０    制御部
１６０ａ  クエリ受信部
１６０ｂ  逆行軸検出部
１６０ｃ  分割ポイント判定部
１６０ｄ  軸変換実行部
１６０ｅ  クエリ評価部
１６０ｆ  検索結果送信部
２００    コンピュータ
２０１    入力装置
２０２    モニタ
２０３    ＲＡＭ
２０３ａ  各種データ
２０４    ＲＯＭ
２０５    媒体読取装置
２０６    通信装置
２０７    ＣＰＵ
２０７ａ  検索プロセス
２０８    ＨＤＤ
２０８ａ  各種データ
２０８ｂ  検索プログラム
２０９    バス
【図１】
0005125662.tif 000002
【図２】
0005125662.tif 000003
【図３】
0005125662.tif 000004
【図４】
0005125662.tif 000005
【図５】
0005125662.tif 000006
【図６】
0005125662.tif 000007
【図７】
0005125662.tif 000008
【図８】
0005125662.tif 000009
【図９】
0005125662.tif 000010
【図１０】
0005125662.tif 000011
【図１１】
0005125662.tif 000012
【図１２】
0005125662.tif 000013
【図１３】
0005125662.tif 000014
【図１４】
0005125662.tif 000015
【図１５】
0005125662.tif 000016
【図１６】
0005125662.tif 000017
【図１７】
0005125662.tif 000018
【図１８】
0005125662.tif 000019
【図１９】
0005125662.tif 000020
【図２０】
0005125662.tif 000021
【図２１】
0005125662.tif 000022
【図２２】
0005125662.tif 000023
【図２３】
0005125662.tif 000024
【図２４】
0005125662.tif 000025
【図２５】
0005125662.tif 000026
【図２６】
0005125662.tif 000027
【図２７】
0005125662.tif 000028
【図２８】
0005125662.tif 000029
【図２９】
0005125662.tif 000030
【図３０】
0005125662.tif 000031
【図３１】
0005125662.tif 000032
【図３２】
0005125662.tif 000033