(57)【特許請求の範囲】
【請求項１】
構造化文書中の検索要素間の先祖・子孫関係を検索条件とした構造検索を行う検索装置において、構造化文書の文書構造を設定に従って分解したそれぞれ複数の要素を含む複数の部分構造間の接続関係を示す第１の構造情報と前記部分構造ごとに該部分構造中の各要素間の接続関係を示す第２の構造情報を保持する情報保持手段と、それぞれの検索要素が含まれる部分構造が先祖・子孫関係にあるか否かを前記第１の構造情報に基づいて各部分構造を１つの要素として検索して求めるとともに前記検索要素が含まれる部分構造が先祖・子孫関係にあるときはさらに前記検索要素が含まれる部分構造のうち先祖側の部分構造から子孫側の部分構造へのパス上にあって前記先祖側の部分構造の子の部分構造のルートとなる要素と前記先祖側の部分構造に含まれる検索要素とが先祖・子孫関係にあるか否かを前記第２の構造情報に基づいて検索することによって求める構造検索手段を有することを特徴とする検索装置。
【請求項２】
前記構造検索手段は、前記先祖側の部分構造に含まれる検索要素が当該先祖側の部分構造のルートとなる要素である場合には、前記第２の構造情報を用いた判定を行わないことを特徴とする請求項１に記載の検索装置。
【請求項３】
前記構造検索手段は、２つの検索要素が同一の部分構造に含まれているときには前記第２の構造情報を参照して先祖・子孫関係の検索を行うことを特徴とする請求項１または請求項２に記載の検索装置。
【請求項４】
構造化文書中の検索要素間の先祖・子孫関係を検索条件とした構造検索を行う検索方法において、構造化文書の文書構造を設定に従って分解したそれぞれ複数の要素を含む複数の部分構造間の接続関係を示す第１の構造情報と前記部分構造ごとに該部分構造中の各要素間の接続関係を示す第２の構造情報を情報保持手段が保持しておき、構造検索手段が、それぞれの検索要素が含まれる部分構造が先祖・子孫関係にあるか否かを前記第１の構造情報に基づいて各部分構造を１つの要素として検索して求めるとともに、前記検索要素が含まれる部分構造が先祖・子孫関係にあるときは、さらに前記検索要素が含まれる部分構造のうち先祖側の部分構造から子孫側の部分構造へのパス上にあって前記先祖側の部分構造の子の部分構造のルートとなる要素と前記先祖側の部分構造に含まれる検索要素とが先祖・子孫関係にあるか否かを前記第２の構造情報に基づいて検索することによって求めることを特徴とする検索方法。
【請求項５】
前記先祖側の部分構造に含まれる検索要素が当該先祖側の部分構造のルートとなる要素である場合には、前記第２の構造情報を用いた判定を行わないことを特徴とする請求項４に記載の検索方法。
【請求項６】
２つの検索要素が同一の部分構造に含まれているときには前記第２の構造情報を参照して先祖・子孫関係の検索を行うことを特徴とする請求項４または請求項５に記載の検索方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、構造化文書中の要素間の先祖・子孫関係を検索する検索装置及び検索方法に関するものである。
【０００２】
【従来の技術】
従来より、ＸＭＬなどの構造化文書をデータベース化し、内容や文書構造での検索や、部分的な再利用などの利用に供している。一般に数ページ程度の小さな文書では、編集者が１人で文書の作成、編集を行う場合が多く、構造化文書をデータベース化した場合でも、文書全体を編集対象として編集作業が行われる場合が多い。しかし、大規模な文書では複数人が文書中のそれぞれの担当部分を編集してゆくといったことが行われており、構造化文書をデータベース化した場合でも、このような共同編集環境の提供が必要となる。
【０００３】
従来、構造化文書をデータベース化する場合には、例えば文書中の各要素の親子関係を示すポインタなどで結んで文書中の構造を保持したり、構造を示すインデックステーブルなどを用いて構造を保持している。他にもいくつかの方法が考えられているが、従来の方法はいずれも、文書全体を一律に画一的なデータ形式によって保持している。
【０００４】
このような従来の構造化文書の格納方法を用いている場合、編集した文書を格納すると、その影響が文書全体に波及してしまうことも少なくない。そのため、上述のような共同編集環境を考えた場合、従来の方法では複数人がそれぞれ並行して編集することができなかった。
【０００５】
また、編集により文書全体に影響が及ぶ場合、文書に対して編集が加えられる度に、文書全体のデータを再構築する必要が発生する。大規模な文書では、このようなデータの再構築には多大な処理時間がかかり、編集するたびにデータの再構築を行っていたのでは非常に効率が悪いという問題があった。
【０００６】
一方、このように構造化文書をデータベース化した場合、文書構造の検索、特に２つの要素間の先祖・子孫関係の検索が頻繁に行われる。先祖・子孫関係は、ある要素から上位層へ要素をたぐってゆくだけで、あるいは下位層へ要素をたぐってゆくだけで、たどり着くことができる要素間の関係を示す。２つの要素が上下関係で直接接続されている関係が親子関係であるが、先祖・子孫関係は親子関係を含むものである。
【０００７】
このような先祖・子孫関係の検索は、頻繁に行われることから高速に実行できることが望まれる。従来は要素を１つずつたぐってゆくことによって行うが、枝分かれが多く、また階層が深い文書では、要素の探索時間も長くなってしまう。そのため、大規模な文書において先祖・子孫関係の検索を効率よく行うことができる手法が要望されていた。
【０００８】
【発明が解決しようとする課題】
本発明は、上述した事情に鑑みてなされたもので、構造化文書中の要素の先祖・子孫関係を効率よく判定して文書構造の検索を高速に行うことができる検索装置及び検索方法を提供することを目的とするものである。
【０００９】
【課題を解決するための手段】
本発明は、構造化文書中の検索要素間の先祖・子孫関係を検索条件とした構造検索を行う検索装置及び検索方法において、構造化文書の文書構造を設定に従って分解し、それぞれ複数の要素を含む複数の部分構造間の接続関係を示す第１の構造情報と、前記部分構造ごとに該部分構造中の各要素間の接続関係を示す第２の構造情報を保持しておく。そして、それぞれの検索要素が含まれる部分構造が先祖・子孫関係にあるか否かを前記第１の構造情報に基づいて各部分構造を１つの要素として検索して求める。前記検索要素が含まれる部分構造が先祖・子孫関係にあるときは、さらに前記検索要素が含まれる部分構造のうち先祖側の部分構造から子孫側の部分構造へのパス上にあって前記先祖側の部分構造の子の部分構造のルートとなる要素と前記先祖側の部分構造に含まれる検索要素とが先祖・子孫関係にあるか否かを前記第２の構造情報に基づいて検索することによって求める。
【００１０】
このように、構造化文書を部分構造に分解して、その構造を第１及び第２の構造情報として保持するので、部分構造単位での編集を行うことによって、編集による影響を部分構造内に収めることができる。従って、複数人がそれぞれ担当する部分構造を並行して編集する場合でも、他の部分構造への影響をなくし、共同編集環境を提供することができる。また、構造が変更された場合でも、そのためのデータの再構築は部分構造内で行えばよいので、高速に再構築のための処理を行うことができる。
さらに、従来のようにそれぞれの要素を１つずつたぐってゆかなくても、２つの要素が先祖・子孫関係にあるか否かを高速に求めることができ、大規模な構造化文書の検索を効率的に行うことができる。
【００１１】
なお、この検索を行う際に、先祖側の部分構造に含まれる検索要素が当該先祖側の部分構造のルートとなる要素である場合には、前記第２の構造情報を用いた判定を行わず、第１の構造情報を用いた処理のみで２つの要素が先祖・子孫関係にあるか否かを求めることができる。また、２つの検索要素が同一の部分構造に含まれているときには、第１の構造情報を用いることなく、第２の構造情報を参照して先祖・子孫関係の検索を行うことができる。
【００１２】
【発明の実施の形態】
図１は、本発明の実施の一形態を示すブロック図である。図中、１は文書入力部、２はファイル管理部、３はディスパッチャ、４は検索部、５は文書処理部、６は文書解析部、７は文書分解部、８は編集単位処理部、９は文書解析部、１０は差分解析部、１１は要素情報登録部、１２は構造情報登録部、１３はリレーショナルデータベースである。文書入力部１は、構造化文書をファイル管理部２に対して入力する。このとき、ここでは分解前の構造化文書であるか、分解された部分構造であるかを示すコンテントタイプも入力するものとする。また文書入力部１は、ファイル管理部２の検索部４に対して構造化文書あるいは構造化文書の部分構造の取り出しを要求して部分構造を受け取る。受け取った構造化文書あるいはその部分構造に対して編集を行った結果を再びファイル管理部２に対して入力することができる。また、構造化文書に対する文書構造の検索などを要求することができる。
【００１３】
ファイル管理部２は、文書入力部１との間で構造化文書あるいはその部分構造の受け渡しを行う。ファイル管理部２は、ディスパッチャ３及び検索部４を有している。ディスパッチャ３は、文書入力部１から渡される構造化文書あるいはその部分構造を受け取り、そのコンテントタイプに従って、部分構造への分解前の構造化文書の場合には、その構造化文書を文書処理部５に渡す。また、分解された部分構造を受け取った場合には、その部分構造を編集単位処理部８へ渡す。さらに、文書処理部５で分解された部分構造を受け取って編集単位処理部８へ渡す。
【００１４】
検索部４は、文書入力部１から要求された構造化文書あるいはその部分構造をリレーショナルデータベース１３から取り出し、文書入力部１へ渡す。また、各種のリレーショナルデータベース１３に対する検索要求を受け付け、検索結果を返す。特に文書構造の検索を行うことができ、このとき、本発明の検索方法による要素間の先祖・子孫関係の判定を行う。
【００１５】
文書処理部５は、ファイル管理部２のディスパッチャ３から渡される構造化文書を解析して、部分構造に分解する。文書処理部５は、構造化文書を解析する文書解析部６と、リレーショナルデータベース１３から読み込んだ設定に従って構造化文書を複数の部分構造に分解する文書分解部７を有している。大規模な構造化文書では、分解された部分構造が編集単位となる。分解された部分構造には部分構造であることを示すコンテントタイプが付加され、ファイル管理部２に入力される。また、部分構造間の関係をグローバル構造情報（第１の構造情報）として、リレーショナルデータベース１３にレコードとして登録する。
【００１６】
編集単位処理部８は、ファイル管理部２から渡される部分構造について、部分構造内の要素の情報を要素情報として、また各要素間の関係を構造情報として、それぞれリレーショナルデータベース１３に格納する。編集単位処理部８は、文書解析部９、差分解析部１０、要素情報登録部１１、構造情報登録部１２を有している。文書解析部９は、ファイル管理部２から渡された部分構造を解析する。
【００１７】
この例では、編集された部分構造については編集前の部分構造との差分をリレーショナルデータベース１３に格納することにより版管理の利用に供するものとし、そのための構成として差分解析部１０を有している。差分解析部１０は、文書解析部９による解析結果に従い、リレーショナルデータベース１３に保持されている編集前の部分構造と編集後の部分構造の差分を抽出してリレーショナルデータベース１３への登録対象とする。なお、新規の構造化文書の部分構造である場合には、部分構造全体をリレーショナルデータベース１３への登録対象とする。差分管理を行わない場合には、この差分解析部９は不要である。
【００１８】
要素情報登録部１１は、部分構造中の各要素について、それぞれの属性情報や内容をフィールド値とするレコードをリレーショナルデータベース１３に登録する。なお、差分解析部１０による差分の抽出で追加されたことが判明した要素については新規の登録を行い、変更及び削除されたことが判明した要素については削除処理を行う。削除処理は、実際にレコードを削除してもよいし、例えばバージョン管理を行う場合には、削除された旨の情報を付加して残しておいてもよい。
【００１９】
構造情報登録部１２は、ファイル管理部２から渡された部分構造について、各要素間の関係を構造情報（第２の構造情報）として生成し、リレーショナルデータベース１３に登録する。部分構造に対して編集が行われた場合には、その部分構造の構造情報を再構築して新たに登録する。構造情報は、このように編集が行われると再構築が必要となるが、分解された部分構造ごとに行うので、他の部分構造には影響を与えずに更新することが可能であり、文書全体の文書構造の再構築を行う必要はない。なお、バージョン管理を行う際には、当該部分構造が編集される都度、構造情報を再構築してグローバル構造情報との対応付けを行っておけばよい。
【００２０】
リレーショナルデータベース１３は、一般的なリレーショナルデータベースであり、構造化文書の各要素の要素情報と、部分構造間の関係を示すグローバル構造情報と、部分構造内の各要素間の関係を示す構造情報をそれぞれレコードとして格納し、これらの情報によって構造化文書を保持する。なお、グローバル構造情報及び構造情報については、その検索性能を高めるため、バイナリ形式のデータとしてレコード中のフィールドに格納しておくとよい。もちろんこれらのデータを別のデータベースに登録しておいてもよい。
【００２１】
次に、上述の本発明の実施の一形態における概括的な動作の一例を説明する。図２は、構造化文書の構造の一例の説明図、図３は、グローバル構造情報及び要素情報と構造情報の一例の説明図である。ここでは図２（Ａ）に示すように５階層の構造化文書が入力される場合を考える。各要素を○印で示しており、数字は各要素を特定するシーケンス番号（ＳＮｏ）である。
【００２２】
文書入力部１から図２（Ａ）に示すような構造化文書（及びコンテントタイプ）が入力されると、ディスパッチャ３は、入力された構造化文書のコンテントタイプに応じ、ここでは文書処理部５へ入力された構造化文書を渡す。
【００２３】
文書処理部５では、文書解析部６で構造化文書を解析し、文書分解部７でリレーショナルデータベース１３から読み込んだ設定に従い、文書を複数の部分構造に分解する。例えば図２（Ａ）において三角形で示した部分ごとに構造化文書を分解する。これによって図２（Ｂ）に示すように３つの部分構造となる。分解された部分構造は、再びファイル管理部２のディスパッチャ３に渡される。
【００２４】
このように部分構造への分解を行ったときに、各部分構造の関係を示すグローバル構造情報を生成してリレーショナルデータベース１３に格納する。図２（Ｂ）に示すように分解した３つの部分構造にそれぞれグローバルＩＤ（ＧＩＤと略す）として０，１，２と振り、構造を示す情報として、説明を簡単にするため親のＧＩＤを保持するとすれば、図３（Ａ）に示すようなそれぞれの部分構造の親のＧＩＤを並べたデータが得られる。このようなデータを、例えばメモリイメージとしてそのままレコード中のフィールドとして埋め込み、ここでは文書を一意に特定するための文書ＩＤとともにリレーショナルデータベース１３に格納する。
【００２５】
なお、部分構造へ分解する際に、下位の部分構造の頂点の要素が、その上位の部分構造にも含まれることになる。例えば図２に示した例では、ＳＮｏが３、８の要素については複数の部分構造にまたがる。このような場合には、上位の部分構造にダミーの要素を付加しておく。この例ではＧＩＤが０の部分構造に、ＳＮｏが３の要素の代わりにＳＮｏが１３の要素を、ＳＮｏが８の要素の代わりにＳＮｏが１４の要素を仮想的に付加している。なお、付加したダミーの要素を、マウントポイントと呼ぶことにする。
【００２６】
文書分解部７で分解された部分構造を受け取ったディスパッチャ３では、今度は部分構造を編集単位処理部８に渡す。編集単位処理部８では、文書解析部９で部分構造を解析し、差分解析部１０に渡す。ここでは新規の構造化文書であるので、差分解析部１０は部分構造を要素情報登録部１１及び構造情報登録部１２に渡す。
【００２７】
要素情報登録部１１では、部分構造中のそれぞれの要素に関する情報を要素情報としてリレーショナルデータベース１３に登録する。例えば図２（Ｂ）に示したＧＩＤが２の部分構造の場合、ＳＮｏが８〜１２の各要素の情報をリレーショナルデータベース１３に登録することになる。図３（Ｂ）に要素情報の一例を示しており、この例では各要素を特定するＳＮｏとともに、部分構造中で要素を特定するローカルナンバ（ＬＮｏ）、要素名、属性値をフィールド値としている。もちろん、フィールドの構成は任意であり、このほかにバージョン情報などを含んでいてもよい。この要素情報では各要素間の親子関係などは含まれていないが、例えば属性値の検索など、フィールド値による高速な検索が可能である。また、後述する構造情報とは、例えばＬＮｏやＳＮｏによって対応づけることができる。
【００２８】
構造情報登録部１２では、部分構造中の各要素間の関係を示す構造情報を生成する。構造情報は、どのようなデータ構造であってもよいが、図３（Ｃ）に示す例では、それぞれの要素の親のＬＮｏを並べたデータとして構成している。また、この例では構造情報のメモリイメージをそのままレコード中のフィールドとして埋め込み、さらに部分構造を一意に特定するためのＧＩＤとともにリレーショナルデータベース１３に格納する。
【００２９】
なお、図３（Ｂ）、（Ｃ）には、ＧＩＤが２の部分構造における要素情報及び構造情報のみを示しているが、同様の要素情報及び構造情報が、ＧＩＤが０，１の部分構造についても作成され、リレーショナルデータベース１３に登録される。また、図３に示したグローバル構造情報、要素情報、構造情報のデータ構造は一例であり、リレーショナルデータベース１３の設計時に任意に取り決めておくことができる。例えば後述する具体例においては、図３に示したデータ構造とは一部異なるデータ構造を用いている。
【００３０】
上述のようにして構造化文書が分解されてリレーショナルデータベース１３に登録されていると、部分構造を編集単位として文書の編集を行うことができる。例えば文書入力部１から部分構造の取り出しをファイル管理部２に要求することによって、検索部４が編集すべき部分構造をリレーショナルデータベース１３から読み出して文書入力部１に対して出力する。そして、文書入力部１において部分構造に対して編集処理を行った後、再びファイル管理部２に入力する。
【００３１】
ファイル管理部２に入力された編集後の部分構造（及びコンテントタイプ）は、ディスパッチャ３によって編集単位処理部８へ送られる。編集単位処理部８では、文書解析部９で部分構造を解析し、差分解析部１０に渡す。差分解析部１０では、リレーショナルデータベース１３に登録されている編集前の部分構造と文書解析部９から受け取った編集後の部分構造を比較し、その差分を抽出する。要素の編集としては、内容や属性値の変更の他、新たな追加、あるいは要素の削除などがある。要素情報登録部１１では、新たに追加された要素については、要素情報をリレーショナルデータベース１３に登録する。このとき、追加時のバージョン情報を付加してもよい。また、削除された要素については、レコードを削除したり、あるいは、当該要素に対応する要素情報に削除された旨の情報（例えば旧バージョン情報など）を付加する。変更の場合には、編集前の要素情報を削除、編集後の要素情報を追加する処理を行えばよい。
【００３２】
さらに、編集された部分構造に対応する構造情報の再構築を構造情報登録部１２において行う。この場合、再構築する構造情報は部分構造の範囲内だけでよく、構造化文書全体の構造情報を再構築する場合に比べて格段に少ない処理で済む。また、他の部分構造に影響しないので、他の部分構造を他人が編集中であっても全く問題なく再構築の処理を行うことができる。
【００３３】
また、文書入力部１からファイル管理部２に対して、文書構造の検索を要求することができる。要求を受け取った検索部４では、リレーショナルデータベース１３に登録されている構造化文書の中から検索条件に適合した文書構造を有する文書を検索して、文書入力部１に検索結果を返す。この文書構造の検索の際には、多くの場合、２つの要素間の先祖・子孫関係の検索が行われる。上述のように構造化文書を部分構造に分解して、部分構造間の関係を示すグローバル構造情報と、各部分構造内の要素間の関係を示す構造情報とを有していることによって、階層や枝の多い、大規模な構造化文書でも、容易に検索を行うことができる。
【００３４】
まず、同じ部分構造内に存在する要素間の先祖・子孫関係の検索は、当該要素が存在する部分構造の構造情報を参照すればよい。部分構造であるので、要素数も少なく、高速に先祖・子孫関係の検索を行うことができる。なお、部分構造内での先祖・子孫関係の検索方法は任意であり、従来から用いられている各種の文書構造の検索手法を用いることができる。
【００３５】
関係を検索する２つの要素が異なる部分構造に存在している場合には、まず、それぞれの要素が存在する部分構造間の先祖・子孫関係の検索を行う。この検索には、グローバル構造情報を参照すればよい。部分構造の数は要素の数に比べて格段に少なく、この検索は高速に実行可能である。またこの場合の検索手法は、それぞれの部分構造を１つの要素と考えれば従来から用いられている各種の文書構造の検索手法を用いることができる。
【００３６】
それぞれの要素が存在する部分構造が先祖・子孫の関係にある場合には、さらに、先祖側の部分構造から子孫側の部分構造へのパス上にあって、先祖側の部分構造の子の部分構造のルートとなる要素（すなわちマウントポイント）と先祖側の部分構造に含まれる要素との間の先祖・子孫関係を、先祖側の部分構造の構造情報によって求める。
【００３７】
例えば図２（Ａ）に示した例において、ＳＮｏ＝６の要素とＳＮｏ＝９の要素との先祖・子孫関係を求める場合、ＳＮｏ＝６の要素が含まれるＧＩＤ＝０の部分構造と、ＳＮｏ＝９の要素が含まれるＧＩＤ＝２の部分構造とは先祖・子孫の関係にあり、さらに、ＧＩＤ＝２の部分構造のルートとなる要素（ＳＮｏ＝８でありＳＮｏ＝１４でもある）とＳＮｏ＝６との先祖・子孫関係を、ＧＩＤ＝０の部分構造の構造情報を用いて調べる。これは先祖・子孫の関係にあるため、結果として、ＳＮｏ＝６とＳＮｏ＝９とは先祖・子孫関係にあると判断される。
【００３８】
同じＧＩＤ＝０の部分構造の要素でも、ＳＮｏ＝２の要素の場合、部分構造間の関係は先祖・子孫関係となるものの、ＳＮｏ＝２とＳＮｏ＝１４との関係は先祖・子孫関係にないため、ＳＮｏ＝２とＳＮｏ＝９の要素は先祖・子孫関係にないと判断される。
【００３９】
このように、部分構造間の先祖・子孫関係を調べた後に、先祖側の部分構造内の関係を調べるだけで、２つの要素間の先祖・子孫関係を調べることができる。要素数が膨大な、大規模な文書においては、従来のような要素を１つずつたぐってゆく検索手法では、このような先祖・子孫関係の検索は非常に時間のかかる処理である。しかし本発明によれば、短時間で、簡単に、先祖・子孫関係の検索を行うことができる。
【００４０】
なお、先祖側の部分構造に含まれる要素が、その部分構造のルートとなる要素である場合には、部分構造間の先祖・子孫関係の検索を行うだけでよい。なぜなら、その部分構造のルートとなる要素であれば、その部分構造の下位に存在するいずれの部分構造内の要素の親であることが明白だからである。このように後続の判定を行わないことによって、検索処理をさらに高速化することができる。
【００４１】
以下、具体例を用いながら上述の動作についてさらに詳細に説明してゆく。図４は、具体例におけるデータ構造の一例の説明図である。以下に説明する具体例では、図４に示すようなデータ構造を用いてグローバル構造情報、要素情報、構造情報をリレーショナルデータベース１３に登録し、利用する。
【００４２】
まずグローバル構造情報は、図４（Ａ）に示すように、それぞれの部分構造ごとに、最大ＧＩＤ、親ＧＩＤ、親の接続ＩＤ、編集単位ＩＤなどの情報を有し、これらの部分構造ごとのデータをＧＩＤの順に並べて構成されている。ＧＩＤは、ルートノードから深さ優先、左優先で探索される部分構造に対して順に振られたＩＤである。このＧＩＤの振り方は、後述する部分構造内の構造情報において各要素に振るノードオーダーと同様であり、後述するノードオーダーの振り方の説明によりＧＩＤの振り方の説明に代える。最大ＧＩＤは、当該部分構造よりも下位の部分構造のＧＩＤのうち最大のＧＩＤである。深さ優先でＧＩＤを振っているので、当該部分構造の下位の部分構造には、当該部分構造のＧＩＤから最大ＧＩＤまでのＧＩＤが振られている。また、最大ＧＩＤよりも大きいＧＩＤは、当該部分構造の下位には存在しないことが保証されている。親ＧＩＤは、当該部分構造の親となる部分構造のＧＩＤである。親の接続ＩＤは、例えば図２（Ｂ）に示す例ではＧＩＤが１の部分構造は、ＧＩＤが０の部分構造において仮想的に付加した要素のうちのいずれに接続されるかを示すものである。編集単位ＩＤは、当該部分構造をシステム全体で一意に識別するためのＩＤである。これらの情報は、例えばＧＩＤの数だけ並べてバイナリ形式でレコード中の１つのフィールド値とし、そのほかに文書ＩＤなどのフィールドを付加して、リレーショナルデータベース１３に保持させることができる。もちろん、保存時のデータ形式は任意である。
【００４３】
要素情報は、図４（Ｂ）に示すように、ノードテーブル、属性テーブル、テキストテーブルによって構成される。要素のうち、リーフとなる要素についてはテキストテーブルの情報を持ち、その他の要素についてはノードテーブル及び属性テーブルの情報を持つことになる。例えばノードテーブルと属性テーブルを一つのテーブルにするなど、変形は任意である。
【００４４】
ノードテーブルは、上述のＳＮｏ、ＬＮｏ、編集単位ＩＤ、要素名、文書ＩＤ、追加バージョン情報、削除バージョン情報、マウントポイント数などのフィールドを有している。ＳＮｏはシステム全体において一意に要素に振られたＩＤである。ＬＮｏは、部分構造内で一意に要素に振られたＩＤである。このＬＮｏは、文書構造とは無関係である。編集単位ＩＤは、当該要素を含んでいる部分構造を特定するＩＤである。要素名は、文書中の要素の名前である。文書ＩＤは、当該要素を含んでいる文書を特定するＩＤである。追加バージョン情報は、当該要素が追加されたバージョンを示す情報である。新規に文書が登録された時点では１となる。削除バージョン情報は、当該要素が削除される直前のバージョンを示す情報である。新規に文書が登録された時点ではＮＵＬＬであり、例えば最初の更新で削除されれば１となる。マウントポイント数は、当該要素の下位（子孫）に接続されるマウントポイントの数を示す。マウントポイントは、上述のように複数の部分構造にまたがる要素について、位の部分構造に付加したダミーの要素である。例えば図２（Ｂ）に示すＧＩＤが０の部分構造では、ＳＮｏが１の要素のマウントポイント数は２となる。また属性テーブルは、ＳＮｏ、属性名、属性値などのフィールドを有している。ＳＮｏはノードテーブルと同様である。属性名は当該要素の属性に付された名前であり、その値が属性値として格納される。
【００４５】
テキストテーブルは、ＳＮｏ、ＬＮｏ、編集単位ＩＤ、要素値、文書ＩＤ、追加バージョン情報、削除バージョン情報などのフィールドを有している。要素値には、リーフとなる要素が有している文書内容が格納される。また、例えば図２（Ｂ）に示す例においてＧＩＤが０の部分構造に仮想的に付加した要素は、その部分構造においてはリーフとなる要素である。この場合には、要素値として接続ＩＤが格納される。他のフィールドについては上述の通りである。
【００４６】
構造情報は、図４（Ｃ）に示すように、部分構造内の各要素ごとにＬＮｏ、ノードオーダー、最大ノードオーダーなどのデータが並べられている。ＬＮｏは上述の通りである。ノードオーダーは、部分構造内のルートとなる要素から深さ優先、左優先で探索される要素に対して順に振られたＩＤである。最大ノードオーダーは、部分構造中で当該要素よりも下位の要素のノードオーダーのうち最大のノードオーダーである。深さ優先でノードオーダーを振っているので、当該要素の下位の要素には、当該要素のノードオーダーから最大ノードオーダーまでのＩＤが振られている。また、最大ノードオーダーよりも大きいＩＤは、当該要素の下位には存在しないことが保証されている。これらの情報は、例えば、部分構造内に存在する要素の数（仮想的に設けた要素も含めて）だけ並べてバイナリ形式でレコード中の１つのフィールド値とし、そのほかにクラスタＩＤなどのフィールドを付加してリレーショナルデータベース１３に保持させることができる。もちろん、保存時のデータ形式は任意である。なお、クラスタＩＤは、上述の編集単位ＩＤと同様に部分構造を特定するＩＤであるが、構造情報は文書の編集などにより版が変わったときに再構築されるので、版が変わるごとに新たなクラスタＩＤが付与される。バージョン（版）管理を行わない場合には、クラスタＩＤは編集単位ＩＤでよい。
【００４７】
バージョンテーブルは、図４（Ｄ）に示すように、クラスタＩＤ、編集単位ＩＤ、バージョン情報、文書ＩＤなどによって構成されている。このバージョンテーブルによって、グローバル構造情報において部分構造に付した編集単位ＩＤと、バージョンごとに異なる部分構造内の文書構造を示す構造情報とを結びつけている。なお、別途、各文書について最新のバージョンを示す情報が保持されており、最新の文書を取り出す際にはその最新バージョン情報からバージョンテーブルを検索することによって、各部分構造についての最新の構造情報を得ることができる。また、属性情報については、上述のように削除バージョン情報がＮＵＬＬのレコードを取り出せば、最新の要素情報を取り出すことができる。バージョン（版）管理を行わない場合には、このバージョンテーブルを設けずに構成することもできる。
【００４８】
図５は、入力される構造化文書の具体例の説明図である。ここでは、ＸＭＬによって記述された、図５（Ａ）に示すような構造化文書が文書入力部１から入力されるものとする。この構造化文書の文書構造をツリー表現すると図５（Ｂ）に示すようになる。なお、図５（Ｂ）において○は要素を示し、内部の数字はＳＮｏを示している。抜けているＳＮｏについては、後述するようにマウントポイントに割り当てられる。
【００４９】
このような構造化文書が文書入力部１から入力されると、ディスパッチャ３は、入力された構造化文書を文書処理部５へ渡す。文書処理部５では、文書解析部６で構造化文書を解析し、文書分解部７でリレーショナルデータベース１３から読み込んだ設定に従い、文書を複数の部分構造に分解する。ここではＣＨＡＰＴＥＲ、ＳＥＣＴＩＯＮで分解することとする。
【００５０】
図６〜図８は、分解された部分構造ごとの文書の具体例の説明図である。各図において、分解された文書の記述を（Ａ）として示し、分解された部分構造のツリー表現を（Ｂ）として示している。以下の説明では図６に示す部分構造を編集単位ＩＤ＝０、図７に示す部分構造を編集単位ＩＤ＝１、図８に示す部分構造を編集単位ＩＤ＝２とする。また、この編集単位ＩＤとは別に、各部分構造にはＧＩＤが振られる。ここでは、図６に示す部分構造にＧＩＤ＝０、図７に示す部分構造にＧＩＤ＝１、図８に示す部分構造にＧＩＤ＝２を振るものとする。
【００５１】
図６に示す部分構造では、部分構造への分解の際に、図５（Ｂ）に示すＳＮｏ＝６の要素に対応する仮想的な要素（ＳＮｏ＝１６）を付加している。図６（Ａ）に示す文書の記述では、分解により他の部分構造に移した記述の部分を“＆Ｅ００１；”という記述に置き換えている。これが接続ＩＤとなる。図７に示す部分構造についても同様であり、図５（Ｂ）に示すＳＮｏ＝９の要素に対応する仮想的な要素（ＳＮｏ＝１８）を付加している。図７（Ａ）に示す文書の記述では、分解により他の部分構造に移した記述の部分を“＆Ｅ００２；”という接続ＩＤに置き換えている。この置き換えられた要素がマウントポイントとなる。
【００５２】
図９は、グローバル構造情報の具体例の説明図である。上述のように構造化文書を部分構造に分解すると、その時点で各部分構造間の関係がわかる。各部分構造間のツリー表現を図９（Ｂ）に示している。図９（Ｂ）において、各部分構造を三角形で表している。三角形の中には、ＧＩＤとともにマウントポイントの接続ＩＤを示している。
【００５３】
この部分構造間の関係をグローバル構造情報としてリレーショナルデータベース１３に登録する。この具体例では、グローバル構造情報は例えば図９（Ａ）に示すようになる。なお、ＧＩＤ＝１の部分構造は、ＧＩＤ＝０の部分構造中のマウントポイント（ＳＮｏ＝１６）に接続されるので、その接続ＩＤ（“＆Ｅ００１；”）のうちの数値部分のみを親の接続ＩＤとしてグローバル構造情報中に含めている。ＧＩＤ＝２の部分構造についても同様であり、親の接続ＩＤとしてＧＩＤ＝１の部分構造中のマウントポイント（ＳＮｏ＝１８）の接続ＩＤ（“＆Ｅ００２；”）のうちの数値部分のみを親の接続ＩＤとしてグローバル構造情報中に含めている。
【００５４】
このようなグローバル構造情報は、文書ＩＤを付加してリレーショナルデータベース１３に登録する。このとき、例えばバイナリ形式のままフィールド値として格納しておくことによって、検索時のパフォーマンスを向上させることができる。
【００５５】
図６（Ａ）、図７（Ａ）、図８（Ａ）に示した、分解された部分構造の記述は、再びファイル管理部２に戻される。ファイル管理部２のディスパッチャ３は、これらの分解された部分構造の記述を編集単位処理部８に渡す。編集単位処理部８では、文書解析部９で各部分構造の記述を解析し、差分解析部１０に渡す。差分解析部１０では、新規の構造化文書であるので、文書解析部９による部分構造の解析結果を要素情報登録部１１及び構造情報登録部１２に渡す。
【００５６】
要素情報登録部１１では、各部分構造の記述から、要素情報を生成する。図４（Ｂ）に示した要素情報のデータ構造に従い、リーフに対応する要素についてはテキストテーブルを生成し、それ以外の要素についてはノードテーブル及び属性テーブルを生成する。図１０、図１１は、要素情報の具体例の説明図である。図１０（Ａ）はノードテーブル、図１０（Ｂ）は属性テーブル、図１１はテキストテーブルを示している。ＳＮｏは、図６〜図８では説明のためにすでに振られているが、実際には編集単位処理部８に各部分構造の記述が入力されて解析することによって、要素の出現順に振られる。ＬＮｏについても、各部分構造内で文書構造には関係なく振られる。追加バージョンには、新規登録時には１が格納される。また削除バージョンには、新規登録時には‘ＮＵＬＬ’が格納される。マウントポイント数には、仮想的な要素（ＳＮｏ＝１２，１４）が下位に接続されているＳＮｏ＝０，３，６の要素について‘１’となり、他の要素については０となる。このような要素情報がリレーショナルデータベース１３に登録される。
【００５７】
構造情報登録部１２では、部分構造中の各要素間の関係を示す構造情報を生成する。図４（Ｃ）に示した構造情報のデータ構造に従い、それぞれの要素のＬＮｏ、ノードオーダー、最大ノードオーダーを求めて格納してゆく。図１２は、構造情報を生成する処理の一例を示すフローチャートである。ここではＸＭＬのタグ及びテキストが順次切り出され、そのたびにそれぞれの処理を行うものとし、またＬＮｏについても別途付与されるものとして説明する。なお、処理を進めるためにＬＮｏ及びインデックスの値を格納するためのスタックを用いる。
【００５８】
Ｓ２１において、初期設定としてインデックスを０にセットしておく。Ｓ２２において、タグまたはテキストの切出を検知し、ＬＮｏを取得する。Ｓ２３において、タグまたはテキストが存在していたか否かを判定し、タグまたはテキストを切り出すことができず、部分構造の記述が終了していればこの処理を終了する。
【００５９】
Ｓ２４において、切り出された要素がテキストか否かを判断し、切り出された要素がタグであればさらにＳ２５において開始タグか終了タグかを判定する。切り出された要素が開始タグの場合には、Ｓ２６において、Ｓ２２で取得したＬＮｏと現在のインデックスをスタックに積む。そしてＳ２７において、インデックスの値を１だけ増加させる。
【００６０】
切り出された要素がテキストの場合には、Ｓ２８において、現在のインデックスの値をノードオーダー及び最大ノードオーダーとし、Ｓ２２で取得したＬＮｏに対応する構造情報の位置に、ＬＮｏ、ノードオーダー、最大ノードオーダーを格納する。
【００６１】
切り出された要素が終了タグの場合には、Ｓ２９において、スタックからＬＮｏ及びインデックスを取り出し、Ｓ３０において、ノードオーダーとしてスタックから取り出したインデックスの値、最大ノードオーダーとして現在のインデックスの値をセットし、スタックから取り出したＬＮｏに対応する構造情報の位置に、ＬＮｏ、ノードオーダー、最大ノードオーダーを格納する。
【００６２】
このような処理を行うと、ノードオーダーとして、それぞれの要素には深さ優先、左優先で探索された順に番号付けが行われる。図１３は、編集単位ＩＤが２の部分構造における構造情報生成過程の一例の説明図である。図１０（Ａ）及び図１１に示したように、各要素にはＬＮｏが振られている。このＬＮｏは文書構造とは関係なく振られている。図８（Ａ）に示すような編集単位ＩＤが２のＸＭＬによる記述をもとに、図１２に示した処理を実行する。なお、図１３において矩形で囲んだ３つ組の数値は、左からＬＮｏ、ノードオーダー、最大ノードオーダーである。
【００６３】
ＬＮｏ＝０，１，２についてはＬＮｏとそのときのインデックス（０，１，２）がスタックに積まれる。ＬＮｏ＝５のリーフノードの要素において、ＬＮｏ＝５、ノードオーダー＝３、最大ノードオーダー＝３が構造情報として格納される。スタックからＬＮｏ＝２とインデックス＝２が取り出され、ＬＮｏ＝２、ノードオーダー＝２、最大ノードオーダー＝３が構造情報として格納される。さらにスタックからＬＮｏ＝１とインデックス＝１が取り出され、ＬＮｏ＝１、ノードオーダー＝１、最大ノードオーダー＝３が構造情報として格納される。
【００６４】
次にＬＮｏ＝３，４についてはスタックに当該ＬＮｏとインデックス＝４，５が積まれる。ＬＮｏ＝６のリーフノードの要素において、ＬＮｏ＝６、ノードオーダー＝６、最大ノードオーダー＝６が構造情報として格納される。スタックからＬＮｏ＝４とインデックス＝５が取り出され、ＬＮｏ＝４、ノードオーダー＝５、最大ノードオーダー＝６が構造情報として格納される。さらにスタックからＬＮｏ＝３とインデックス＝４が取り出され、ＬＮｏ＝３、ノードオーダー＝４、最大ノードオーダー＝６が構造情報として格納される。さらにまた、スタックからＬＮｏ＝０とインデックス＝０が取り出され、ＬＮｏ＝０、ノードオーダー＝０、最大ノードオーダー＝６が構造情報として格納される。
【００６５】
図１４は、構造情報及びバージョンテーブルの具体例の説明図である。上述のような処理によって、各部分構造ごとに図１４（Ａ）〜（Ｃ）に示すような構造情報が得られる。特に編集単位ＩＤが２の部分構造においては、図１３を用いて詳述したような処理によって、図１４（Ｃ）に示すような構造情報が得られることになる。図１４では構造情報をテーブル形式で表現しているが、これらのデータはバイナリ形式でレコード中のフィールドに格納され、さらにクラスタＩＤが付されてリレーショナルデータベース１３に登録される。また、図１４（Ｄ）に示すように、バージョンごとにクラスタＩＤと編集単位ＩＤとを対応づけるバージョン情報のレコードが各部分構造ごとに生成され、リレーショナルデータベース１３に登録される。
【００６６】
以上説明したようにして、図５に示した構造化文書は、図６〜図８に示したように部分構造に分割され、部分構造の間の関係を示すグローバル構造情報と、各要素の情報を格納した要素情報と、部分構造内の各要素間の関係を示す構造情報、それに編集時に備えてバージョンテーブルが生成され、リレーショナルデータベース１３に登録される。
【００６７】
なお、文書の編集は部分構造ごとに行われる。編集後の部分構造はファイル管理部２に入力され、ディスパッチャ３が編集単位処理部８へ渡す。編集単位処理部８では、渡された編集後の部分構造について、文書解析部９で解析し、差分解析部１０は解析結果をもとにリレーショナルデータベース１３に登録されている編集前の部分構造との差分を抽出する。そして、追加あるいは編集されて変更された後の要素については新たなバージョン情報を追加バージョン情報とした要素情報を生成し、リレーショナルデータベース１３に登録する。また削除あるいは編集されて変更される前の要素については、編集直前のバージョン情報を削除バージョン情報として当該フィールドに書き込んでおく。また、編集された部分構造の構造情報を再構築し、新たなクラスタＩＤを付してリレーショナルデータベース１３に登録し、また、対応するバージョンテーブルのレコードを生成して同じくリレーショナルデータベース１３に登録する。
【００６８】
このようにして編集が加えられた場合のバージョン管理を行うことができる。このようなバージョン管理によって、例えば最新版の文書の要素情報は削除バージョンがＮＵＬＬのレコードを取り出せばよく、簡単に最新版の文書あるいは部分構造を取り出すことができる。もちろん、このようなバージョン管理を行わないで構成することも可能である。その場合には、データ構造をより簡略化することができる。
【００６９】
次に、文書構造の検索を行う場合について具体例を用いて説明する。文書構造の検索を行う場合、その検索条件としては、ある属性を有する要素の下位に、ある属性を有する要素が存在する文書構造、といった条件が設定される場合が考えられる。ここではそのような検索条件による文書構造の検索を考え、一例として、要素の属性条件ａを満たす要素の集合Ａ｛ａｉ｜１≦ｉ≦Ｎａ｝（ただしＮａは属性条件ａを満たす要素数。以下｛ａｉ｝と記す。）に含まれる１つの要素が、要素の内容条件ｂを満たす要素の集合Ｂ｛ｂｊ｜１≦ｊ≦Ｎｂ｝（ただしＮｂは属性条件ｂを満たす要素数。以下｛ｂｊ｝と記す。）のうち、いずれか一つ以上の要素を子孫に持つ集合を求める場合の動作について説明する。なお、要素の属性条件ａを満たす要素の集合Ａ｛ａｉ｝、及び、要素の内容条件ｂを満たす要素の集合Ｂ｛ｂｊ｝は、例えば図１０（Ａ）に示すノードテーブル及び図１１に示すテキストテーブルなどの要素情報に対して、属性値のフィールドで検索を行うことによって容易に求めることができる。
【００７０】
図１５は、本発明の実施の一形態における２要素間の先祖・子孫関係の検索処理の一例を示すフローチャートである。ここでは集合Ａ｛ａｉ｝に含まれる１つの要素ａｉと、集合Ｂ｛ｂｊ｝に含まれる１つの要素ｂｊとの間の先祖・子孫関係を判定する処理を示している。なお、要素ａｉが含まれる部分構造をＣａｉ、要素ｂｊが含まれる部分構造をＣｂｊとする。また、要素ａｉについては、その要素ａｉが含まれる部分構造Ｃａｉにおいて、要素ａｉがルートとなる要素であるか否かが、わかっているものとする。
【００７１】
まずＳ４１において、要素ａｉと要素ｂｊが同じ文書に含まれているか否かを判定する。この判定は、要素情報中の文書ＩＤを比較すればよい。別の文書であれば以降の処理を行わずに、先祖・子孫関係にはないと判定する。なお、例えば要素ｂｊを文書ＩＤごとに昇順にソートしておくと、要素ａｉの文書ＩＤを上回った時点で以後の要素ｂｊについては先祖・子孫関係にはないと判定して処理を終了することができる。もちろん、降順にソートしておいて、要素ａｉの文書ＩＤを下回った時点で処理を終了しても同様である。
【００７２】
要素ａｉと要素ｂｊが同じ文書に含まれている場合、まずＳ４２において、要素ａｉが含まれる部分構造Ｃａｉと、要素ｂｊが含まれる部分構造Ｃｂｊが同一の部分構造か否かを判定する。この判定は、部分構造Ｃａｉと部分構造ＣｂｊのクラスタＩＤが一致するか否かを判定することにより行うことができる。部分構造Ｃａｉと部分構造Ｃｂｊが同一である場合には、要素ａｉと要素ｂｊは同じ部分構造内の要素である。この場合、当該部分構造内で要素ａｉと要素ｂｊの先祖・子孫関係を判定すればよい。
【００７３】
このとき、Ｓ４３において、要素ａｉが部分構造Ｃａｉのルートノードであるか否かを判定する。要素ａｉがルートノードである場合には、同じ部分構造内の要素ｂｊは必ず要素ａｉの子孫である。従って、要素ａｉと要素ｂｊは先祖・子孫関係にあると判定する。
【００７４】
要素ａｉが部分構造Ｃａｉのルートノードではない場合には、Ｓ４４において、要素ａｉと要素ｂｊの先祖・子孫関係を判定する。この場合には要素ａｉと要素ｂｊが同じ部分構造内であるので、当該部分構造の構造情報を用いて先祖・子孫関係を判定することができる。判定は、要素ａｉのノードオーダー及び最大ノードオーダーと、要素ｂｊのノードオーダーを用い、
（要素ａｉのノードオーダー）＜（要素ｂｊのノードオーダー）≦（要素ａｉの最大ノードオーダー）
が成り立てば、要素ｂｊは要素ａｉの子孫であると判定できる。この条件が満たされない場合、要素ｂｊは要素ａｉの子孫ではないと判定できる。
【００７５】
要素ａｉが含まれる部分構造Ｃａｉと、要素ｂｊが含まれる部分構造Ｃｂｊが異なる部分構造である場合には、基本的には部分構造Ｃａｉと部分構造Ｃｂｊの先祖・子孫関係を調べ、その後、要素ａｉと部分構造Ｃａｉ内のマウントポイントとの関係を調べる。まずＳ４５において、要素ａｉのマウントポイント数を調べる。マウントポイント数が０であれば、下位の部分構造には要素ａｉの子孫が存在しないことが明らかであるので、この時点で要素ａｉと要素ｂｊは先祖・子孫関係にはないと判定できる。この判定によって、処理の高速化を図っている。またこの場合には、部分構造Ｃａｉに含まれない要素ｂｊについては、すべて先祖・子孫関係にはない。従って、要素ａｉに対する検索においては、集合Ｂのうち、部分構造Ｃａｉに含まれない要素ｂｊについては検索不要としてフラグを立てておくとよい。
【００７６】
要素ａｉのマウントポイント数が０でないときには、Ｓ４６において、部分構造Ｃａｉと部分構造Ｃｂｊとの先祖・子孫関係を調べる。グローバル構造情報を参照して部分構造ＣａｉのＧＩＤ、最大ＧＩＤと、部分構造ＣｂｊのＧＩＤを取得し、
（ＣａｉのＧＩＤ）＜（ＣｂｊのＧＩＤ）≦（Ｃａｉの最大ＧＩＤ）
を判定する。この条件が成り立つとき、部分構造Ｃａｉと部分構造Ｃｂｊとは先祖・子孫関係にあると言える。この条件が成り立たないとき、部分構造Ｃａｉと部分構造Ｃｂｊとは先祖・子孫関係にはなく、従って要素ａｉと要素ｂｊも先祖・子孫関係ではないと判定する。なお、部分構造Ｃａｉと部分構造Ｃｂｊが先祖・子孫関係でない場合には、部分構造Ｃａｉに含まれるすべての集合Ａの要素について、部分構造Ｃｂｊに含まれる集合Ｂの検索は不要であるというフラグを立てておくとよい。これによって不要な検索処理を行わずに済み、処理の高速化を図ることができる。
【００７７】
部分構造Ｃａｉと部分構造Ｃｂｊとが先祖・子孫関係にある場合には、次に要素ａｉと部分構造Ｃａｉ内のマウントポイントとの関係を調べるが、処理量を軽減するために、Ｓ４７において、要素ａｉが部分構造Ｃａｉのルートノードであるか否かを判定する。要素ａｉがルートノードである場合には、要素ａｉは、部分構造Ｃａｉの下位の部分構造に含まれるすべての要素の先祖であることが必ず言える。従って、部分構造Ｃａｉと部分構造Ｃｂｊとが先祖・子孫関係であり、かつ、要素ａｉが部分構造Ｃａｉのルートノードである場合には、要素ａｉと要素ｂｊは先祖・子孫関係にあると判定する。
【００７８】
Ｓ４８では、要素ａｉと部分構造Ｃａｉ内のマウントポイントとの関係を調べる。部分構造Ｃｂｊから部分構造Ｃａｉまでのパスをたどり、そのパス上にあって、部分構造Ｃａｉの直下の部分構造のルートノードに対応する部分構造Ｃａｉにおけるマウントポイントを求め、そのマウントポイントのノードオーダー（ｍとする）を取得する。この処理は、グローバル構造情報を用いて行うことができ、部分構造Ｃｂｊから親ＧＩＤをたどってゆき、親ＧＩＤが部分構造ＣａｉのＧＩＤとなったとき、その部分構造が部分構造Ｃａｉの直下の部分構造である。そして、その部分構造Ｃａｉの直下の部分構造のグローバル構造情報中の親の接続ＩＤの値を取得することによって、部分構造Ｃａｉ中のマウントポイントを求めることができる。さらにマウントポイントの要素情報及び構造情報からノードオーダーを取得することができる。
【００７９】
そして、要素ａｉのノードオーダーと最大ノードオーダー、それにマウントポイントのノードオーダーｍの関係が
（要素ａｉのノードオーダー）≦ｍ≦（要素ａｉの最大ノードオーダー）
を満たすか否かを判定する。この条件を満たすとき、要素ａｉとマウントポイントとは先祖・子孫関係にあり、よって、要素ａｉと要素ｂｊとは先祖・子孫関係にあると判断することができる。また、この条件が満たされないとき、要素ａｉとマウントポイントとは先祖・子孫の関係にはなく、よって、要素ａｉと要素ｂｊとは先祖・子孫関係にはないと判断することができる。さらに、この条件が満たされないときには、要素ａｉの検索において、部分構造Ｃｂｊに含まれる集合Ｂの要素は検索しなくてよいものとしてフラグを立てておくことによって、検索処理を高速化することができる。
【００８０】
上述の処理はある要素ａｉと要素ｂｊが特定された場合の先祖・子孫関係の判定処理であるが、このような処理を、集合Ａ中のある要素ａｉについて、集合Ｂ中のそれぞれの要素ｂｊについて行うことになる。要素ｂｊの選択の際には、Ｓ４５，Ｓ４６，Ｓ４８において検索不要のフラグを立てた要素については検索対象から外すことによって、検索処理を高速化できる。
【００８１】
さらに、集合Ａ中の要素を変更し、同様にして集合Ｂ内のそれぞれの要素との判定を行ってゆけばよい。このときにも、Ｓ４６におけるフラグを考慮することによって、検索処理を高速化することができる。
【００８２】
検索結果としては、例えば検索条件が、ある属性を有する要素の下位に、ある属性を有する要素が存在する文書構造の存在するか否かのみである場合には、存在する、あるいは存在しないのみを結果とすればよい。この場合には、ある２つの要素間で先祖・子孫関係が確認できた時点で処理を終了することができる。また、ある属性を有する要素の下位に、ある属性を有する要素が存在する文書構造の実体の検索であれば、例えば条件を満たす集合Ａの要素、あるいは要素を含む部分構造、または要素を含む文書ＩＤ、などを検索結果とすればよい。
【００８３】
図５以降で説明してきた具体例を用いて、上述の検索処理についていくつかの例を説明する。図１６、図１７は、２要素間の先祖・子孫関係の検索処理の一例における具体的な動作の一例の説明図である。各図においては、説明に関係する要素部分のみを示している。まず、属性ＳＥＣＴＩＯＮの要素の下位に本文の要素を有する文書構造を検索する場合を図１６（Ａ）に示している。この場合、属性ＳＥＣＴＩＯＮを有する要素は、ＳＮｏ＝９の要素である。また、本文はＳＮｏ＝２０の要素である。図１０（Ａ）及び図１１から、両者とも編集単位ＩＤが２であり、同じ部分構造（編集単位ＩＤ＝２，ＧＩＤ＝２）に属すことがわかる。さらに、ＳＮｏ＝９の要素はこの部分構造のルートノードである。従って、Ｓ４３において、この２つの要素は先祖・子孫関係にあると判定される。
【００８４】
次に、属性ＤＯＣＩＴＥＭの要素の下位に本文の要素を有する文書構造を検索する場合を図１６（Ｂ）に示している。この場合、属性ＤＯＣＩＴＥＭを有する要素は、ＳＮｏ＝１２の要素である。また、本文はＳＮｏ＝２０の要素である。図１０（Ａ）及び図１１から、両者とも編集単位ＩＤが２であり、同じ部分構造（編集単位ＩＤ＝２，ＧＩＤ＝２）に属する。しかし、ＳＮｏ＝１２の要素はこの部分構造のルートノードではない。そのため、さらにＳＮｏ＝１２の要素とＳＮｏ＝２０の要素の先祖・子孫関係をＳ４４で判定する。すなわち、図１０に示す要素情報からＳＮｏ＝１２のＬＮｏが３であり、図１４（Ｃ）に示す編集単位ＩＤ＝２の構造情報からノードオーダーが４、最大ノードオーダーが６であることが求まる。また同様に、図１１に示す要素情報（テキストテーブル）からＳＮｏ＝２０のＬＮｏが６であり、図１４（Ｃ）に示す編集単位ＩＤ＝２の構造情報からノードオーダーが６であることが求まる。このＳＮｏ＝２０の要素のノードオーダー＝６は、ＳＮｏ＝１２の要素のノードオーダー＝４と最大ノードオーダー＝６の範囲内であるので、ＳＮｏ＝１２の要素とＳＮｏ＝２０の要素とは先祖・子孫関係にあると判定される。
【００８５】
図１６（Ｃ）に示す例では、属性ＣＨＡＰＴＥＲの要素の下位に本文の要素を有する文書構造を検索する場合を示している。この場合、図１０，図１１に示す要素情報の検索から、属性ＣＨＡＰＴＥＲを有する要素は、ＧＩＤ＝１の部分構造（編集単位ＩＤ＝１）に属するＳＮｏ＝６の要素である。また、本文はＧＩＤ＝２の部分構造（編集単位ＩＤ＝２）に属するＳＮｏ＝２０の要素である。両者は異なる部分構造に属する。また、図１０（Ａ）に示すノードテーブルから、ＳＮｏ＝６の要素は、マウントポイント数が１であり、子孫にマウントポイントが存在する。そして、図９に示すグローバル構造情報から、ＧＩＤ＝１の部分構造とＧＩＤ＝２の部分構造は、先祖・子孫関係にある。これらの判定によってＳ４７へ進み、ＳＮｏ＝６の要素がＧＩＤ＝１の部分構造のルートノードであることから、ＧＩＤ＝１の部分構造に属するＳＮｏ＝６の要素と、ＧＩＤ＝２の部分構造に属するＳＮｏ＝２０の要素とは先祖・子孫関係にあると判定される。
【００８６】
図１６（Ｄ）に示す例では、属性ＰＡＲＴの要素の下位に属性ＤＯＣＩＴＥＭの要素を有する文書構造を検索する場合を示している。この場合、図１０，図１１に示す要素情報の検索から、属性ＰＡＲＴを有する要素は、ＧＩＤ＝０の部分構造（編集単位ＩＤ＝０）に属するＳＮｏ＝３の要素である。また、属性ＤＯＣＩＴＥＭを有する要素はＧＩＤ＝２の部分構造（編集単位ＩＤ＝２）に属するＳＮｏ＝１２の要素である。また、要素情報より、両者の編集単位ＩＤは異なり、両者は異なる部分構造に属する。さらに要素情報より、ＳＮｏ＝３の要素のマウントポイント数は１であり、子孫にマウントポイントが存在することがわかる。そして、ＧＩＤ＝０の部分構造とＧＩＤ＝２の部分構造は、グローバル構造情報を参照することによって、先祖・子孫関係にあることがわかる。しかし、ＳＮｏ＝３の要素は、ＧＩＤ＝０の部分構造におけるルートノードではない。従ってＳ４８の判定を行うことになる。
【００８７】
この場合、ＧＩＤ＝２のグローバル構造情報の親ＧＩＤから、ＧＩＤ＝２の部分構造の親はＧＩＤ＝１の部分構造である。同様に、ＧＩＤ＝１のグローバル構造情報の親ＧＩＤから、ＧＩＤ＝１の部分構造の親はＧＩＤ＝０の部分構造である。このパス上でＧＩＤ＝０の部分構造の直下の部分構造、すなわちＧＩＤ＝１の部分構造のルートノードに対応するＧＩＤ＝０の部分構造のマウントポイントを求める。すなわち、ＧＩＤ＝１のグローバル構造情報における親の接続ＩＤを取得すると、“００１”となっており、属性値としてＥ００１を有する要素を図１１に示す要素情報から検索する。すると、ＳＮｏ＝１６の要素がマウントポイントであることがわかる。
【００８８】
さらに、図１０（Ａ）に示す要素情報からＳＮｏ＝３の要素のＬＮｏが３であり、図１４（Ａ）に示すＧＩＤ＝０の構造情報中のＬＮｏ＝３を参照することによって、ＳＮｏ＝３の要素のノードオーダーが４，最大ノードオーダーが８であることがわかる。同様に図１１に示す要素情報からＳＮｏ＝１６の要素のＬＮｏが８であり、図１４（Ａ）に示すＧＩＤ＝０の構造情報中のＬＮｏ＝８を参照することにより、ＳＮｏ＝１６のマウントポイントのノードオーダーが８であることがわかる。このＳＮｏ＝１６のマウントポイントのノードオーダー＝８は、ＳＮｏ＝３の要素のノードオーダー＝４と最大ノードオーダー＝８の範囲内である。従って、ＳＮｏ＝１６のマウントポイントとＳＮｏ＝３の要素とは先祖・子孫関係にある。従って、ＧＩＤ＝０の部分構造に属するＳＮｏ＝３の要素と、ＧＩＤ＝２の部分構造に属するＳＮｏ＝１２の要素とは先祖・子孫関係にあると判定される。
【００８９】
図１７（Ａ）に示す例では、属性ＴＩＴＬＥの要素の下位に属性ＤＯＣＩＴＥＭの要素を有する文書構造を検索する場合を示している。この場合、図１０，図１１に示す要素情報の検索から、属性ＴＩＴＬＥを有する要素は、ＧＩＤ＝０の部分構造（編集単位ＩＤ＝０）に属するＳＮｏ＝１の要素とＳＮｏ＝４の要素、ＧＩＤ＝１の部分構造（編集単位ＩＤ＝１）に属するＳＮｏ＝７の要素、ＧＩＤ＝２の部分構造（編集単位ＩＤ＝２）に属するＳＮｏ＝１０の要素の４つである。また、属性ＤＯＣＩＴＥＭを有する要素はＧＩＤ＝２の部分構造（編集単位ＩＤ＝２）に属するＳＮｏ＝１２の要素である。
【００９０】
このうち、ＳＮｏ＝１，４，７の要素については、ＳＮｏ＝１２の要素とは異なる部分構造に属している。しかし、ＳＮｏ＝１，４，７の要素は、図１０（Ａ）に示す要素情報からマウントポイント数が０であり、Ｓ４５においてＳＮｏ＝１２の要素との先祖・子孫関係は否定される。
【００９１】
また、ＳＮｏ＝１０の要素については、ＳＮｏ＝１２の要素と同じ部分構造（編集単位ＩＤ＝２，ＧＩＤ＝２）に属している。さらにＳＮｏ＝１０の要素は、この部分構造のルートノードではない。そのため、Ｓ４４においてＳＮｏ＝１０の要素とＳＮｏ＝１２の要素の先祖・子孫関係の判定を行う。ＳＮｏ＝１０の要素に対応するノードオーダーと最大ノードオーダーは、図１４（Ｃ）に示す編集単位ＩＤ＝２の構造情報から、それぞれ１，３である。また同様にＳＮｏ＝１２の要素に対するノードオーダーは４である。このＳＮｏ＝１２の要素に対するノードオーダー＝４は、ＳＮｏ＝１０の要素に対応するノードオーダー＝１と最大ノードオーダー＝３の範囲に入っていないので、ＳＮｏ＝１０の要素とＳＮｏ＝１２の要素との先祖・子孫関係は否定される。
【００９２】
図５以降で説明した具体例では、図１５のＳ４６，Ｓ４８で先祖・子孫関係が否定されることはないが、例えば図２に示したような文書構造の場合にあり得る。図１７（Ｂ）には、属性「章題」の要素の下位に属性「図表」の要素を有する文書構造を検索する場合を示している。以下の説明では詳細は省略するが、属性「章題」の要素としてＳＮｏ＝２の要素が検索され、属性「図表」の要素としてＳＮｏ＝１２の要素が検索される。この２つの要素は、それぞれＧＩＤ＝０の部分構造とＧＩＤ＝２の部分構造に含まれており、異なる部分構造に含まれていることがわかる。また、ＳＮｏ＝２の要素の下位には、マウントポイントが存在している。さらに、ＧＩＤ＝０の部分構造とＧＩＤ＝２の部分構造とは、先祖・子孫関係にある。従って、図１５のＳ４８の判定を行うが、ＧＩＤ＝２の部分構造のルートノードに対応するマウントポイントはＳＮｏ＝１４の要素であり、ＳＮｏ＝２とは先祖・子孫関係にはない。従って、ＳＮｏ＝２の要素とＳＮｏ＝１２の要素との先祖・子孫関係は否定される。
【００９３】
図１７（Ｃ）に示した例では、図２に示した文書構造において、属性「タイトル」の要素の下位に属性「図表」の要素を有する文書構造を検索する場合を示している。やはり詳細な説明は省略するが、属性「タイトル」の要素としてＳＮｏ＝３の要素が検索され、属性「図表」の要素としてＳＮｏ＝１２の要素が検索される。この２つの要素は、それぞれＧＩＤ＝１の部分構造とＧＩＤ＝２の部分構造に含まれており、異なる部分構造に含まれていることがわかる。この例ではＳＮｏ＝３の要素の下位にはマウントポイントが存在していないので、Ｓ４５の判定によってＳＮｏ＝３の要素とＳＮｏ＝１２の要素との先祖・子孫関係は否定される。仮にＳＮｏ＝３の要素の下位にマウントポイントが存在していた場合でも、ＧＩＤ＝１の部分構造とＧＩＤ＝２の部分構造とが先祖・子孫関係にはないので、Ｓ４６の判定によってＳＮｏ＝３の要素とＳＮｏ＝１２の要素との先祖・子孫関係は否定される。
【００９４】
以上のように、構造化文書を部分構造に分解して、部分構造間の関係を示すグローバル構造情報と、部分構造内の要素間の関係を示す構造情報を保持しているので、上述のように文書構造の検索を行うに際して、２つの要素間の先祖・子孫関係を判定する処理を、高速に実行することができる。
【００９５】
なお、上述の検索処理の説明では、文書のバージョンについては触れていないが、例えば検索条件としてバージョンに関する条件を付加することによって、任意のバージョンに対する文書構造の検索を行うことが可能である。また、上述の検索処理の具体例では、図４に示したデータ構造に従った検索処理の一例を示しているが、図４に示したデータ構造は一具体例であって、他のデータ構造を適用可能であり、その場合の検索処理についても本発明の趣旨を逸脱しない範囲で任意の検索手法を適用可能である。
【００９６】
上述の実施の形態では、構造に関する情報を部分構造間の関係を示すグローバル構造情報と要素間の関係を示す構造情報で管理構成する構成を示したが、さらに、本発明を多段階に分割したグローバル構造情報に適用することで、さらに大規模な構造化文書の検索を高速に実施できるような構成も可能である。
【００９７】
【発明の効果】
以上の説明から明らかなように、本発明によれば、構造化文書を部分構造に分解して、部分構造間の関係を示す第１の構造情報（グローバル構造情報）と、部分構造内の要素間の関係を示す第２の構造情報（構造情報）を保持するようにしたので、例えば文書の編集を行う場合でも、部分構造単位での編集を行うことによって、編集の影響を部分構造内にとどめることができる。そのため、例えば部分構造ごとに編集を行えば並行して複数人が編集を行うことができ、共同編集環境を提供することができる。また、編集による構造情報の再構築を部分構造内にとどめることができ、構造情報の再構築に要する時間を短縮することができる。
【００９８】
また、構造化文書に対して頻繁に行われる文書構造の検索に対しても、２要素間の先祖・子孫関係の判定を、部分構造間の先祖・子孫関係の判定と、先祖側の部分構造内の要素とマウントポイントとの判定を行うだけで実行できる。従って、従来のように１つずつ要素をたぐってゆくなどの処理が簡略化され、高速に２要素間の先祖・子孫関係の判定を行って、文書構造の検索の高速化を図ることができるという効果がある。
【図面の簡単な説明】
【図１】  本発明の実施の一形態を示すブロック図である。
【図２】  構造化文書の構造の一例の説明図である。
【図３】  グローバル構造情報及び要素情報と構造情報の一例の説明図である。
【図４】  具体例におけるデータ構造の一例の説明図である。
【図５】  入力される構造化文書の具体例の説明図である。
【図６】  分解された部分構造ごとの文書の具体例（編集単位ＩＤ＝０）の説明図である。
【図７】  分解された部分構造ごとの文書の具体例（編集単位ＩＤ＝１）の説明図である。
【図８】  分解された部分構造ごとの文書の具体例（編集単位ＩＤ＝２）の説明図である。
【図９】  グローバル構造情報の具体例の説明図である。
【図１０】  要素情報（ノードテーブル及び属性テーブル）の具体例の説明図である。
【図１１】  要素情報（テキストテーブル）の具体例の説明図である。
【図１２】  構造情報を生成する処理の一例を示すフローチャートである。
【図１３】  編集単位ＩＤが２の部分構造における構造情報生成過程の一例の説明図である。
【図１４】  構造情報及びバージョンテーブルの具体例の説明図である。
【図１５】  本発明の実施の一形態における２要素間の先祖・子孫関係の検索処理の一例を示すフローチャートである。
【図１６】  ２要素間の先祖・子孫関係の検索処理の一例における具体的な動作（先祖・子孫関係にある場合）の一例の説明図である。
【図１７】  ２要素間の先祖・子孫関係の検索処理の一例における具体的な動作（先祖・子孫関係にない場合）の一例の説明図である。
【符号の説明】
１…文書入力部、２…ファイル管理部、３…ディスパッチャ、４…検索部、５…文書処理部、６…文書解析部、７…文書分解部、８…編集単位処理部、９…文書解析部、１０…差分解析部、１１…要素情報登録部、１２…構造情報登録部、１３…リレーショナルデータベース。
【図１】
0004045400.tif 000002
【図２】
0004045400.tif 000003
【図３】
0004045400.tif 000004
【図４】
0004045400.tif 000005
【図５】
0004045400.tif 000006
【図６】
0004045400.tif 000007
【図７】
0004045400.tif 000008
【図８】
0004045400.tif 000009
【図９】
0004045400.tif 000010
【図１０】
0004045400.tif 000011
【図１１】
0004045400.tif 000012
【図１２】
0004045400.tif 000013
【図１３】
0004045400.tif 000014
【図１４】
0004045400.tif 000015
【図１５】
0004045400.tif 000016
【図１６】
0004045400.tif 000017
【図１７】
0004045400.tif 000018