(57)【要約】【課題】構造化文書データの検索が高速に行える構造化文書管理装置、検索装置を提供する。【解決手段】複数の要素を含む各構造化文書データを記憶する記憶手段に新たな構造化文書データを記憶する際には、前記記憶手段で記憶された各構造化文書データ及び前記新たな構造化文書データにそれぞれ含まれている構造を含む汎用構造を求めて、前記新たな構造化文書データの構造と前記汎用構造との差分構造を求め、前記新たな構造化文書データの複数の要素を前記差分構造に基づき並べた配列を前記記憶手段に記憶する。【選択図】      図１
2006031377.tif 000002
【特許請求の範囲】
【請求項１】
複数の要素を含む各構造化文書データを記憶する記憶手段を有する構造化文書管理装置であって、
前記記憶手段で記憶された各構造化文書データに含まれている各構造を含む汎用構造を記憶する汎用構造記憶手段と、
新たな構造化文書データを入力する入力手段と、
前記汎用構造記憶手段で記憶された汎用構造を、前記記憶手段で記憶された各構造化文書データ及び前記新たな構造化文書データにそれぞれ含まれている各構造を含む新たな汎用構造に更新する手段と、
前記新たな構造化文書データの構造と前記新たな汎用構造との差分構造を求める手段と、
前記差分構造を記憶する差分構造記憶手段と、
前記新たな構造化文書データの複数の要素を前記新たな差分構造に基づき並べた配列を前記記憶手段に記憶する手段と、
を具備したことを特徴とする構造化文書管理装置。
【請求項２】
前記差分構造には、前記新たな汎用構造の各要素の有無を示す情報及び前記新たな構造化文書データの部分構造の繰返し回数が含まれていることを特徴とする請求項１記載の構造化文書管理装置。
【請求項３】
前記新たな構造化文書データの各要素の前記配列内の位置情報が当該要素を特定するための識別子であることを特徴とする請求項１記載の構造化文書管理装置。
【請求項４】
複数の要素を含む各構造化文書データを記憶する記憶手段と、
所望の要素を検索するための検索条件を入力する入力手段と、
前記記憶手段に記憶された第１の構造化文書データから前記所望の要素を検索する検索手段とを具備した検索装置であって、
前記検索手段は、
前記第１の構造化文書データが前記記憶手段で記憶されるまでに当該記憶手段で記憶された各構造化文書データ及び前記第１の構造化文書データにそれぞれ含まれている各構造を含む汎用構造と、前記第１の構造化文書データの構造との差分構造とから、前記第１の構造化文書データの構造を復元する手段と、
復元された構造から前記所望の要素を特定する手段と、
を具備したことを特徴とする検索装置。
【請求項５】
前記記憶手段は、前記第１の構造化文書データの複数の要素を前記差分構造に基づき並べた配列を記憶し、
前記検索手段は、前記復元された構造内の前記所望の要素の配置位置に基づき、前記配列内の前記所望の要素の位置情報を求めることを特徴とする請求項４記載の検索装置。
【請求項６】
複数の要素を含む各構造化文書データを記憶する記憶手段に新たな構造化文書データを記憶するための記憶方法であって、
前記記憶手段で記憶された各構造化文書データ及び前記新たな構造化文書データにそれぞれ含まれている各構造を含む汎用構造を求めるステップと、
前記新たな構造化文書データの構造と前記汎用構造との差分構造を求めるステップと、
前記新たな構造化文書データの複数の要素を前記差分構造に基づき並べた配列を前記記憶手段に記憶するステップと、
を有することを特徴とする記憶方法。
【請求項７】
複数の要素を含む各構造化文書データを記憶する記憶手段に記憶された第１の構造化文書データから、前記所望の要素を検索するための検索方法であって、
前記第１の構造化文書データが前記記憶手段で記憶されるまでに当該記憶手段で記憶された各構造化文書データ及び前記第１の構造化文書データにそれぞれ含まれている各構造を含む汎用構造と、前記第１の構造化文書データの構造との差分構造とから、前記第１の構造化文書データの構造を復元するステップと、
復元された構造から前記所望の要素を検索するステップと、
を有することを特徴とする検索方法。
【請求項８】
前記復元された構造内の前記所望の要素の配置位置に基づき、前記記憶手段に記憶された、前記第１の構造化文書データの複数の要素を前記差分構造に基づき並べた配列内の前記所望の要素の位置情報を求めるステップをさらに有することを特徴とする請求項７記載の検索方法。
【請求項９】
複数の要素を含む各構造化文書データを記憶する記憶手段を備えたコンピュータに新たな構造化文書データを記憶するためのプログラムであって、
前記コンピュータに、
前記記憶手段で記憶された各構造化文書データ及び前記新たな構造化文書データにそれぞれ含まれている各構造を含む汎用構造を求めるステップと、
前記新たな構造化文書データの構造と前記汎用構造との差分構造を求めるステップと、
前記新たな構造化文書データの複数の要素を前記差分構造に基づき並べた配列を前記記憶手段に記憶するステップと、
を実行させるプログラム。
【請求項１０】
複数の要素を含む各構造化文書データを記憶する記憶手段を備えたコンピュータを、前記記憶手段で記憶された第１の構造化文書データから所望の要素を検索する検索装置として機能させるためのプログラムであって、
前記コンピュータに、
前記第１の構造化文書データが前記記憶手段で記憶されるまでに当該記憶手段で記憶された各構造化文書データ及び前記第１の構造化文書データにそれぞれ含まれている各構造を含む汎用構造と、前記第１の構造化文書データの構造との差分構造とから、前記第１の構造化文書データの構造を復元するステップと、
復元された構造から前記所望の要素を検索するステップと、
を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、階層化された論理構造をもつ構造化文書データベースに関する。
【背景技術】
【０００２】
Extensible markup language（ＸＭＬ）などで記述された構造化文書データを記憶・検索するための構造化文書管理システムには、いくつかの方式が考えられている。
【０００３】
（１）単純な方式として、構造化文書データをそのままテキストファイルとして管理する方式。この方式では、データ数やサイズが大きくなると格納効率が悪くなったり、構造化文書の特性を生かした検索が困難になる。
【０００４】
（２）ＲＤＢ（Relational Database）に構造化文書データを管理する方式。
【０００５】
（３）構造化文書データを管理するために開発されたＯＯＤＢ（Object Oriented Database）で管理する方式。基幹系などで広くＲＤＢが使われているが、これを拡張した例えばＸＭＬ対応ＲＤＢが製品として出ている。ＲＤＢは、データをフラットなテーブル形式に格納するため、ＸＭＬデータのような階層構造をテーブルに対応づける複雑なマッピングが必要となる。このマッピングのため、テーブルに関する事前の構造（スキーマ）設計を十分に行わないと、パフォーマンスが低下してしまう問題が発生する。
【０００６】
近年、上記（１）〜（３）以外に新たな方式が提案されている。
【０００７】
（４）ネイティブに構造化文書データを管理する方式。この方式は、多種多様な階層構造を持つＸＭＬデータを特別なマッピング処理すること無しに格納する。このため、格納や取得時に特別なオーバヘッドが存在しない。また、コストのかかる事前のスキーマ設計が不要になり、ビジネス環境の変化により必要に応じてＸＭＬデータの構造を自由に変更することが可能である。
【０００８】
いくら構造化文書データが効率良く格納されたからといって、格納されたデータを取り出す手段が無ければ意味が無い。この格納されたデータを取り出す手段として、問合せ言語がある。ＲＤＢの世界ではＳＱＬ（Structured Query Language）があるように、ＸＭＬではＸＱｕｅｒｙ（XML Query Language）が策定されている。ＸＱｕｅｒｙは、ＸＭＬデータをデータベースのように扱うための言語である。このため条件に合致するデータ集合の取り出しや集計・分析を行うための手段が提供されている。また、ＸＭＬデータは親子や兄弟などの要素が組み合わさった階層構造を持つため、この階層構造を辿る手段が提供されている。
【０００９】
格納された構造化文書データの階層構造を辿りながら、検索条件で指定された特定の要素と特定の構造が含まれている構造化文書データを検索するための技術は既に開示されている（例えば、特許文献１、２参照）。
【００１０】
構造化文書データの構造が大規模になるほど、データベースに格納されている構造化文書データの数が多いほど、検索条件が複雑なほど、各構造化文書データの階層構造を構成する要素間をたどるという処理には時間がかかる。また、構造化文書データの数、サイズが大きくなれば、格納された構造化文書データをメモリ上に展開することは不可能であり、多くはハードディスクなど二次記憶に格納されることになる。
【００１１】
ネイティブに構造化文書データを管理する方式では、構造化文書データは要素間の階層構造をそのまま記憶する。検索条件として指定された要素や構造があるか否かを調べるためには、二次記憶上に格納された構造化文書データの要素間を頻繁にアクセスしなければならない。複雑な検索条件の場合はなおさらである。
【特許文献１】特開２００２−３４６１８公報
【特許文献２】特開２０００−５７１６３公報
【発明の開示】
【発明が解決しようとする課題】
【００１２】
従来は、階層構造を有する構造化文書データを記憶するデータベースから所望の要素や構造を有する構造化文書データを検索する際には、データベース内の各構造化文書データの階層構造を構成する要素データ間を辿りながら、検索条件にて指定された要素や構造を持つ構造化文書データを検索するため、高速に検索できないという問題点があった。特に、構造化文書データのサイズが大きくなるほど、検索対象の構造化文書データの数が多いほど、検索条件が複雑であるほど検索処理の高速化が困難であった。
【００１３】
そこで、本発明は上記問題点に鑑み、構造化文書データの検索が高速に行える構造化文書管理装置、検索装置を提供することを目的とする。
【課題を解決するための手段】
【００１４】
複数の要素を含む各構造化文書データを記憶する記憶手段に新たな構造化文書データを記憶する際には、前記記憶手段で記憶された各構造化文書データ及び前記新たな構造化文書データにそれぞれ含まれている各構造を含む汎用構造を求めて、前記新たな構造化文書データの構造と前記汎用構造との差分構造を求め、前記新たな構造化文書データの複数の要素を前記差分構造に基づき並べた配列を前記記憶手段に記憶する。
【００１５】
複数の要素を含む各構造化文書データを記憶する記憶手段に記憶された第１の構造化文書データから、前記所望の要素を検索する際には、前記第１の構造化文書データが前記記憶手段で記憶されるまでに当該記憶手段で記憶された各構造化文書データ及び前記第１の構造化文書データにそれぞれ含まれている各構造を含む汎用構造と、前記第１の構造化文書データの構造との差分構造とから、前記第１の構造化文書データの構造を復元し、復元された構造から前記所望の要素を特定する。
【発明の効果】
【００１６】
本発明によれば、構造化文書データの検索が高速に行える。
【発明を実施するための最良の形態】
【００１７】
以下、本発明の実施形態について図面を参照して説明する。
【００１８】
図１は、本実施形態に関る構造化文書管理システムの機能的な構成例を示したものである。構造化文書管理システムは、大きく分けてクライアント２０１とサーバ１０１とから構成されている。クライアント２０１からの格納要求や検索要求を受けて、サーバ１０１が各要求に対応する処理を行う。
【００１９】
クライアント２０１は、主に、構造化文書登録部２０２と検索部２０３と入力部２０４と表示部２０５を有する。キーボードやマウス等の入力装置からなる入力部２０４は、構造化文書を入力したり、各種指示入力を行うためのものである。構造化文書登録部２０２は、入力部２０４から入力された構造化文書や、クライアント２０１のもつ記憶装置などに予め記憶された構造化文書を構造化文書データベース（構造化文書ＤＢ）１１１に登録するためのものである。構造化文書登録部２０２は、登録すべき構造化文書とともに格納要求をサーバ１０１へ送信する。
【００２０】
検索部２０３は、ユーザにより入力部２０４から入力された指示に従って、構造化文書データベース１１１から所望のデータを検索するための検索条件などが記述された問合せデータを作成し、当該問合せデータを含む検索要求をサーバ１０１へ送信する。また、サーバ１０１から送信された当該検索要求に対応する結果データを受け取り、これを表示部２０５に表示する。
【００２１】
サーバ１０１は、要求処理部１０２、格納処理部１０３、検索処理部１０４から構成されている。また、サーバ１０１には構造化文書データベース１１１が接続されている。構造化文書データベース１１１は、汎用構造データ記憶部１１２と差分構造データ記憶部１１３と索引データ記憶部１１４と文書オブジェクトデータ記憶部１１５から構成されている。
【００２２】
要求処理部１０２は、クライアント２０１から送信される格納要求や検索要求を判別し、格納処理部１０３や検索処理部１０４へ処理の振り分けを行い、格納処理部１０３や検索処理部１０４での処理結果をクライアント２０１に返す。
【００２３】
格納処理部１０３は、クライアント２０１からの格納要求を受けて、クライアント２０１から送信された構造化文書を構造化文書データベース１１１に格納する処理を行う。格納処理部１０３は、文書データ解析部３１と構造データ抽出部３２と汎用構造登録部３３と差分構造登録部３４と文書オブジェクト格納部３５から構成される。
【００２４】
文書データ構文解析部３１は、要求処理部１０２から渡された構造化文書を構文解析し、この解析結果を基に構造データ抽出部３２では当該構造化文書の（文書）構造データを抽出する。当該構造データと汎用構造データ記憶部１１２に記憶されている汎用構造データとの差分は差分構造登録部３４により、差分構造データ記憶部１１３に格納される。汎用構造登録部３３は、今回格納する構造化文書データの構造データに基づき汎用構造データ記憶部１１２に記憶されている汎用構造データを更新する。
【００２５】
文書オブジェクト格納部３５は、構造化文書データを文書オブジェクトデータ記憶部１１５に格納するとともに、当該構造化文書データに出現する語彙の所在を探し出すための索引データを索引データ記憶部１１５に格納する。文書データ解析部３１にて解析された構造化文書データ中の各要素（ノード）に対応するオブジェクトデータは、構造化文書データから抽出された差分構造データに基づく配置順に、文書オブジェクトデータ記憶部１１５に格納される。
【００２６】
検索処理部１０４は、クライアント２０１からの検索要求を受けて、指定された条件（問合せデータ）に合致するデータを構造化文書データベース１１１から探し出し、この探し出したデータを結果データとして返す処理を行う。検索処理部１０４は、大きく分けて、問合せデータ解析部４１、問合せ実行部４２、結果生成部４６からなり、また、問合せ実行部４２は、構造スキャン部４３、索引スキャン部４４、データ結合部４５からなる。
【００２７】
問合せデータ解析部４１は、要求処理部１０２から渡された問合せデータを構文解析する。問合せ実行部４２は、この解析結果を基に構造スキャン部４３、索引スキャン部４４を用いて、汎用構造データ記憶部１１２に記憶された汎用構造データ、差分構造データ記憶部１１３に記憶された差分構造データ、索引データ記憶部１１４に記憶された索引データを参照して、この結果をデータ結合部４５で結合する。
【００２８】
結果生成部４６は、データ結合部４５で得られたデータを基に、文書オブジェクトデータ記憶部１１５に記憶されているオブジェクトデータを読み出して、問合せデータに記述された条件に合致する結果データを生成する。
【００２９】
図２は、サーバ１０１のハードウエア的な構成例を示したもので、バス１に通信Ｉ／Ｆ装置２、可搬記録媒体ドライブ装置３、表示装置４、入力装置５、出力装置６、演算装置（ＣＰＵ）７および外部記憶装置８並びにメモリ９が接続されて構成されている。さらに、図２に示す構成では、バス１に、図２の構造化文書データベース１１１が接続されている。
【００３０】
図１の要求処理部１０２と格納処理部１０３と検索処理部１０４のそれぞれの機能を実現するためのプログラムは、図２の外部記憶装置８に予め記憶され、必要に応じて、各プログラムがメモリ９に読み込まれて実行される。
【００３１】
以下、図１を参照して説明する。
【００３２】
図３は、構造化文書データの一例を示したものである。構造化文書を記述するための代表的な言語としてＸＭＬ(eXtensible Markup Language)が挙げられる。図３に示す構造化文書（文書Ａ）はＸＭＬで記述されたものである。ＸＭＬでは、文書構造を構成する個々のパーツを「要素」(エレメント：Element)と呼び、要素はタグ（tag）を使って記述する。具体的には、要素の始まりを示すタグ(開始タグ)と、終わりを示すタグ「終了タグ」)の２つのタグでデータを挟み込んで、１つの要素を表現している。なお、開始タグと終了タグで挟み込まれたテキストデータは、当該開始タグと終了タグで表された１つの要素に含まれるテキスト要素（テキストノード）である。
【００３３】
この例では、＜ｂｏｏｋ＞というタグで囲まれた要素のルート要素が存在する。この「ｂｏｏｋ」要素は、＜ｔｉｔｌｅ＞、＜ａｕｔｈｏｒｓ＞、＜ａｂｓｔｒａｃｔ＞の各タグで囲まれた３つの子要素を包含する。＜ＴＩＴＬＥ＞要素は、「データベース」というテキスト要素をもつ。また、＜ＡＵＴＨＯＲＳ＞要素は、＜ＡＵＴＨＯＲ＞要素という２つの子要素を包含する。
【００３４】
図４は、構造化文書データの他の例を示したもので、図３の構造化文書データと類似した構造を持っている。図３と図４の構造化文書データの相違点を以下に示す。図４の構造化文書データ（文書Ｂ）は３つの＜ＡＵＴＨＯＲ＞要素が含まれている。また、＜ＡＢＳＴＲＡＣＴ＞要素が含まれていないが、＜ＫＥＹＷＯＲＤ＞要素が含まれている。
【００３５】
ＸＭＬなどで記述された構造化文書の特徴として、以下のものが挙げられる。
【００３６】
・階層的なデータモデルである。
【００３７】
・同じ要素が繰返し出現することがある。
【００３８】
・要素間に順序性がある。
【００３９】
・スキーマを持つ場合、持たない場合、いずれも可能である。
【００４０】
図５は、構造化文書データベースのデータ構造を論理的に表したもので、ノードとアークから構成される木構造を有する。大量の構造化文書が「ｒｏｏｔ」ノードをルートする１つの構造化文書の部分文書として記憶されている。
【００４１】
「ＲＯＯＴ」ノードをルートにして、「ＢＯＯＫＦＯＬＤＥＲ」ノードが子ノードとして存在している。「ＢＯＯＫＦＯＬＤＥＲ」ノードの下には、図３の文書Ａ２と図４の文書Ｂのそれぞれに対応するサブツリーが存在する。
【００４２】
ここでは、フォルダとドキュメントという概念を導入している。図５では、「ＲＯＯＴ」と「ＢＯＯＫＦＯＬＤＥＲ」がフォルダであり、フォルダの下には複数の文書、この場合は２つの文書（文書Ａ、文書Ｂ）が存在する。
【００４３】
実際には、各ノード（テキストノードを含む）はオブジェクトデータのファイルとして構造化文書データ記憶部１１５に格納される。各ノード（テキストノードを含む）には、オブジェクトＩＤ（ＯＩＤ）と呼ばれる識別子が割当てられている。なお、図５では、説明の簡単のため、ＯＩＤを数字で表している。ＯＩＤを指定することで所望のオブジェクトデータを取り出すことができる。実際のＯＩＤは、当該ノード（テキストノードを含む）を含む構造化文書の識別子である文書ＩＤと、文書オブジェクトデータ記憶部１１５内の当該ノードを含む構造化文書の記憶エリア内における当該ノードに対応するオブジェクトデータを記憶するスロット位置を示すスロットＩＤが含まれている。
【００４４】
ノードに対応するオブジェクトの属性として、子ノードＯＩＤ、親ノードＯＩＤなどのアークに関する情報がある。さらに、タグ名などの属性もある。
【００４５】
（格納）
次に、図６〜図１０を参照して、図３の文書Ａを構造化文書ＤＢ１１１に格納する際の格納処理部１０３の処理動作の概略を説明する。ここでは、文書Ａが構造化文書ＤＢ１１１に格納される最初の構造化文書データであるとする。この場合、汎用構造データはまだ存在していない。
【００４６】
クライアント２０１から送信された文書Ａの格納要求を受け付けると、まず、文書データ解析部３１にて、文書Ａの構文解析を行って、「ＢＯＯＫ」ノードをルートノードする図６に示すような文書ツリーが出力される。これは周知・公用技術であるＹａｃｃ＆Ｌｅｘなどのコンパイラ＋コンパイラツールに代表される構文解析技術により出力することができる。
【００４７】
構造データ抽出部３２は、図６示すような文書ツリーから、図７に示すような構造データを求める。汎用構造登録部３３は、図７に示した構造データから図８に示すような汎用構造を求めて、汎用構造データ記憶部１１２に登録する。汎用構造とは、格納された各構造化文書に含まれている構造を表したものである。図８に示すように、汎用構造では、同じタグ名の複数の兄弟ノードは、１つのノードに集約して表すようになっている。なお、汎用構造データ記憶部１１２には、汎用構造データを示すツリーを束ねるルートノードとして汎用構造データの「ＲＯＯＴ」ノードが初期作成されている。
【００４８】
差分構造登録部３４は、文書Ａの図７に示した構造データのうち図８の汎用構造データで落ちてしまった構造に関する情報、すなわち図１０に示すような差分構造データ（第２の差分構造データ）を求める。ここでは、第２の差分構造データを求めるために、図９に示すような第１の差分構造データを求めるようになっている。なお、以下の説明において、第１及び第２の差分構造データのうち第２の差分構造データのみを指す場合には、単に差分構造データと呼ぶことがある。
【００４９】
文書Ａの構造データの「ＡＵＴＨＯＲＳ」ノードには２つの「ＡＵＴＨＯＲ」ノードが存在し、同じ部分構造（部分ツリー）が繰返し出現する。しかし、このような繰返し形式の構造は汎用構造には表されていないため、それを差分構造として表したものが図１０に示す第２の差分構造データである。
【００５０】
なお、第２の差分構造データでは、構造データのあるノード以下にある部分ツリー（の全部または一部）が複数回繰返し出現する場合には、図１０に示すように、当該ノードに、当該部分ツリーの発生回数を属性情報として付加するとともに、当該複数個の部分ツリーを１つの部分ツリーで集約して表す。この際、当該構造データ中で繰返し出現する部分ツリーのなかで、必ず出現するとは限らないノード（不定ノード）が存在する場合には、当該ノードが不定ノードであることを示すマーク「？」を当該ノードの属性情報として付加する。
【００５１】
汎用構造データは、それまでに格納された複数の構造化文書データを網羅するものであるが、差分構造データは、格納される１つの構造化文書データに対し１つ存在する。また、構造化文書データを格納する際には、この構造化文書データの中にこの時点の汎用構造データには存在しないノードがあれば、当該存在しないノードが汎用構造データに追加されるので、汎用構造データのサイズは単調に増加することになる。
【００５２】
汎用構造データ記憶部１１２に記憶される汎用構造データ中の各ノードには、それぞれを識別するためのノードＩＤが付されている。図８に示す汎用構造の場合、ノードＩＤ「Ｔ０」がルートノードであり、他のノードには、「Ｔ１」〜「Ｔ７」というノードＩＤをもつ。すなわち、文書Ａを格納する際に、差分構造データを求める際に用いられた汎用構造データはノードＩＤ「Ｔ７」までのノードからなる汎用構造データである。この後、構造化文書データを格納していくと、当該汎用構造データには、新たなノードが追加されるから、当該新たなノードには、当該汎用構造データに追加された順を示す上記ノードＩＤを付加することとする。本実施形態では、差分構造データを求める際に用いた汎用構造データを識別するために、当該汎用構造データの最後のノードＩＤを当該差分構造データとともに差分構造データ記憶部１１３に記憶する。
【００５３】
文書Ａの差分構造データは、当該差分構造データを求める際に用いた汎用構造データの最後のノードＩＤ「Ｔ７」とともに、例えば、図１６に示すように、「管理Ｔ７［１］［１］［２＊］［１］［１］［１］」という配列形式で差分構造データ記憶部１１３に記憶される。
【００５４】
文書オブジェクト格納部３５は、図１０に示した差分構造データに基づき、文書ツリー上の各ノード（テキストノードを含む）に対応するオブジェクトデータを並べた配列を文書オブジェクトデータ記憶部１１５に格納する。文書オブジェクト記憶部１１５は、各構造化文書データを記憶するための複数の記憶領域を含み、各記憶領域は複数のスロットに分割されている。各スロットは、その位置を示すスロットＩＤをもち、各スロットには当該構造化文書中の各オブジェクトデータを記憶するようになっている。１構造化文書データが記憶されている１記憶領域内のデータを文書オブジェクトレコードと呼ぶ。この文書オブジェクトレコードは、当該構造化文書データを構成する複数要素の配列である。配列内の各要素の位置情報は、上記スロットＩＤに対応する。
【００５５】
各文書（例えば、文書Ａ）を格納する記憶領域内では、図１７に示すように、汎用構造データ中の各ノードに対応するオブジェクトデータを（差分構造データの左側のノードから順に、上流ノードから下流ノードの順に）優先的に格納し、この後に、文書ツリー中の不定ノードやテキストノードを順に格納するようになっている。
【００５６】
次に、図４の文書Ｂを構造化文書ＤＢ１１１に格納する際の格納処理部１０３の処理動作の概略を説明する。ここでは、汎用構造データ記憶部１１２に、図８に示した汎用構造データが記憶されている場合について説明する。
【００５７】
文書データ解析部３１は、クライアント２０１から送信された文書Ｂの格納要求を受け付けると、文書Ｂの構文解析を行って、「ＢＯＯＫ」ノードをルートノードする図１１に示すような文書ツリーを出力する。
【００５８】
構造データ抽出部３２は、図１１示すような文書ツリーから、図１２に示すような構造データを求める。
【００５９】
汎用構造登録部３３は、汎用構造データ記憶部１１２に記憶されている図８に示した汎用構造データと、図１２の構造データとを比較して、図８の汎用構造データを更新する。すなわち、この場合には、図１３に示すように、図８の汎用構造データにはないが、図１２の構造データには存在する「ＫＥＹＷＯＲＤ」ノードを「ＢＯＯＫ」ノードの子ノードとして追加する。なお、「ＫＥＹＷＯＲＤ」ノードのノードＩＤは「Ｔ８」である。
【００６０】
図１２に示した構造データから図８に示すような汎用構造を求めて、汎用構造データ記憶部１１２に登録する。
【００６１】
差分構造登録部３４は、文書Ｂの図１２に示した構造データと図１３の汎用構造データとの差分構造を示す差分構造データ（図１５参照）を求める。この際、まず、図１４に示すような第１の差分構造データを求める。図１４に示すように、第１の差分構造データは、図１２の構造データにはなく、図１３の汎用構造データに存在するノード、すなわち「ＡＢＳＴＲＡＣＴ」ノードが追加されているが、このノードの属性情報として、発生回数「０」が付されている。これは、文書Ｂには存在しないが、汎用構造データには存在する要素であることを示している。
【００６２】
文書Ｂの構造データの「ＡＵＴＨＯＲＳ」ノードには３つの「ＡＵＴＨＯＲ」ノードが存在し、同じ部分構造（部分ツリー）が繰返し出現する。従って、図１５の第２の差分構造データには、この繰返し形式の構造を１つの部分構造で集約して表し、当該部分構造のルートの「ＡＵＴＨＯＲ」ノードには発生回数「３＊」が付加されている。
【００６３】
文書Ｂの差分構造データは、当該差分構造データを求める際に用いた汎用構造データの最後のノードＩＤ「Ｔ８」とともに、例えば、図１６に示すように、「管理Ｔ８［１］［１］［３＊］［１］［１］［０］［１］」という配列形式で差分構造データ記憶部１１３に記憶される。
【００６４】
文書Ｂを格納する記憶領域内では、図１７に示すように、汎用構造データ中の各ノードに対応するオブジェクトデータを（差分構造データのルートノードを起点に、当該ルートノード以下の構造を最初の子ノードから順に、各子ノードについては、当該子ノード以下の構造を上流ノードから下流ノードの順に）優先的に格納し、この後に、文書ツリー中の不定ノードやテキストノードを順に格納するようになっている。
【００６５】
図１８は、構造データ抽出部３２の構造データ抽出処理を説明するためのフローチャートである。ここでは、図６に示す文書ツリーから図７に示す構造データを抽出する場合を例にとり説明する。図６の文書ツリーをルートノードから下流方向へ辿りながら文書ツリー上の各ノードを構造データのノードとして追加することにより、構造データを抽出する。
【００６６】
まず、文書データ解析部３１から出力された図６の文書Ａの文書ツリーのルートノードを構造データのルートノードに設定する（ステップＳ１）。構造データのルートノード以下に、文書ツリー上の各ノードを追加する処理のために、文書ツリーのルートノードをｄｎｏｄｅ、構造データのルートノードをｆｎｏｄｅと定める（ステップＳ２）。ｄｎｏｄｅに子ノードが存在する場合には（ステップＳ３のＹｅｓ）、ｄｎｏｄｅの最初の子ノードをｄｎｏｄｅ´と定める（ステップＳ４）。そして、ｆｎｏｄｅの子ノードにｄｎｏｄｅ´を追加し、当該子ノードに、発生回数「１」という属性情報を付加する（ステップＳ５）。ｄｎｏｄｅの全ての子ノードについて、ステップＳ４〜ステップＳ５を行った後、文書ツリー上の全ノードについて上記ステップＳ４、ステップＳ５の処理が終了するまで、ｄｎｏｄｅとｆｎｏｄｅを更新する（ステップＳ６、ステップＳ７）。すなわち、ステップＳ７では、文書ツリーの次のノードをｄｎｏｄｅと定め、構造データの当該ｄｎｏｄｅに対応するノードをｆｎｏｄｅと定める。そして、ステップＳ３へ戻り、上記ステップＳ３〜ステップＳ５を繰り返す。
【００６７】
図１８に示した処理によれば、構造データのルートノード、すなわち、「ＢＯＯＫ」ノードに「ＴＩＴＬＥ」ノード、「ＡＵＴＨＯＲＳ」ノードが、この順に追加される。この後、当該「ＡＵＴＨＯＲＳ」ノードに、当該ノードの１番目の子ノードである「ＡＵＴＨＯＲ」ノードが追加され、当該「ＡＵＴＨＯＲ」ノード以下に「ＦＩＲＳＴ  ＮＡＭＥ」ノードや「ＬＡＳＴ  ＮＡＭＥ」ノードが追加される。さらに、「ＡＵＴＨＯＲＳ」ノードの２番目の子ノードである「ＡＵＴＨＯＲ」ノードが追加され、当該「ＡＵＴＨＯＲ」ノード以下に「ＦＩＲＳＴ  ＮＡＭＥ」ノードや「ＬＡＳＴ  ＮＡＭＥ」ノードが追加される。最後に構造データの「ＢＯＯＫ」ノードの子ノードとして、「ＡＢＳＴＲＡＣＴ」ノードが追加される。各ノードには、発生回数「１」という属性情報が付加されている。
【００６８】
図１９は、汎用構造登録部３３の汎用構造登録処理を説明するためのフローチャートである。ここでは、図７に示す構造データをもつ最初の文書Ａを格納する場合に汎用構造データを新規作成する場合を例にとり説明する。図７の構造データをルートノードから下流方向へ辿りながら構造データ上の各ノードと汎用構造データ上のノードとを比較して、汎用構造データにはないノード（ｇｎｏｄｅ）を汎用構造データに追加することにより、汎用構造データを更新する。ここでは、前述したように、構造データに同じ（要素名の）ノードが繰返し出現しても、これを汎用構造データには追加しないようになっている。
【００６９】
構造データ抽出部３２から出力された図７の文書Ａの構造データのルートノード「ＢＯＯＫ」をｆｎｏｄｅと定める（ステップＳ１１）。汎用構造データのルートノード「ＲＯＯＴ」以下に、ｆｎｏｄｅに対応するノードが存在する場合にはステップＳ１５へ進み、存在しない場合には、ステップＳ１３へ進む（ステップＳ１２）。ここでは、新規の汎用構造データの作成であるため「ＲＯＯＴ」ノード以下には汎用構造データは存在しないので、ステップＳ１３へ進み「ＲＯＯＴ」ノードの子ノードとしてｆｎｏｄｅを追加する。すなわち「ＢＯＯＫ」ノードを追加する。そして、構造データ上の「ＢＯＯＫ」ノードをｇｎｏｄｅと定める（ステップＳ１４）。
【００７０】
以下、ステップＳ１６〜ステップＳ２１を繰返して、当該ｇｎｏｄｅ以下に汎用構造を構築する。すなわち、ｆｎｏｄｅに子ノードが存在する場合には（ステップＳ１６のＹｅｓ）、ｆｎｏｄｅの最初の子ノードをｆｎｏｄｅ´と定める（ステップＳ１７）。そして、汎用構造データのｇｎｏｄｅの子ノードにｆｎｏｄｅ´が存在しない場合には（ステップ１８のＮｏ）、ｇｎｏｄｅの子ノードにｆｎｏｄｅ´を追加し、当該子ノードに、ノードＩＤを付加する（ステップＳ１９）。一方、汎用構造データのｇｎｏｄｅの子ノードにｆｎｏｄｅ´が既に存在する場合には（ステップＳ１８のＹｅｓ）、ステップＳ１６へ戻り、ｆｎｏｄｅの次の子ノードを新たにｆｎｏｄｅ´と定める。ｆｎｏｄｅの全ての子ノードについて、ステップＳ１８〜ステップＳ１９を行った後、構造データ上の全ノードについて上記ステップＳ１８、ステップＳ１９の処理が終了するまで、ｆｎｏｄｅとｇｎｏｄｅを更新する（ステップＳ２０、ステップＳ２１）。すなわち、ステップＳ２１では、構造データの次のノードをｆｎｏｄｅと定め、当該ｆｎｏｄｅに対応する汎用構造データのノードをｇｎｏｄｅと定める。そして、ステップＳ１６へ戻り、上記ステップＳ１６〜ステップＳ１９を繰り返す。
【００７１】
以上の処理により、構造データ中に出現する複数個の同じ部分ツリーが１つの部分ツリーで表された、図８に示すような汎用構造データが得られる。最後に、図８に示すような汎用構造データを汎用構造データ記憶部１１２に格納する（ステップＳ２２）。
【００７２】
次に、汎用構造データ記憶部１１２に図８に示すような汎用構造データが既に格納されている状態において、図１２に示す構造データをもつ文書Ｂを格納する場合の汎用構造登録処理動作について、文書Ａを格納する場合と異なる部分についてのみ説明する。この場合、ステップＳ１５では、汎用構造データの「ＢＯＯＫ」ノードをｇｎｏｄｅと定める。そして、ステップＳ１６〜ステップＳ２１で、汎用構造データ記憶部１１２に記憶されている汎用構造データを更新する処理を行う。図１２の構造データには存在し、図８の汎用構造データには存在しないノードは「ＫＥＹＷＯＲＤ」ノードである。従って、ステップＳ１７で、「ＢＯＯＫ」ノードの３番目の子ノードである「ＫＥＹＷＯＲＤ」をｆｎｏｄｅ´と定めると、図８の汎用構造データの「ＢＯＯＫ」ノードの子ノードには、「ＫＥＹＷＯＲＤ」ノードは存在しないので（ステップＳ１８のＮｏ）、ステップＳ１９へ進み、「ＢＯＯＫ」ノードの子ノードに「ＫＥＹＷＯＲＤ」ノードを追加し、当該ノードのノードＩＤとして「Ｔ８」を付加する。
【００７３】
以上の処理により、図１３に示すような汎用構造データが得られる。最後に、図１３に示すような汎用構造データで汎用構造データ記憶部１１２に格納されている汎用構造データを更新する（ステップＳ２２）。
【００７４】
図２０〜図２１は、差分構造登録部３４の差分構造登録処理動作を説明するためのフローチャートである。ここでは、図１２に示す構造データをもつ文書Ｂを格納する場合を例にとり、差分構造登録処理動作を説明する。
【００７５】
まず、図１２の構造データと、図１３の汎用構造データとを比較して、図１２の構造データには存在しないが、図１３の汎用構造データには存在するノード、すなわち、ここでは「ＡＢＳＴＲＡＣＴ」ノードを、発生回数「０」という属性情報を付加して当該構造データに追加することにより、図１４に示すような第１の差分構造データを生成する。
【００７６】
すなわち、汎用構造データの更新に用いた、図１２の構造データのルートノードをｆｎｏｄｅと定める（ステップＳ３１）。そして、ｆｎｏｄｅに対応する汎用構造データ中のノードをｇｎｏｄｅと定める（ステップＳ３２）。
【００７７】
ｇｎｏｄｅに子ノードが存在する場合には（ステップＳ３３のＹｅｓ）、ｇｎｏｄｅの最初の子ノードをｇｎｏｄｅ´と定める（ステップＳ３４）。そして、構造データのｆｎｏｄｅの子ノードにｇｎｏｄｅ´が存在しない場合には（ステップＳ３５のＮｏ）、ｆｎｏｄｅの子ノードにｇｎｏｄｅ´を追加し、当該子ノードの属性情報として、発生回数「０」を付加する（ステップＳ３６）。一方、構造データのｆｎｏｄｅの子ノードにｇｎｏｄｅ´が存在する場合には（ステップＳ３５のＹｅｓ）、ステップＳ３３へ戻り、ステップＳ３３で更に子ノードが存在すれば（ステップＳ３３のＹｅｓ）、ｇｎｏｄｅの次の子ノードを新たにｇｎｏｄｅ´と定める（ステップＳ３４）。
【００７８】
例えば、ステップ３４で、「ＢＯＯＫ」ノードの３番目の子ノードである「ＡＢＳＴＲＡＣＴ」をｇｎｏｄｅ´と定めると、図１２の構造データの「ＢＯＯＫ」ノードの子ノードには、「ＡＢＳＴＲＡＣＴ」ノードは存在しないので（ステップＳ３５のＮｏ）、ステップＳ３６へ進み、「ＢＯＯＫ」ノードの子ノードに「ＡＢＳＴＲＡＣＴ」ノードを追加し、当該ノードの属性情報として発生回数「０」を付加する。
【００７９】
ｇｎｏｄｅの全ての子ノードについて、ステップＳ３５〜ステップＳ３６を行った後（ステップＳ３３）、汎用構造データ上の全ノードについて上記ステップＳ３５、ステップＳ３６の処理が終了するまで、ｇｎｏｄｅとｆｎｏｄｅを更新する（ステップＳ３７、ステップＳ３８）。すなわち、ステップＳ３８では、汎用構造データの次のノードをｇｎｏｄｅと定め、当該ｇｎｏｄｅに対応する構造データのノードをｆｎｏｄｅと定める。そして、ステップＳ３３へ戻り、上記ステップＳ３３〜ステップＳ３６を繰り返す。
【００８０】
以上の処理により、図１４に示すような第１の差分構造データが得られる。
【００８１】
次に、当該第１の差分構造データ中の、繰返し形式の部分構造を１つの部分構造で集約して表した、図１５に示したような第２の差分構造データを生成する。すなわち、第１の差分構造データのあるノード以下に、同じ部分ツリーが複数回出現している場合には（図２１のステップＳ４１のＹｅｓ）、当該繰返し形式の構造を完全繰返し形式に書き直す（ステップＳ４２）。すなわち、当該複数個の同じ部分ツリーを１つの部分ツリーで表すとともに、当該部分ツリーのルートノードに、当該部分ツリーの出現回数を示す属性情報（発生回数）を付加する。
【００８２】
図１５の第１の差分構造データは、「ＡＵＴＨＯＲＳ」ノード以下に、「ＡＵＴＨＯＲ」ノードをルート（ｒｏｏｔ）とする全く同一の部分ツリーが３つ存在する。従って、図１５に示すように、これら３つの部分ツリーを１つの部分ツリーで表し、当該部分ツリーのルートノード「ＡＵＴＨＯＲ」に発生回数「３」を付加する。
【００８３】
第１の差分構造データのあるノード以下に、複数の同じ構造の部分ツリーが出現するが、このうちの少なくとも１つの部分ツリーは当該部分ツリーの一部の構造のみしか含まれていない場合には（ステップＳ４３のＹｅｓ）、当該繰返し形式の構造を部分繰返し形式に書き直す（ステップＳ４４）。
【００８４】
例えば、図２４に示すような構造データを例にとり、部分繰返し形式の表現方法について説明する。図２４の構造データは、「ＡＵＴＨＯＲＳ」ノード以下に、「ＡＵＴＨＯＲ」ノードをルートとする部分ツリーが２つ存在し、このうちの１つの部分ツリーには「ＬＡＳＴＮＡＭＥ」ノードが存在していないが、他方は、文書Ｂの構造データ（図１２参照）と同様な構造を有している。
【００８５】
図２４の構造データと図１３の汎用構造データとの差分を示す第１の差分構造データを図２５に示す。また、図２６は、図２５の第１の差分構造データ中の繰返し形式の部分構造を１つの部分構造で集約して表した第２の差分構造データを示したものである。
【００８６】
図２５に示す第１の差分構造データでは、「ＡＵＴＨＯＲＳ」ノード以下に、「ＡＵＴＨＯＲ」ノードをルートとする部分ツリーが２つ存在し、このうちの１つの部分ツリーには「ＬＡＳＴＮＡＭＥ」ノードが存在していない。従って、図２１のステップＳ４４では、図２６に示すように、当該２つの部分ツリーを１つの部分ツリーで表し、当該部分ツリーのルートノード「ＡＵＴＨＯＲ」に発生回数「２」を付加する。そして、当該部分ツリーに含まれる「ＬＡＳＴＮＡＭＥ」ノードには、不定ノードであることを示す「？」を付加する。
【００８７】
図２１の説明に戻り、第１の差分構造データ中の上記繰返し形式の構造以外の部分（すなわち、繰返し形式の構造がなく、展開形式のままでも、所定の閾値以下の情報量で表現できる部分）は、そのままの展開形式で表す（ステップＳ４５）。すなわち、図１４の第１の差分構造データ内の、「ＢＯＯＫ」ノード、「ＴＩＴＬＥ」ノード、「ＡＵＴＨＯＲＳ」ノード、「ＡＢＳＴＲＡＣＴ」ノード、「ＫＥＹＷＯＲＤ」ノードからなる部分ツリーは、図１５の第２の差分構造データでは、そのままの形式で表されている。
【００８８】
以上の処理により得られた、第２の差分構造データを配列形式に書き換える（ステップＳ４６）。例えば、図１５の第２の差分構造データを、ルートノードを起点として当該ルートノード以下の構造を最初の子ノードから順に、各子ノードについては、当該子ノード以下の構造を上流ノードから下流ノードの順に、各ノードに付加されている発生回数を並べる。すなわち、「ＢＯＯＫ」ノード、「ＴＩＴＬＥ」ノード、「ＡＵＴＨＯＲＳ」ノード、「ＡＵＴＨＯＲ」ノード、「ＦＩＲＳＴＮＡＭＥ」ノード、「ＬＡＳＴＮＡＭＥ」ノード、「ＡＢＳＴＲＡＣＴ」ノード、「ＫＥＹＷＯＲＤ」ノードの順で、各ノードの発生回数を並べると、［１］［１］［３＊］［１］［１］［０］［１］となる。
【００８９】
差分構造登録部３４は、この配列の先頭に、当該差分構造データを求める際に用いた汎用構造データの最後のノードＩＤ「Ｔ８」（これを管理情報と呼ぶ）を付加して、図１６に示したように、当該差分構造データを差分構造データ記憶部１１３に格納する。
【００９０】
図１６は、差分構造データの記憶例を示したものである。差分構造データ記憶部１１３には、文書Ａの差分構造データ、文書Ｂの差分構造データが記憶されている。
【００９１】
文書Ａの差分構造データは、［１］［１］［２＊］［１］［１］［１］という数値列、実際には配列形式となっている。各データに対応する意味は以下の通りである。
【００９２】
・［１］  ：「ＴＩＴＬＥ」が１回発生している。
【００９３】
・［１］  ：「ＡＵＴＨＯＲＳ」が１回発生している。
【００９４】
・［２＊］：「ＡＵＴＨＯＲ」以下の構造を２回繰り返している。
【００９５】
・［１］  ：「ＡＵＴＨＯＲ／ＦＩＲＳＴＮＡＭＥ」が１回発生している。
【００９６】
・［１］  ：「ＡＵＴＨＯＲ／ＬＡＳＴＮＡＭＥ」が１回発生している。
【００９７】
・［１］  ：「ＡＢＳＴＲＡＣＴ」が１回発生している。
【００９８】
文書Ａの差分構造データは、［１］［１］［３＊］［１］［１］［０］［１］という数値列、実際には配列形式となっている。各データに対応する意味は以下の通りである。
【００９９】
・［１］  ：「ＴＩＴＬＥ」が１回発生している。
【０１００】
・［１］  ：「ＡＵＴＨＯＲＳ」が１回発生している。
【０１０１】
・［３＊］：「ＡＵＴＨＯＲ」以下の構造を３回繰り返している。
【０１０２】
・［１］  ：「ＡＵＴＨＯＲ／ＦＩＲＳＴＮＡＭＥ」が１回発生している。
【０１０３】
・［１］  ：「ＡＵＴＨＯＲ／ＬＡＳＴＮＡＭＥ」が１回発生している。
【０１０４】
・［０］  ：「ＡＢＳＴＲＡＣＴ」が０回発生している。すなわち、「ＡＢＳＴＲＡＣＴ」は存在しない。
【０１０５】
・［１］  ：「ＫＥＹＷＯＲＤ」が１回発生している。
【０１０６】
各差分構造データに付加されている管理情報は、当該差分構造データを求める際に用いた汎用構造データの範囲を特定することのできる最大ノード番号である。汎用構造データは、汎用構造データに存在していないノードを持つ新たな構造化文書データが格納される毎にノードが追加される。つまり単調増加するから、この管理情報は、どの範囲の汎用構造データを用いて当該差分構造データが生成されたのかを示している。
【０１０７】
図２２は、構造化文書データのさらに他の例を示したもので、図３の構造化文書データ（文書Ａ）、図４の構造化文書データ（文書Ｂ）と類似した構造を持っている。すなわち、図２２の構造化文書データ（文書Ｃ）は、「ＡＵＴＨＯＲＳ」ノードは２つの「ＡＵＴＨＯＲ」ノードをもち、２番目の「ＡＵＴＨＯＲ」ノード、つまり「ＡＵＴＨＯＲＳ／ＡＵＴＨＯＲ［２］」には「ＬＡＳＴＮＡＭＥ」ノードが存在しない。また、「ＡＢＳＴＲＡＣＴ」ノードが存在しないが、「ＫＥＹＷＯＲＤ」ノードが存在する。
【０１０８】
図２３は、図２２の文書Ｃの文書ツリーを示したものである。
【０１０９】
図２４は、図２３の文書Ｃの文書ツリーを基に、図１８の構造データ抽出処理を行うことにより得られた構造データを示したものである。
【０１１０】
汎用構造データ記憶部１１２に図１３に示した汎用構造データが記憶されているとき、図２２の文書Ｃを格納する場合、図１９の汎用構造登録処理により汎用構造データ記憶部１１２に格納される汎用構造データは図１３と同様である。図２４の構造データと、図１３の汎用構造データとを用いて図２０に示す差分構造登録処理を行った結果得られる第１の差分構造データを図２５に示す。
【０１１１】
図２５では、「ＡＵＴＨＯＲＳ」ノード以下に、「ＡＵＴＨＯＲ」ノードをルートとする部分ツリーが２つ存在し、このうちの１つの部分ツリーには「ＬＡＳＴＮＡＭＥ」ノードが存在していない。また、発生回数「０」の「ＡＢＳＴＲＡＣＴ」ノードが「ＢＯＯＫ」ノードに追加され、発生回数「０」の「ＬＡＳＴＮＡＭＥ」が２番目の「ＡＵＴＨＯＲ」ノードに追加されている。
【０１１２】
図２５の第１の差分構造データに対し、図２１に示す処理を行うことにより得られる第２の差分構造データを図２６に示す。
【０１１３】
図２６では、「ＡＵＴＨＯＲＳ」ノード以下の「ＡＵＴＨＯＲ」ノードをルートする２つの部分ツリーが１つの部分ツリーで表され、当該部分ツリーのルートノード「ＡＵＴＨＯＲ」に発生回数「２」が付加されている。そして、当該部分ツリーに含まれる「ＬＡＳＴＮＡＭＥ」ノードには、不定ノードであることを示す発生回数「？」が付加されている。また、図２６に示す第２の差分構造データは、発生回数「０」の「ＡＢＳＴＲＡＣＴ」ノードを含む。
【０１１４】
図２６に示す差分構造データは、［１］［１］［２＊］［１］［？］［０］［１］と表すことができる。差分構造登録部３４は、この配列の先頭に、当該差分構造データを求める際に用いた汎用構造データの最後のノードＩＤ「Ｔ８」を付加して、図２７に示したように、当該差分構造データを差分構造データ記憶部１１３に格納する。
【０１１５】
次に、文書オブジェクト格納部３５の処理動作について、図２２に示すフローチャートを参照して説明する。ここでは、文書Ｂの文書ツリー（図１１参照）を格納する場合を例にとり説明する。すなわち、図１５に示す第２の差分構造データをルートノードから下流方向へ辿りながら、まず、汎用構造中の各ノードに対応する文書ツリーのオブジェクトデータを文書オブジェクトデータ記憶部１１５に格納していき、この後に文書ツリー中の不定ノードやテキストノードを順に格納する。
【０１１６】
まず、差分構造登録部３４で得られた図１５に示すような第２の差分構造データのルートノード（「ＢＯＯＫ」ノード）をｓｎｏｄｅと定める。また、図１１の文書ツリーのルートノード（「ＢＯＯＫ」ノード）をｄｎｏｄｅと定める（ステップＳ５１）。
【０１１７】
ｓｎｏｄｅが展開形式で表されているときには（ステップＳ５２のＹｅｓ）、文書ツリーのｄｎｏｄｅに対応するオブジェクトデータを文書オブジェクトデータ記憶部１１５に格納する（ステップＳ５３）。現在、ｓｎｏｄｅは「ＢＯＯＫ」ノードであり、展開形式で表されているから、図１７に示すように、文書オブジェクトデータ記憶部１１５の文書Ｂの記憶エリアの最初のスロット（スロットＩＤ＝０）に、ｄｎｏｄｅに対応するオブジェクトデータ、すなわち、「ＢＯＯＫ」を格納する。
【０１１８】
この後、ステップＳ５９において、ｓｎｏｄｅ、ｄｎｏｄｅを更新した後、ステップＳ５２へ戻る。ステップＳ５９では、第２の差分構造データの次のノード、すなわち、「ＴＩＴＬＥ」ノードをｓｎｏｄｅと定め、ｓｎｏｄｅに対応する文書ツリー内のノード、すなわち、「ＴＩＴＬＥ」ノードをｄｎｏｄｅと定める。
【０１１９】
この場合も、ｓｎｏｄｅが展開形式で表されているので（ステップＳ５２のＹｅｓ）、図１７に示すように、文書オブジェクトデータ記憶部１１５の文書Ｂの記憶エリアの２番目のスロット（スロットＩＤ＝１）に、ｄｎｏｄｅに対応するオブジェクトデータ、すなわち、「ＴＩＴＬＥ」を格納する（ステップＳ５３）。
【０１２０】
この後、ステップＳ５９において、第２の差分構造データの次のノード、すなわち、「ＡＵＴＨＯＲＳ」ノードをｓｎｏｄｅと定め、ｓｎｏｄｅに対応する文書ツリー内のノード、すなわち、「ＡＵＴＨＯＲＳ」ノードをｄｎｏｄｅと定た後、ステップＳ５２へ戻る。
【０１２１】
この場合も、ｓｎｏｄｅが展開形式で表されているので（ステップＳ５２のＹｅｓ）、図１７に示すように、文書オブジェクトデータ記憶部１１５の文書Ｂの記憶エリアの３番目のスロット（スロットＩＤ＝２）に、ｄｎｏｄｅに対応するオブジェクトデータ、すなわち、「ＡＵＴＨＯＲＳ」を格納する（ステップＳ５３）。
【０１２２】
この後、ステップＳ５９において、第２の差分構造データの次のノード、すなわち、「ＡＵＴＨＯＲ」ノードをｓｎｏｄｅと定め、ｓｎｏｄｅに対応する文書ツリー内のノード、すなわち、「ＡＵＴＨＯＲ」ノードをｄｎｏｄｅと定めた後、ステップＳ５２へ戻る。
【０１２３】
この場合には、ｓｎｏｄｅの属性情報である発生回数が「３」であり（ステップＳ５２のＮｏ）、当該ｓｎｏｄｅ以下の部分ツリーが完全繰返し形式で表されているので（ステップＳ５４のＹｅｓ）、文書ツリーのｄｎｏｄｅ以下の部分ツリー内の各オブジェクトデータを完全繰返し形式で文書オブジェクトデータ記憶部１１５に格納する（ステップＳ５５）。すなわち、図１１の文書ツリーでは、ｄｎｏｄｅ（「ＡＵＴＨＯＲ」ノード）をルートとする部分ツリーが３回出現しているので、当該部分ツリーに含まれるオブジェクトデータ「ＡＵＴＨＯＲ」、「ＦＩＲＳＴＮＡＭＥ」「ＬＡＳＴＮＡＭＥ」をこの順で、連続する３つのスロットに格納する動作を３回繰り返す。この結果、図１７に示すように、文書オブジェクトデータ記憶部１１５の文書Ｂの記憶エリアの４番目のスロット（スロットＩＤ＝３）から６番目のスロット（スロットＩＤ＝５）に、１つ目の部分ツリーのオブジェクトデータが格納され、７番目のスロット（スロットＩＤ＝６）から９番目のスロット（スロットＩＤ＝８）に、２つ目の部分ツリーのオブジェクトデータが格納され、８番目のスロット（スロットＩＤ＝９）から１０番目のスロット（スロットＩＤ＝１１）に、３つ目の部分ツリーのオブジェクトデータが格納される。
【０１２４】
第２の差分構造データの「ＡＢＳＴＲＡＣＴ」ノードの発生回数は「０」であるから、このノードをとばして、ステップＳ５９では、第２の差分構造データの「ＫＥＹＷＯＲＤ」ノードをｓｎｏｄｅと定め、ｓｎｏｄｅに対応する文書ツリー内のノード、すなわち、「ＫＥＹＷＯＲＤ」ノードをｄｎｏｄｅと定めた後、ステップＳ５２へ戻る。
【０１２５】
この場合も、ｓｎｏｄｅが展開形式で表されているので（ステップＳ５２のＹｅｓ）、図１７に示すように、文書オブジェクトデータ記憶部１１５の文書Ｂの記憶エリアの１１番目のスロット（スロットＩＤ＝１２）に、ｄｎｏｄｅに対応するオブジェクトデータ、すなわち、「ＫＥＹＷＯＲＤ」を格納する（ステップＳ５３）。
【０１２６】
以上で、第２の差分構造データの全ノードの探索は終了したので（ステップＳ５８のＹｅｓ）、ステップＳ６０へ進み、文書ツリー内で格納されていないオブジェクトデータをノードを文書オブジェクトデータ記憶部１１５に格納する。ここでは、テキストノードに対応するオブジェクトデータを、汎用構造データ上の各ノードに対応するオブジェクトデータの格納順と同様に、例えば、図１７に示すように、スロットＩＤ＝２１以降のスロットに格納していく。
【０１２７】
次に、文書オブジェクト格納部３５の処理動作について、文書Ｃの文書ツリー（図２３参照）を格納する場合を例にとり説明する。この場合、図２６に示す第２の差分構造データを用いて、文書ツリーの各オブジェクトデータを格納する。「ＡＵＴＨＯＲＳ」ノードまでを格納する処理動作は、上記文書Ｂの場合と同様である。以下、上記文書Ｂと異なる部分についてのみ説明する。
【０１２８】
ステップＳ５９において、第２の差分構造データの次のノード、すなわち、「ＡＵＴＨＯＲ」ノードをｓｎｏｄｅと定め、ｓｎｏｄｅに対応する文書ツリー内のノード、すなわち、「ＡＵＴＨＯＲ」ノードをｄｎｏｄｅと定めた後、ステップＳ５２へ戻る。
【０１２９】
この場合には、ｓｎｏｄｅの属性情報である発生回数が「２」であり（ステップＳ５２のＮｏ）、当該ｓｎｏｄｅ以下の部分ツリーが部分繰返し形式で表されているので（ステップＳ５４のＮｏ、ステップＳ５６のＹｅｓ）、文書ツリーのｄｎｏｄｅ以下の部分ツリー内の各オブジェクトデータを部分繰返し形式で文書オブジェクトデータ記憶部１１５に格納する（ステップＳ５７）。
【０１３０】
すなわち、図２３の文書ツリーでは、ｄｎｏｄｅ（「ＡＵＴＨＯＲ」ノード）をルートとする部分ツリーが２回出現しているが、２番目の部分ツリーの「ＬＡＳＴＮＡＭＥ」ノードは存在しないため、第２の差分構造データでは「ＬＡＳＴＮＡＭＥ」ノードは不定ノードとなっている。従って、ここでは不定ノードに対応するオブジェクトデータは格納しないようにする。不定ノードに対応するオブジェクトデータの格納処理については、ステップＳ６０で行う。
【０１３１】
ステップＳ５７では、まず、当該部分ツリーに含まれるオブジェクトデータ「ＡＵＴＨＯＲ」、「ＦＩＲＳＴＮＡＭＥ」をこの順で、連続する２つのスロットに格納する動作を２回繰り返す。この結果、図３０に示すように、文書オブジェクトデータ記憶部１１５の文書Ｃの記憶エリアの４番目のスロット（スロットＩＤ＝３）から５番目のスロット（スロットＩＤ＝４）に、１つ目の部分ツリーのオブジェクトデータが格納され、６番目のスロット（スロットＩＤ＝５）から７番目のスロット（スロットＩＤ＝６）に、２つ目の部分ツリーのオブジェクトデータが格納される。
【０１３２】
この後、前述の文書Ｂを格納する場合と同様にして、スロットＩＤ＝７のスロットに「ＫＥＹＷＯＲＤ」が格納される。
【０１３３】
以上で、第２の差分構造データの全ノードの探索は終了したので（ステップＳ５８のＹｅｓ）、ステップＳ６０へ進み、文書ツリー内で格納されていないオブジェクトデータをノードを文書オブジェクトデータ記憶部１１５に格納する。このステップＳ６０では、まず、ステップＳ５７で格納されなかった不定ノードに対応するオブジェクトデータを格納する。すなわち、１番目の部分ツリーの「ＬＡＳＴＮＡＭＥ」を、例えば図３０に示すように、スロットＩＤ＝３０のスロットに格納する。この後、ステップＳ６０では、テキストノードに対応するオブジェクトデータを、汎用構造データ上の各ノードに対応するオブジェクトデータの格納順と同様に、例えば図３０に示すように、スロットＩＤ＝３１以降のスロットに格納していく。
【０１３４】
図３０は、文書オブジェクトレコードの記憶例を示したもので、文書Ａの文書オブジェクトレコード、文書Ｂの文書オブジェクトレコード、文書Ｃの文書オブジェクトレコードが記憶されている。各文書オブジェクトレコードは、当該レコードに対応する文書の文書ＩＤに対応付けて記憶されている。各文書の各オブジェクトデータは、文書ＩＤとスロットＩＤから一意に特定することができる。すなわち、文書ＩＤとスロットＩＤを含むオブジェクトＩＤが与えられれば、任意の文書オブジェクトデータにアクセスすることができる。
【０１３５】
文書オブジェクト格納部３５は、文書ツリーの各オブジェクトデータを文書オブジェクトデータ記憶部１１５に格納するとともに、当該文書ツリー内の各オブジェクトデータを基に、索引データ記憶部１１４を更新する。索引データとは、格納された構造化文書データに含まれるテキスト要素のテキストデータ（文字列）を抽出し、テキストデータと当該テキストデータを含む構造化文書データ中の要素のオブジェクトＩＤ（ＯＩＤ）との対応関係を表す情報である。
【０１３６】
索引データ記憶部１１４には、図２９に示すように、語彙テーブルと当該語彙テーブル中の各語彙にリンクされた当該語彙を含むテキスト要素のＯＩＤを記録する複数のテーブルが記憶されている。語彙テーブル中の語彙からリンクをたどることで、その語彙を含むテキスト要素の出現位置、つまりＯＩＤが得られる。
【０１３７】
ここでは、各オブジェクトデータのオブジェクトＩＤを＜文書ＩＤ、スロットＩＤ＞と表し、文書Ａ、Ｂ、Ｃの文書ＩＤはそれぞれ「文書Ａ」「文書Ｂ」「文書Ｃ」である。
【０１３８】
（検索）
次に、図１の検索処理部１０４の処理動作について説明する。
【０１３９】
図３１は、検索処理部１０４に入力する問合せデータの一例を示したものである。ＸＭＬでは、Ｗ３Ｃで提案されているＸＱｕｅｒｙ（XML Query Language）という問合せ言語があり、これに基づいた問合せ記述方法に則っている。
【０１４０】
図３１に示す問合せデータには、「構造化文書ＤＢ「ＤＢ」の階層木の中に「ＢＯＯＫ」という要素があり、この「ＢＯＯＫ」という要素の中に、「ＡＵＴＨＯＲ」という要素があり、この「ＡＵＴＨＯＲ」という要素の中に、「太郎」という文字列を含むテキスト要素をもつ「ＦＩＲＳＴＮＡＭＥ」という要素と、さらに「田中」という文字列を含むテキスト要素もつ「ＬＡＳＴＮＡＭＥ」という要素がある」という条件が記述されている。
【０１４１】
この条件では、「ＢＯＯＫ」という要素には、「ＡＵＴＨＯＲ」という要素があり、「ＡＵＴＨＯＲ」という要素には、「太郎」という文字列を含むテキスト要素をもつ「ＦＩＲＳＴＮＡＭＥ」という要素と、「田中」という文字列を含むテキスト要素もつ「ＬＡＳＴＮＡＭＥ」という要素という２つの要素を含むという、いわゆるＡＮＤ条件が含まれている。
【０１４２】
図３１に示すような問合せデータは、クライアント２０１の検索部２０３からサーバ１０１へ送信され、サーバ１０１の要求処理部１０２で受信される。
【０１４３】
以下、図３２、図３３に示すフローチャートを参照して、例えば、図３１に示したような問合せデータを受信した検索処理部１０４の処理動作の概略を説明する。
【０１４４】
要求処理部１０２で受信された問合せデータは、検索処理部１０４の問合せデータ解析部４１に渡される。問合せデータ解析部４１では、受け取った問合せデータの構文解析を行い、この結果を基に当該問合せデータから問合せグラフと呼ばれるグラフ構造を抽出する（ステップＳ１０１、ステップＳ１０２）。例えば、図３１に示した問合せデータの場合、図３４に示すような問合せグラフが得られる。ここでは、問合せグラフで表されるような問合せデータ中の構造をＳｃと表す。
【０１４５】
問合せグラフは、図３４に示すように、問合せデータ中に含まれる要素（例えば、「ｄｂ“ＤＢ”」、「ＢＯＯＫ」、「ＡＵＴＨＯＲ」「ＦＩＲＳＴＮＡＭＥ」「ＬＡＳＴＮＡＭＥ」）、や文字列（例えば「太郎」、「田中」）にそれぞれ対応する変数と、問合せデータ中に含まれる要素間の階層関係と文字列の包含関係に従って各変数を接続したグラフ形式で構成されている。
【０１４６】
図３４に示した問合せグラフでは、変数は、丸で囲まれたノードで表されており、丸のなかに変数名が記述されている。これを変数ノードと呼ぶ。また、問合せデータ中に指定されていた要素は、六角形のなかに「ＴＡＧ」と書かれたノードで表されている。これをタグノードと呼ぶ。さらに、問合せデータ中に指定されていた文字列は、六角形のなかに「ＶＡＬＣＭＰ」と書かれたノードで表されている。これを値比較タグノードと呼ぶ。
【０１４７】
次に、問合せ実行部４２は、問合せグラフに含まれる全ての変数の具体化を目標として、テーブルと呼ばれる変数集合の取り得る値の組み合わせを表すデータを次々と生成する。
【０１４８】
まず、問合せグラフに含まれる全ての変数が１テーブルで具体化されているか判定する（ステップＳ１０３）。ステップＳ１０３でＹｅｓであれば、全ての変数の取り得る値の組合せが具体化されたので、これが結果となりステップＳ１１１で結果の出力処理を行う。なお、変数が取り得る値とは、ＯＩＤのことである。
【０１４９】
以下、問合せグラフに含まれる全ての変数が１テーブルで具体化されていないならば（ステップＳ１０４のＹｅｓ）、具体化されるまで、ステップＳ１０４〜ステップＳ１１０を繰り返す。
【０１５０】
ステップＳ１０４では、索引データ記憶部１１４に記憶されている索引データを用いた検索が可能か判定する。「ｃｏｎｔａｉｎｓ」など語彙索引系の関数があれば、構造化文書ＤＢ１１１中の索引データを用いて検索を高速化できる。この場合、索引スキャン部４４で索引スキャンを実行する（ステップＳ１０５）。
【０１５１】
ステップＳ１０６では、問合せグラフ上のある変数が具体化され、当該変数の下位階層にある変数が具体化されていて、当該変数の上位階層にある変数が具体化されていなければ（ステップＳ１０６のＮｏ）、構造スキャン部４３で構造スキャンを実行する（ステップＳ１０７）。
【０１５２】
ステップＳ１０８では、複数テーブルに同一変数が発生しているか判定する。ステップＳ１０８でＹｅｓの場合は、データ系都合部４５で当該複数のテーブルを結合するための結合処理を実行する（ステップＳ１０９）。
【０１５３】
ステップＳ１０８でＮｏの場合は、ステップＳ１１０で上記以外の処理を行う。
【０１５４】
先にも述べたがステップＳ１１１では、結果出力処理を行う。ここで各変数の取り得る値（ＯＩＤ）の組合せ（ＯＩＤの組合せ）がテーブルとして得られている。各組合せは、同じドキュメントＩＤをもつ複数のＯＩＤからなり、よって、テーブル上の各組合せは、１つの構造化データに対応する。テーブル上の組合せから得られる各ドキュメントＩＤに対応する構造化データを構造化文書データ記憶部１１２から取り出すことにより、問合せデータに合致する構造化文書データの集合を得ることができる。
【０１５５】
図３５は、図３４の問合せグラフに基づく検索処理を説明するための図である。
【０１５６】
（１）問合せグラフには値比較タグノード、ｃｏｎｔａｉｎｓ語彙索引系の関数があるので、文字列「太郎」に関して、図２９に示すような索引データを用いて、索引スキャンを実行する。この結果、変数ノード＄４が具体化する（図３５（ａ）に示すＴａｂｌｅ１）。すなわち、変数ノード＄４に対応するＯＩＤとして、＜文書Ａ，４＞、＜文書Ｂ，４＞、＜文書Ｂ，７＞が得られる。
【０１５７】
（２）同様に、文字列「田中」に関して、図２９に示すような索引データを用いて、索引スキャンを実行する。この結果、変数ノード＄５が具体化する（図３５（ｂ）に示すＴａｂｌｅ１２）。すなわち、変数ノード＄５に対応するＯＩＤとして、＜文書１，５＞、＜文書２，８＞が得られる。
【０１５８】
（３）変数＄４と＄５が具体化されたので、これら変数の上位階層にある変数を具体化するために、構造スキャンを実行する。
【０１５９】
ここで、図３３に示すフローチャートを参照して、構造スキャンについて説明する。
【０１６０】
まず、図３５のＴａｂｌｅ１及びＴａｂｌｅ２から、（具体化された）変数＄４、＄５に対し得られた各オブジェクトＩＤに含まれる文書ＩＤを読みとる（ステップＳ１２１）。
【０１６１】
各文書ＩＤに対応する差分構造データと、（当該差分構造データに付加されている管理情報に対応する）汎用構造データを、差分構造データ記憶部１１３及び汎用構造データ記憶部１１２からそれぞれ読み出す（ステップＳ１２２）。
【０１６２】
各文書ＩＤについて、差分構造データと汎用構造データとから、当該文書ＩＤに対応する構造データを復元する（ステップＳ１２３）。
【０１６３】
例えば、文書Ａの構造データを復元する場合には、図１０に示した差分構造データの完全繰返し形式で表された部分ツリーを元の展開形式で表し、図７に示したような構造データを復元する。
【０１６４】
また、文書Ｂの構造データを復元する場合には、図１５に示した差分構造データの完全繰返し形式で表された部分ツリーを元の展開形式で表し、発生回数「０」のノード（「ＡＢＳＴＲＡＣＴ」ノード）を削除することにより、図１２に示したような構造データを復元する。
【０１６５】
次に、これら復元された各文書の構造データについて、Ｔａｂｌｅ１上の各オブジェクトデータを起点として、そこから上流方向へ辿ることで、問合せグラフ上の上流の変数ノードに一致するノードを探索する（ステップＳ１２４）。
【０１６６】
構造データから得られた、問合せグラフ上の上流の変数ノードに一致するノードが、例えば、不定ノードの場合には、当該不定ノードのスロットＩＤを特定することができないため（ステップＳ１２５のＮｏ）、ステップＳ１２７へ進む。また、構造データから得られた、問合せグラフ上の上流の変数ノードに一致するノードが不定ノードでない場合には、当該ノードのスロットＩＤは、当該構造データから特定可能であるので（ステップＳ１２５のＹｅｓ）、ステップＳ１２６へ進む。
【０１６７】
ここで、ステップＳ１２５におけるスロットｌＤを特定することができるか否か（不定ノードであるか否か）の判定方法の一例を説明する。文書オブジェクト格納部３５には、前述したように、各文書がオブジェクトデータの配列として格納される。この配列内の各要素の位置情報がスロットＩＤである。そして、配列の先頭から順に、汎用構造データ中の各ノードに対応するオブジェクトデータを（差分構造データの左側のノードから順に、上流ノードから下流ノードの順に）優先的に格納し、この後に、文書ツリー中の不定ノードやテキストノードを格納するようになっている（図３０参照）。
【０１６８】
そこで、復元された構造データをルートノードからトラバースし、不定ノード「？」の場合を除いて発生回数の総和を取り出す。上位ノードが複数回発生していれば（例えば、２＊）、その加重和とする。その値とスロットｌＤとを比較し、スロットｌＤの方が大きければ、スロットｌＤを特定できないことになる。但し、ルートノードの発生回数については総和をとらない。
【０１６９】
例えば、図２３に示した文書Ｃの場合、不定ノードの「ＬＡＳＴＮＡＭＥ」を除くと、「ＴｌＴＬＥ」要素は１回、「ＡＵＴＨＯＲＳ」要素は１回、「ＡＵＴＨＯＲ」要素は２回、各「ＡＵＴＨＯＲ」要素には「ＦＩＲＳＴＮＥＭＥ」要素が１回ずつ出現し、さらに、「ＫＥＹＷＯＲＤ」要素が１回出現している。従って、当該文書Ｃについては、
１＋１＋２×（１＋１）＋１＝７
となるから、「７」を越えたスロットｌＤは特定できないことになる。
【０１７０】
ステップＳ１２６では、構造データを辿りることで、得られたノードのスロットＩＤを計算する。例えば、構造データのルートノードを起点として、当該得られたノードまでのオブジェクトデータをカウントすることで、スロットＩＤを求めることができる。
【０１７１】
一方、ステップＳ１２７では、得られたノードのスロットＩＤを求めるために、文書オブジェクトデータ記憶部１１５に記憶されている当該文書ＩＤに対応するオブジェクトレコードをサーチして、当該得られたノードのスロットＩＤを得る。
【０１７２】
このようにして、復元された各構造データをスキャンして、図３５（ａ）に示す変数＄４に対応するＴａｂｌｅ１から、図３５（ｃ）に示す変数＄３に対応するＴａｂｌｅ３が得られ、図３５（ｂ）に示す変数＄５に対応するＴａｂｌｅ２から、図３５（ｄ）に示す変数＄３に対応するＴａｂｌｅ４が得られる（ステップＳ１２８）。
【０１７３】
Ｔａｂｌｅ１から、図３５（ｃ）に示す変数＄３に対応するＴａｂｌｅ３が得られ過程を説明する。図３４の変数ノード＄３は、「ＡＵＴＨＯＲ」である。図７の文書Ａの復元された構造データを参照して、スロットＩＤ「４」の「ＦＩＲＳＴＮＡＭＥ」から上流ノードを特定する「ＡＵＴＨＯＲ」ノードが得られる。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードから数えて４番目のスロットに格納されているから、スロットＩＤは「３」である。
【０１７４】
同様に、図１２の文書Ｂの復元された構造データを参照して、スロットＩＤ「４」の「ＦＩＲＳＴＮＡＭＥ」から上流ノードを特定する「ＡＵＴＨＯＲ」ノードが得られる。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードから数えて４番目のスロットに格納されているから、スロットＩＤは「３」である。
【０１７５】
同様に、図１２の文書Ｂの構造データを、スロットＩＤ「７」の「ＦＩＲＳＴＮＡＭＥ」から上流へ辿ることで、「ＡＵＴＨＯＲ」ノードが得られる。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードから数えて７番目のスロットに格納されているから、スロットＩＤは「６」である。
【０１７６】
このようにして、Ｔａｂｌｅ１から、変数ノード＄３を具体化することができる（図３５（ｃ）に示すＴａｂｌｅ３）。すなわち、変数ノード＄３に対応するＯＩＤとして、＜文書Ａ，３＞、＜文書Ｂ，３＞、＜文書Ｂ，６＞が得られる。
【０１７７】
Ｔａｂｌｅ２から、図３５（ｄ）に示す変数＄３に対応するＴａｂｌｅ４が得られ過程を説明する。図３４の変数ノード＄３は、「ＡＵＴＨＯＲ」である。図７の文書Ａの復元された構造データを参照して、スロットＩＤ「５」の「ＬＡＳＴＮＡＭＥ」から上流ノードを特定する「ＡＵＴＨＯＲ」ノードが得られる。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードから数えて４番目のスロットに格納されているから、スロットＩＤは「３」である。
【０１７８】
同様に、図１２の文書Ｂの復元された構造データを参照して、スロットＩＤ「８」の「ＬＡＳＴＮＡＭＥ」上流ノードを特定する「ＡＵＴＨＯＲ」ノードが得られる。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードから数えて７番目のスロットに格納されているから、スロットＩＤは「６」である。
【０１７９】
このようにして、Ｔａｂｌｅ２から、変数ノード＄３を具体化することができる（図３５（ｄ）に示すＴａｂｌｅ４）。すなわち、変数ノード＄３に対応するＯＩＤとして、＜文書Ａ，３＞、＜文書Ｂ，６＞が得られる。
【０１８０】
（４）上記（２）（３）に示したように、別系統で変数＃３がそれぞれ具体化されたので、Ｔａｂｌｅ３とＴａｂｌｅ４との結合処理を実行する。Ｔａｂｌｅ３とＴａｂｌｅ４には、ＯＩＤ＜文書Ａ、３＞及びＯＩＤ＜文書Ｂ、６＞が出現している。従って、両者を含む図３５（ｅ）に示すＴｅｂｌｅ５を得る。
【０１８１】
（５）変数＃４、＃５、＃３が具体化されたので、これら変数の上位階層にある変数＃２（「ＢＯＯＫ」）を具体化するために、構造スキャンを実行する。
【０１８２】
まず、ＯＩＤ＜文書Ａ、３＞に関し、図３３に示す構造スキャンを行う。図７の文書Ａの復元された構造データを参照して、スロットＩＤ「３」の「ＡＵＴＨＯＲ」の上流ノードの「ＢＯＯＫ」ノードを特定する。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードである。
【０１８３】
次に、ＯＩＤ＜文書Ｂ、６＞に関し、図３３に示す構造スキャンを行う。図１２の文書Ｂの復元された構造データを参照して、スロットＩＤ「６」の「ＡＵＴＨＯＲ」の上流ノードの「ＢＯＯＫ」ノードを特定する。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードである。
【０１８４】
このようにして、Ｔａｂｌｅ５から、変数ノード＄２を具体化することができる（図３５（ｆ）に示すＴａｂｌｅ６）。すなわち、変数ノード＄２に対応するＯＩＤとして、＜文書Ａ，０＞、＜文書Ｂ，０＞が得られる。
【０１８５】
ここでは、ＯＩＤ＜文書Ａ，０＞とＯＩＤ＜文書Ｂ，０＞が、検索結果として問合せ実行部４４から出力される。結果生成部４６は、当該検索結果として得られたＯＩＤを基に結果データを生成する（図３６参照）。
【０１８６】
図３６は、図３１の問合せデータを満足する結果データの一例である。図３５（ｆ）に示したＴａｂｌｅ６で得られたＯＩＤのリストを基に、文書オブジェクトデータ記憶部１１５から当該ＯＩＤに対応するノード以下の構造化文書データの全部あるいは一部のデータを読出して、結果データを生成する。図３６に示す結果データには、文書Ａと文書Ｂが含まれている。
【０１８７】
図３６に示すような検索結果は、要求処理部１０２から検索要求元のクライアント２０１へ渡される。クライアント２０１では、サーバ１０１から受け取った構造化データを出力部２０５内の表示部へ表示する。
【０１８８】
図３７は、問合せデータの他の例を示したものである。この問合せデータは、「ＢＯＯＫ」要素の中の「ＡＵＴＨＯＲ」要素であって、「ＬＡＳＴＮＡＭＥ」という要素の中に「田中」という文字列を含む「ＡＵＴＨＯＲ」の一覧を検索する」という意味をもつ。図３１の問合せデータでは、「ＢＯＯＫ」の一覧を結果として要求されているが、図３７に示す問合せデータでは、「ＡＵＴＨＯＲ」の一覧を結果として要求されている。
【０１８９】
図３７に示した問合せデータの場合、図３８に示すような問合せグラフが得られる。
【０１９０】
図３９は、図３８の問合せグラフに基づく検索処理を説明するための図である。
【０１９１】
（１）問合せグラフには値比較タグノード、ｃｏｎｔａｉｎｓ語彙索引系の関数があるので、文字列「田中」に関して、図２９に示すような索引データを用いて、索引スキャンを実行する。この結果、変数ノード＄３が具体化する（図３９（ａ）に示すＴａｂｌｅ７）。すなわち、変数ノード＄３に対応するＯＩＤとして、＜文書Ａ，５＞、＜文書Ｂ，８＞、が得られる。
【０１９２】
（２）変数＄３が具体化されたので、この変数の上位階層にある変数＄２を具体化するために、構造スキャンを実行する。
【０１９３】
まず、文書Ａと文書Ｂの差分構造データと（当該差分構造データに付加されている管理情報に対応する）汎用構造データとから、文書Ａと文書Ｂの構造データをそれぞれ復元する。
【０１９４】
図７の文書Ａの構造データを、スロットＩＤ「５」の「ＬＡＳＴＮＡＭＥ」から上流へ辿ることで、「ＡＵＴＨＯＲ」ノードが得られる。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードから数えて４番目のスロットに格納されているから、スロットＩＤは「３」である。
【０１９５】
同様に、図１２の文書Ｂの構造データを、スロットＩＤ「８」の「ＬＡＳＴＮＡＭＥ」から上流へ辿ることで、「ＡＵＴＨＯＲ」ノードが得られる。当該ノードのスロットＩＤは、スロットＩＤ「０」のルートノードから数えて７番目のスロットに格納されているから、スロットＩＤは「６」である。
【０１９６】
このようにして、変数ノード＄２を具体化することができる（図３９（ｂ）に示すＴａｂｌｅ３）。すなわち、変数ノード＄２に対応するＯＩＤとして、＜文書Ａ，３＞、＜文書Ｂ，６＞が得られる。
【０１９７】
これら２つのＯＩＤが図３７の問合せデータを満足する検索結果である。
【０１９８】
結果生成部４６は、図３９（ｂ）に示したＴａｂｌｅ８で得られたＯＩＤのリストを基に、文書オブジェクトデータ記憶部１１５から当該ＯＩＤに対応するノード以下の構造化文書データの全部あるいは一部のデータを読出して、結果データを生成する。図４０に示す結果データには、文書ＡのスロットＩＤ「３」、すなわち、１番目の「ＡＵＴＨＯＲ」ノード以下の部分文書と、文書ＢのスロットＩＤ「６」、すなわち、２番目の「ＡＵＴＨＯＲ」ノード以下の部分文書が含まれている。
【０１９９】
以上説明したように、上記実施形態では、構造化文書ＤＢ１１１に新たな構造化文書データを格納する際には、構造化文書ＤＢ１１１に既に記憶されている各構造化文書データに含まれている構造及び新たな構造化文書データに含まれている構造を含む汎用構造と、新たな構造化文書データの構造との差分構造を求める。この差分構造は、構造化文書ＤＢ１１１に既に記憶されている各構造化文書データの構造を含む汎用構造を新たな構造化文書データの構造を用いて更新することにより得る。新たな構造化文書データの各要素を当該差分構造に基づき並べた配列が文書オブジェクトデータ記憶部１１５に記憶される。
【０２００】
上記実施形態によれば、新たな構造化文書データを格納する際には、当該新たな構造化文書データの構造を用いて汎用構造を更新し、当該更新された汎用構造と当該新たな構造化文書データの構造との差分構造、及び当該差分構造に基づき新たな構造化文書データの各要素を並べた配列とを記憶する。従って新たな構造化文書データについて記憶すべきデータ量を大幅に削減することができる。また、配列内の各要素の位置は、差分構造上の当該要素の配置位置に対応するため、新たな構造化文書データの構造から容易に所望の要素の記憶エリアを特定することができる。
【０２０１】
また、構造化文書ＤＢ１１１に記憶されている構造化文書データから（検索条件で指定された）所望の要素を検索する際には、当該構造化文書データの構造及び当該構造化文書データが構造化文書ＤＢ１１１で記憶されるまでに構造化文書ＤＢ１１１で既に記憶された各構造化文書データの構造を含む汎用構造と、当該構造化文書データの構造との差分構造とから、当該構造化文書データの構造を復元し、復元された構造から当該所望の要素を検索する。オブジェクトデータ記憶部１１５には、上記差分構造に基づき並べられた当該構造化文書データの複数の要素の配列が記憶されている。この配列内の当該所望の要素の位置情報（スロットＩＤ）は、復元された構造内の当該所望の要素の配置位置に基づき求める。
【０２０２】
上記実施形態によれば、構造化文書ＤＢ１１１に記憶されている構造化文書データの構造を復元して、当該構造を辿ることで所望の要素の有無を判定するとともに、少ないデータ参照量で当該所望の要素の記憶エリア（スロットＩＤ）を特定することができ、構造化文書データの検索が高速に行える。
【０２０３】
本発明の実施の形態に記載した本発明の手法は、コンピュータに実行させることのできるプログラムとして、磁気ディスク（フレキシブルディスク、ハードディスクなど）、光ディスク（ＣＤ−ＲＯＭ、ＤＶＤなど）、半導体メモリなどの記録媒体に格納して頒布することもできる。
【０２０４】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【図面の簡単な説明】
【０２０５】
【図１】本発明の実施形態に係る構造化文書管理システムの機能的な構成例を示した図。
【図２】サーバのハードウエア的な構成例を示した図。
【図３】構造化文書データの一例（文書Ａ）を示した図。
【図４】構造化文書データの一例（文書Ｂ）を示した図。
【図５】構造化文書データベースのデータ構造を論理的に表した図。
【図６】文書Ａの文書ツリーを示した図。
【図７】文書Ａの構造データを示した図。
【図８】汎用構造データの一例を示した図。
【図９】図８の汎用構造データと文書Ａの構造データの差分を示す第１の差分構造データを示した図。
【図１０】図８の汎用構造データと文書Ａの構造データの差分を示す第２の差分構造データを示した図。
【図１１】文書Ｂの文書ツリーを示した図。
【図１２】文書Ｂの構造データを示した図。
【図１３】汎用構造データの他の例を示した図。
【図１４】図１３の汎用構造データと文書Ｂの構造データの差分を示す第１の差分構造データを示した図。
【図１５】図１３の汎用構造データと文書Ｂ構造データの差分を示す第２の差分構造データを示した図。
【図１６】差分構造データの記憶例を示した図。
【図１７】文書オブジェクトレコード（配列）の記憶例を示した図。
【図１８】構造データ抽出処理を説明するためのフローチャート。
【図１９】汎用構造登録処理を説明するためのフローチャート。
【図２０】差分構造登録処理を説明するためのフローチャート。
【図２１】差分構造登録処理を説明するためのフローチャート。
【図２２】構造化文書データの一例（文書Ｃ）を示した図。
【図２３】文書Ｃの文書ツリーを示した図。
【図２４】文書Ｂの構造データを示した図。
【図２５】図１３の汎用構造データと文書Ｃの構造データの差分を示す第１の差分構造データを示した図。
【図２６】図１３の汎用構造データと文書Ｃの構造データの差分を示す第２の差分構造データを示した図。
【図２７】差分構造データの記憶例を示した図。
【図２８】文書オブジェクト格納処理を説明するためのフローチャート。
【図２９】索引データ記憶部に記憶される索引データのデータ構造を模式的に示した図。
【図３０】文書オブジェクトレコード（配列）の記憶例を示した図。
【図３１】問合せデータの一例を示した図。
【図３２】検索処理部の処理動作の概略を説明するためのフローチャート。
【図３３】構造スキャン部の処理動作を説明するためのフローチャート。
【図３４】図３１の問合せデータから得られる問合せグラフを示した図。
【図３５】図３４の問合せグラフに基づく検索処理を説明するための図。
【図３６】結果データの一例を示した図。
【図３７】問合せデータの他の例を示した図。
【図３８】図３７の問合せデータから得られる問合せグラフを示した図。
【図３９】図３８の問合せグラフに基づく検索処理を説明するための図。
【図４０】結果データの他の例を示した図。
【符号の説明】
【０２０６】
３１…文書データ解析部、３２…構造データ抽出部、３３…汎用構造登録部、３４…差分構造登録部、４１…問合せデータ構文解析部、４２…問合せ実行部、４３…構造スキャン部、４４…索引スキャン部、４５…データ結合部、４６…結果生成部、１０１…サーバ装置、１０２…要求処理部、１０３…格納処理部、１０４…検索処理部、１１１…構造化文書データベース、１１２…汎用構造データ記憶部、１１３…差分構造データ記憶部、１１４…索引データ記憶部、１１５…文書オブジェクトデータ記憶部、２０１…クライアント装置、２０２…構造化文書登録部、２０３…検索部、２０４…入力部、２０５…表示部。
【図１】
2006031377.tif 000003
【図２】
2006031377.tif 000004
【図３】
2006031377.tif 000005
【図４】
2006031377.tif 000006
【図５】
2006031377.tif 000007
【図６】
2006031377.tif 000008
【図７】
2006031377.tif 000009
【図８】
2006031377.tif 000010
【図９】
2006031377.tif 000011
【図１０】
2006031377.tif 000012
【図１１】
2006031377.tif 000013
【図１２】
2006031377.tif 000014
【図１３】
2006031377.tif 000015
【図１４】
2006031377.tif 000016
【図１５】
2006031377.tif 000017
【図１６】
2006031377.tif 000018
【図１７】
2006031377.tif 000019
【図１８】
2006031377.tif 000020
【図１９】
2006031377.tif 000021
【図２０】
2006031377.tif 000022
【図２１】
2006031377.tif 000023
【図２２】
2006031377.tif 000024
【図２３】
2006031377.tif 000025
【図２４】
2006031377.tif 000026
【図２５】
2006031377.tif 000027
【図２６】
2006031377.tif 000028
【図２７】
2006031377.tif 000029
【図２８】
2006031377.tif 000030
【図２９】
2006031377.tif 000031
【図３０】
2006031377.tif 000032
【図３１】
2006031377.tif 000033
【図３２】
2006031377.tif 000034
【図３３】
2006031377.tif 000035
【図３４】
2006031377.tif 000036
【図３５】
2006031377.tif 000037
【図３６】
2006031377.tif 000038
【図３７】
2006031377.tif 000039
【図３８】
2006031377.tif 000040
【図３９】
2006031377.tif 000041
【図４０】
2006031377.tif 000042
【手続補正書】
【提出日】平成17年4月13日(2005.4.13)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】００１１
【補正方法】変更
【補正の内容】
【００１１】
ネイティブに構造化文書データを管理する方式では、構造化文書データは要素間の階層構造をそのまま記憶する。検索条件として指定された要素や構造があるか否かを調べるためには、二次記憶上に格納された構造化文書データの要素間を頻繁にアクセスしなければならない。複雑な検索条件の場合はなおさらである。
【特許文献１】特開２００１−３４６１８公報
【特許文献２】特開２０００−５７１６３公報