(57)【特許請求の範囲】
【請求項１】
蓄積検索対象の情報の単位であるタプルは、属性−値の組の並びを少なくとも含む１以上の長さを有するものであり、該属性の種類や該並びの長さが同じまたは異なる１つ以上の該タプルが複数記憶されるものであり、該タプルから検索キーがインデックス化され検索木が構築されるものであり、該検索木はノードを階層的に有する構成であり、該ノードの内最下層のリーフノードはエントリとして該タプルを識別するタプル識別子とキーを有するものであり、該ノードの内該リーフノードより上位のインナーノードはエントリとして下位ノードである子ノードの位置情報であるポインタとキーを有するものであり、
コンピュータが、
該インデックスの構築において、エントリをノードに挿入する際、
１つの挿入すべきエントリＸと、該エントリを挿入すべきレベル数Ｌ（前記リーフノードを０として階層が上がるごとに１増える階層数）が与えられた際、
はじめにルートノードを操作対象ノードとし、
操作対象ノードにおいて、「該操作対象ノードがすでに含む既存エントリに対し、該エントリＸを挿入した場合のペナルティ」が最も小さい該既存エントリを選出し、
該既存エントリに含まれるポインタが指し示す子ノードを次の操作対象ノードと選定し、
該次の操作対象ノードのレベル数がＬより大きい場合は、該次の操作対象ノードからさらに次の操作対象ノードを選定することを再帰的に繰り返し、
該次の操作対象ノードのレベル数がＬに到達した場合は、このノードを選択ノードとするステップと、
前記選択ノードが許容できる最大数のエントリを持っていない場合において、前記選択ノードに対し、前記エントリＸを追加するステップと、
前記選択ノードが既に許容できる最大数のエントリを持っている場合において、前記エントリＸを追加しつつ前記選択ノードの分割を行うステップと、
前記分割を行った場合において、前記選択ノードの上位ノードのエントリを更新するステップと、
を実行する情報蓄積検索方法において、
該ペナルティは、該操作対象ノードがすでに含む既存エントリＡに対し、エントリＢを挿入する際、該エントリＢを挿入する前の該エントリＡと、挿入した後の該エントリＡとを比べた場合の、該エントリＡが検索される確率に対応した値の増分を示す値として定義され、
前記ペナルティの算出において、
前記エントリが検索される確率に対応した値として、該エントリに含まれる前記キーに含まれる各属性に対する重みづけ付き正規化長の和を用い、
該重みづけ付き正規化長は、正規化長に、該属性が検索式に用いられる確率を掛け合わせた値であり、
該正規化長は、該キーに含まれる該属性の最大値から最小値を引いた値を、それまで該検索木に挿入された全タプル集合に含まれる該属性の最大値から最小値を引いた値で除した値である、
ことを特徴とする情報蓄積検索方法。
【請求項２】
請求項１に記載の情報蓄積検索方法において、
前記分割を行うステップが、
前記選択ノードが含む複数のエントリに前記エントリＸを追加した各エントリを２つのグループに順次、振り分ける際に、各グループがすでに含むエントリの和をとったエントリを前記既存エントリＡとし、該振り分けられるエントリを前記エントリＢとしてグループ毎に求めた各前記ペナルティに基づいて振り分け先のグループを選択して振り分けを行うステップと、
該２つのグループうちの１つのグループに振り分けられた各エントリを前記選択ノードのエントリとするとともに、もう１つのグループに振り分けられた各エントリを新たに生成したノードのエントリとするステップと、
該新たに生成したノードのエントリを該ノードの親ノードに挿入するステップと、
を含むことを特徴とする情報蓄積検索方法。
【請求項３】
請求項２に記載の情報蓄積検索方法において、
前記分割を行うステップにおいて、
前記選択ノードが含む複数のエントリに前記エントリＸを追加した各エントリを２つのグループに順次、振り分ける際、はじめに、前記各エントリに含まれる任意の２つのエントリの一方を前記既存エントリＡとし、他方のエントリを前記エントリＢとして求めた前記ペナルティから、前記他方のエントリが検索される確率に対応した値を減じた値が最も大きくなる２つのエントリを、前記２つのグループに振り分ける
ことを特徴とする情報蓄積検索方法。
【請求項４】
請求項１ないし３のいずれか１項に記載の情報蓄積検索方法において、
前記属性が検索式に用いられる確率として、属性出現回数をタプル総数で除した値を用い、
該属性出現回数は、それまでに該検索木に挿入された全タプル集合における該属性の出現回数であり、
該タプル総数は、それまでに該検索木に挿入された全タプル集合の要素数である、
ことを特徴とする情報蓄積検索方法。
【請求項５】
請求項１ないし４のいずれか１項に記載の情報蓄積検索方法において、
前記検索木を用いた検索において、
検索式としての前記キーである検索キーに対し、
前記ルートノードからその下位の前記ノードへと検索対象を変えながら、
１つの該ノードを検索対象とし、
該ノードが前記インナーノードであれば、該ノードに含まれる前記各エントリについて、該エントリのキーが前記検索キーに含まれる各属性を全て含み、かつ、該検索キーに含まれる各属性に対応する値または値範囲と該エントリのキーに含まれる該属性に対応する値または値範囲とが一致または部分的に一致する（一方の値または値範囲が、他方の値範囲に含まれるまたは一部重なる）かを調べる検索手順を行い、一致または部分的に一致する場合には、該エントリの前記ポインタで接続されたノードを検索対象、該検索キーを検索キーとして前記検索手順を再帰的に行い、
また、該ノードが前記リーフノードであれば、該ノードに含まれる前記各エントリについて、該エントリのキーが前記検索キーに含まれる各属性を全て含み、かつ、前記検索キーに含まれる各属性に対応する値または値範囲に該エントリのキーに含まれる該属性に対応する値が含まれるかを調べ、含まれる場合には該エントリの前記タプル識別子を検索結果タプル識別子集合に加えるノード検索ステップ、
を有することを特徴とする情報蓄積検索方法。
【請求項６】
蓄積検索対象の情報の単位であるタプルは、属性−値の組の並びを少なくとも含む１以上の長さを有するものであり、該属性の種類や該並びの長さが同じまたは異なる１つ以上の該タプルが複数記憶されるものであり、該タプルから検索キーがインデックス化され検索木が構築されるものであり、該検索木はノードを階層的に有する構成であり、該ノードの内最下層のリーフノードはエントリとして該タプルを識別するタプル識別子とキーを有するものであり、該ノードの内該リーフノードより上位のインナーノードはエントリとして下位ノードである子ノードの位置情報であるポインタとキーを有するものであり、
該インデックスの構築において、エントリをノードに挿入する際、
１つの挿入すべきエントリＸと、該エントリを挿入すべきレベル数Ｌ（前記リーフノードを０として階層が上がるごとに１増える階層数）が与えられた際、
はじめにルートノードを操作対象ノードとし、
操作対象ノードにおいて、「該操作対象ノードがすでに含む既存エントリに対し、該エントリＸを挿入した場合のペナルティ」が最も小さい該既存エントリを選出し、
該既存エントリに含まれるポインタが指し示す子ノードを次の操作対象ノードと選定し、
該次の操作対象ノードのレベル数がＬより大きい場合は、該次の操作対象ノードからさらに次の操作対象ノードを選定することを再帰的に繰り返し、
該次の操作対象ノードのレベル数がＬに到達した場合は、このノードを選択ノードとするステップと、
前記選択ノードが許容できる最大数のエントリを持っていない場合において、前記選択ノードに対し、前記エントリＸを追加するステップと、
前記選択ノードが既に許容できる最大数のエントリを持っている場合において、前記エントリＸを追加しつつ前記選択ノードの分割を行うステップと、
前記分割を行った場合において、前記選択ノードの上位ノードのエントリを更新するステップと、
をコンピュータを用いて実行するためのプログラムにおいて、
該ペナルティは、該操作対象ノードがすでに含む既存エントリＡに対し、エントリＢを挿入する際、該エントリＢを挿入する前の該エントリＡと、挿入した後の該エントリＡとを比べた場合の、該エントリＡが検索される確率に対応した値の増分を示す値として定義され、
前記ペナルティの算出において、
前記エントリが検索される確率に対応した値として、該エントリに含まれる前記キーに含まれる各属性に対する重みづけ付き正規化長の和を用い、
該重みづけ付き正規化長は、正規化長に、該属性が検索式に用いられる確率を掛け合わせた値であり、
該正規化長は、該キーに含まれる該属性の最大値から最小値を引いた値を、それまで該検索木に挿入された全タプル集合に含まれる該属性の最大値から最小値を引いた値で除した値である、
ことを特徴とする情報蓄積検索プログラム。
【請求項７】
請求項６に記載の情報蓄積検索プログラムにおいて、
前記分割を行うステップが、
前記選択ノードが含む複数のエントリに前記エントリＸを追加した各エントリを２つのグループに順次、振り分ける際に、各グループがすでに含むエントリの和をとったエントリを前記既存エントリＡとし、該振り分けられるエントリを前記エントリＢとしてグループ毎に求めた各前記ペナルティに基づいて振り分け先のグループを選択して振り分けを行うステップと、
該２つのグループうちの１つのグループに振り分けられた各エントリを前記選択ノードのエントリとするとともに、もう１つのグループに振り分けられた各エントリを新たに生成したノードのエントリとするステップと、
該新たに生成したノードのエントリを該ノードの親ノードに挿入するステップと、
を含むことを特徴とする情報蓄積検索プログラム。
【請求項８】
請求項７に記載の情報蓄積検索プログラムにおいて、
前記分割を行うステップにおいて、
前記選択ノードが含む複数のエントリに前記エントリＸを追加した各エントリを２つのグループに順次、振り分ける際、はじめに、前記各エントリに含まれる任意の２つのエントリの一方を前記既存エントリＡとし、他方のエントリを前記エントリＢとして求めた前記ペナルティから、前記他方のエントリが検索される確率に対応した値を減じた値が最も大きくなる２つのエントリを、前記２つのグループに振り分ける
ことを特徴とする情報蓄積検索プログラム。
【請求項９】
請求項６ないし８のいずれか１項に記載の情報蓄積検索プログラムにおいて、
前記属性が検索式に用いられる確率として、属性出現回数をタプル総数で除した値を用い、
該属性出現回数は、それまでに該検索木に挿入された全タプル集合における該属性の出現回数であり、
該タプル総数は、それまでに該検索木に挿入された全タプル集合の要素数である、
ことを特徴とする情報蓄積検索プログラム。
【請求項１０】
請求項６ないし９のいずれか１項に記載の情報蓄積検索プログラムにおいて、
前記検索木を用いた検索において、
検索式としての前記キーである検索キーに対し、
前記ルートノードからその下位の前記ノードへと検索対象を変えながら、
１つの該ノードを検索対象とし、
該ノードが前記インナーノードであれば、該ノードに含まれる前記各エントリについて、該エントリのキーが前記検索キーに含まれる各属性を全て含み、かつ、該検索キーに含まれる各属性に対応する値または値範囲と該エントリのキーに含まれる該属性に対応する値または値範囲とが一致または部分的に一致する（一方の値または値範囲が、他方の値範囲に含まれるまたは一部重なる）かを調べる検索手順を行い、一致または部分的に一致する場合には、該エントリの前記ポインタで接続されたノードを検索対象、該検索キーを検索キーとして前記検索手順を再帰的に行い、
また、該ノードが前記リーフノードであれば、該ノードに含まれる前記各エントリについて、該エントリのキーが前記検索キーに含まれる各属性を全て含み、かつ、前記検索キーに含まれる各属性に対応する値または値範囲に該エントリのキーに含まれる該属性に対応する値が含まれるかを調べ、含まれる場合には該エントリの前記タプル識別子を検索結果タプル識別子集合に加えるノード検索ステップ、
を有することを特徴とする情報蓄積検索プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
多次元かつ多種類のデータの中から、目的のデータを高速に検索するためのインデキシング方式の構築の際に用いて好適な情報蓄積検索方法及び情報蓄積検索プログラムに関するものである。
【背景技術】
【０００２】
データベース技術の分野においては、多量のデータから目的のデータを高速に検索するために、タプル表における検索対象タプルの属性値をあらかじめインデキシングしておくインデキシング技術が、各種考案されている。ここで、タプルとは、個々のデータのことであり、リレーショナルデータベース（ＲＤＢ）における呼び名と同様の呼称である。タプルは、１つ以上の属性と値のペア（ＡＶペア（属性−値ペア））から構成されるものを指すものとする。また、タプルの集合を表（テーブル）として表したものが、タプル表である。
【０００３】
現在最も広く使われているＲＤＢにおいては、Ｂ木と呼ばれるデータ構造がインデックスとして用いられることが多い。特に、実用化されているＲＤＢにおいてはＢ木の改良型であるＢ＋木やＢ＊木を使うことが多い。これらの技術はファイルシステムにおいても活用されている。
【０００４】
これらのＢ＋木やＢ＊木を用いたインデックスは、各タプル内の１種類の属性に対する属性値（ＲＤＢで言えばある１つのカラムに入る値）の集合に対して構築される木の形をしたデータ構造（木構造）であり、検索木とも呼ばれる。タプル表にタプルを登録する際、インデックスの構築も行う（検索時に検索条件を指定したい属性毎に、この検索木を構築する）ことで、高速な検索が可能となる。
【０００５】
木構造は、ノードとノード間を結ぶ枝で表される。ノードはデータの集まりであり、後述する。木構造内では、ノードが階層構造をなしており、この内、上位のノードを親ノード、下位のノードを子ノードと称する。木構造の頂点にあるノードをルートノード、木構造の最底辺にあるノードをリーフノード、リーフノード以外のノードをインナーノードと称する。そして、レベル数は、各ノードに対して定義される、ノードの階層を意味する値である。
【０００６】
リーフノードは、タプル表における検索対象タプルのＩＤ（識別子）とキーを格納する。インナーノード（ルートノードを含む）は、自分の子ノードへのポインタを有する。また、自分に帰属するリーフノードがどのようなキー範囲のタプルを含んでいるかについても情報を格納する。従って、検索（Ｓｅａｒｃｈ）においては、インデックスを用いることで、該当する検索するキー範囲のタプルがどこに存在するかがわかるので、タプル表を全て検索する必要がなくなり、高速で検索することが可能となる。
【０００７】
なお、検索木を構築する際、ノードにエントリ（対応するポインタとキーの組み合わせ）が追加される。その手順がＩｎｓｅｒｔ（エントリ挿入手順）と呼ばれるものである。その際、どのノードにエントリをＩｎｓｅｒｔするかを選択するのが、ＣｈｏｏｓｅＳｕｂｔｒｅｅ（部分木選択手順）と呼ばれる手順である。また、Ｉｎｓｅｒｔする際に、対象となるノードが既に許容できる最大数のエントリを持っている場合にはノードの分割を行う。これが、Ｓｐｌｉｔ（ノード分割手順）と呼ばれる手順である。Ｓｐｌｉｔを行ったノードの親ノード（〜ルートノード）に対しては、子ノードのエントリを更新する必要が生じる。この更新作業がＡｄｊｕｓｔＫｅｙｓ（キー集合情報調整手順）と呼ばれる手順である。これらについては、後述する。
【０００８】
これらＢ木ないしその改良型は１つの属性に対して構築されるインデックスであるが、他にも、２つ以上の属性に対して構築されるインデックスが存在し、２つ以上の属性の値もしくは値の範囲を指定した検索を高速に実現するのに利用される。こうしたインデックスは複数の属性をもつタプル、すなわち多次元データを含むタプルに対するものであるため、多次元インデックスと呼ばれる。多次元インデックスの最も代表的なものはＲ木である。Ｒ木はＢ木と同様に木構造であり、Ｒ＊木、Ｒ＋木など多くの改良型が存在する。
これら従来の検索木の多くは、非特許文献１に記載されているように、共通して以下の特徴をもつ。すなわち、インデックスは木構造の検索木であり、１つ以上のノードを含んでいる。ルートノードと呼ぶ第１階層のノードからポインタによってノード間が階層的に接続されている。ノードは０から予め定められた閾値までの個数のエントリを含んでいる。リーフノードのエントリは、タプルのＩＤ（識別子）とタプルのキーの組から構成されている。一方、インナーノードの該エントリは、他のノードへのポインタと、他のノードが含むエントリ集合のキーの和をとったキーの組とから構成されている。そして、キーは、１以上の長さ（すなわち１以上のデータ列の長さ；以下同様）を有する属性−値または属性−値範囲の組の並びである。
【０００９】
一方、非特許文献１には、これらの検索木へのタプル挿入方法、すなわちタプルのインデキシング方法に関し、Ｉｎｓｅｒｔ、ＣｈｏｏｓｅＳｕｂｔｒｅｅ、Ｓｐｌｉｔ、ＡｄｊｕｓｔＫｅｙｓが開示されているので、以下に記載する。
【００１０】
（Ｉｎｓｅｒｔ）
１つのエントリを、レベル数Ｌのノードに対しＩｎｓｅｒｔする手順である。まず、このエントリとレベル数Ｌに対する部分木選択手順（ＣｈｏｏｓｅＳｕｂｔｒｅｅ、後述）を実施し、ノードを選択する。この選択されたレベル数Ｌのノードが予め決められた数未満のエントリを含む場合には、このノードにエントリを加える。一方、このノードが予め決められた数以上のエントリを含む場合には、ノード分割手順（Ｓｐｌｉｔ、後述）を実施し、さらに、キー集合情報調整手順（ＡｄｊｕｓｔＫｅｙｓ、後述）を実施する。
【００１１】
（ＣｈｏｏｓｅＳｕｂｔｒｅｅ）
ＣｈｏｏｓｅＳｕｂｔｒｅｅにおいては、１つのエントリＸと、レベル数Ｌが与えられる。はじめに、ルートノードを操作対象のノードとして選択する。そして、この操作対象のノードが含むエントリのうち、「該操作対象ノードがすでに含む既存エントリに対し、該エントリＸを挿入した場合のペナルティ」が最も小さいエントリを選出する。そして、このエントリに含まれるポインタが指し示す子ノードを、次の操作対象のノードとする。この操作を、操作対象のノードのレベル数がＬとなるまで繰り返し、ノードを選択する。
【００１２】
（Ｓｐｌｉｔ）
検索木内の１つのノードと、１つのエントリに対し、このノード内のキー集合とこのエントリ内のキーを含めたキー集合を２つのグループに分割し、そのうち１つを新しいノードに入れ、新しいノードをこのノードの親ノードに挿入する。
【００１３】
（ＡｄｊｕｓｔＫｅｙｓ）
検索木内の１つのノードに対し、このノードが含むキー集合情報を親ノードに伝達し、親ノードにこのノード（親ノードから見て、子ノード）が含むキー集合情報を保持させる操作を、このノードからルートノードまで再帰的に行う。
また同様に、非特許文献１には、これらの検索木を用いたタプル検索方法（Ｓｅａｒｃｈ）が開示されているので、以下に記載する。
【００１４】
（Ｓｅａｒｃｈ）
検索では、検索式としてのキーである検索キーが与えられる。これに対して、上位のノードから、含まれるエントリを調査し、最終的に目的のエントリのキーを含むリーフノードを探していく。調査するノードがインナーノード（リーフノードでない）の場合、このノードに含まれる各エントリについて、エントリのキーが検索キーに含まれる各属性を全て含み、かつ、検索キーに含まれる各属性に対応する値または値範囲と該エントリのキーに含まれる該属性に対応する値または値範囲とが一致または部分的に一致するかを調べる。そして、これが、一致または部分的に一致する場合には、このエントリに対応するポインタが指定する子ノードを調査対象とし、また、このときの検索キーを新たな検索キーとしてノード検索手順を再帰的に行う。この調査を再帰的に行うと、調査対象のノードは最終的にリーフノードとなる。調査対象のノードがリーフノードとなった場合、このノードに含まれる各エントリについて、このエントリのキーが検索キーに含まれる各属性を全て含み、かつ、検索キーに含まれる各属性に対応する値または値範囲にこのエントリのキーに含まれる属性に対応する値が含まれるかを調べ、含まれる場合にはこのエントリのタプルのＩＤ（識別子）を検索結果タプル識別子集合に加える。
【００１５】
なお、ＣｈｏｏｓｅＳｕｂｔｒｅｅにおいて前述したペナルティとして、例えばＲ木においては、一般に最小包囲矩形、あるいは最小外接矩形（Ｍｉｎｉｍｕｍ  Ｂｏｕｎｄｉｎｇ  Ｒｅｃｔａｎｇｌｅ；  ＭＢＲ）と呼ばれるオブジェクトの大きさの増加量が用いられる。３次元空間内の座標データを示すタプル集合であれば、各エントリのキーも３次元となり、エントリの最小外接矩形は、該エントリが下位の階層に含むタプル集合を全て含む各面がいずれかの軸に平行な最小の直方体となる。タプル挿入においては、前記部分木選択手順により該直方体の体積増加が最小となるノードをタプル挿入先として選択することになる。これは、３次元空間内で近いタプル同士を同じノードへ入れていくクラスタリングに相当し、これにより、検索条件を満たすタプルを効率的に見つけることができるようになる。また、ペナルティは、前記ノード分割手順においても、良い分割か否かの指標として用いられる。
【先行技術文献】
【非特許文献】
【００１６】
【非特許文献１】Ｊｏｓｅｐｈ  Ｍ．Ｈｅｌｌｅｒｓｔｅｉｎ，  Ｊｅｆｆｒｅｙ  Ｆ．  Ｎａｕｇｈｔｏｎ  ａｎｄ  Ａｖｉ  Ｐｆｅｆｆｅｒ，  “Ｇｅｎｅｒａｌｉｚｅｄ  Ｓｅａｒｃｈ  Ｔｒｅｅｓ  ｆｏｒ  Ｄａｔａｂａｓｅ  Ｓｙｓｔｅｍｓ，”  Ｐｒｏｃ．  ２１ｓｔ  Ｉｎｔ’ｌ  Ｃｏｎｆ．  ｏｎ  Ｖｅｒｙ  Ｌａｒｇｅ  Ｄａｔａ  Ｂａｓｅｓ，  Ｚuｒｉｃｈ，  Ｓｅｐｔｅｍｂｅｒ  １９９５，  ｐｐ．５６２−５７３．
【発明の概要】
【発明が解決しようとする課題】
【００１７】
ＭＥＭＳ（Ｍｉｃｒｏ−Ｅｌｅｃｔｒｏ−Ｍｅｃｈａｎｉｃａｌ  Ｓｙｓｔｅｍｓ）技術、蓄電技術、通信技術などの発達により、様々な小型センサデバイスが安価に入手可能となりつつある。身の回りにこうした多様なセンサが多数配置され、それらを利用した様々なアプリケーションが我々の生活を支援する、そうしたユビキタス環境の実現が期待される。こうしたセンサデバイスから出力されるセンサデータは、通常、前記タプルの形式で表現することが可能である。
【００１８】
様々なセンサやアプリケーションが存在するユビキタス環境においては、それだけ様々な属性を含んだセンサデータ（タプル）が蓄積され、また様々な属性を指定した検索が行われるようになる。たとえばｘ，ｙ方向の２次元の加速度センサから得られるタプルと、ｘ，ｙ，ｚ方向の３次元の加速度センサから得られるタプルが混在する場合、ｘ，ｙ方向の加速度を知りたいアプリケーションは、どちらの種類のタプルも活用できるべきである。すなわち、「ｘ，ｙ方向の加速度データ」を検索条件とした場合、どちらの種類のタプルも検索する必要がある。このような、次元数や次元種類に依存しない、タプルの横断的検索が必要とされ、また特に、数値で示されることが多いセンサデータの検索においては、範囲検索が重要となる。こうした多種多次元なタプルに対する範囲検索をなるべく効率的に実現する場合、従来のインデックス技術を利用する場合にはＢ木（あるいはその改良型）を使う方法と、Ｒ木（あるいはその改良型）を使う方法が考えられる。
【００１９】
Ｂ木を使う方法は、各属性に対してＢ木によるインデックスを構築しておき、検索条件で指定される各属性に対し、当該属性に対応するＢ木インデックスを使用して当該属性の条件を満たすタプルを検索した後、全結果のＡＮＤ（論理積）をとり（すなわち、どの結果にも含まれているタプルのみを抽出し）、それを最終的な検索結果とする、というものである。
【００２０】
しかしながら、Ｂ木を使う方法は、複数のＢ木にアクセスするため、検索時のアクセスノード数の総数が大きくなってしまう。アクセスノード数は、検索の処理量や速度を決める重要なパラメータである。またＡＮＤをとる処理の処理量は、最終的な検索結果の量ではなく、各Ｂ木での検索で得られた中間結果の量に依存するため、タプル数に従って大きくなりやすい。つまりＢ木を使う方法には、検索処理全体の処理量や処理時間が大きくなりやすいという問題がある。
【００２１】
Ｒ木を使う方法は、タプル種類毎に、つまり前記の加速度センサの例であればｘ，ｙ２次元のタプルとｘ，ｙ，ｚ３次元のタプルそれぞれに対して、Ｒ木によるインデックスを構築しておき、検索条件で指定される全属性を含むタプル種類に対応するＲ木インデックスを使用して検索条件を満たすタプルを検索した後、全結果のＯＲ（論理和）をとり（各結果をまとめ）、それを最終的な検索結果とする、というものである。
【００２２】
しかしながら、Ｒ木を使う方法においても、やはり複数のＲ木にアクセスするため、タプル種類数が大きくなった場合には、Ｒ木検索時のアクセスノード数の総数が大きくなってしまう。またどのＲ木を検索するべきかを判断する前処理も必要である。つまりこの方法にも、検索処理全体の処理量や処理時間が大きくなりやすいという問題がある。
【００２３】
そこで、１つの検索木に多種多次元のタプル集合、すなわち属性の数や種類が異なるタプル集合を挿入することが考えられるが、前記従来の木構造のインデックスは、対象とするタプル集合が、すべて同次元であることが前提とされている。つまり、属性の数と種類が同じタプルの集合に対してインデックスを構築することを前提としている。例えば、２次元空間内の座標データを示すタプル集合をＲ木によってインデキシングする場合を考える。このとき、該タプル集合を下位の階層に含むエントリの最小外接矩形は、該タプル集合を全て含む最小の長方形で表される。多種多次元のタプルをインデキシングする場合、ここに新たに３次元のタプルが挿入される場合もあり、この場合、最小外接矩形は直方体となる。ペナルティは、定義上、直方体の体積から長方形の面積を引いた値となるが、次元の異なる値同士の引き算による値は論理的意味をもたず、良いクラスタリングの指標とはなりえない。結果、多種多次元のタプル集合に対し、Ｒ木では良い検索効率を実現できない。別の表現をすれば、従来の木構造インデックスにおいては、２つのエントリを入力とするペナルティの計算において、該エントリのキーが含む全次元について、次元毎に大小関係を判別可能である必要があるが、多種多次元のタプルを下位に含むエントリ間では、そのキーが含む次元も異なるために、次元毎の大小関係を必ずしも判別できず、多種多次元のタプルに対する効率的なインデックスを構築することができなかった。
【００２４】
本発明は、このような事情を考慮し、上記の問題を解決すべくなされたもので、その目的は、多種多次元のタプルに対する検索を、タプル数や含まれる属性種類数が大きくなった場合にも、効率的に実現することにある。
【課題を解決するための手段】
【００２５】
上記課題を解決するため、請求項１記載の発明は、蓄積検索対象の情報の単位であるタプルは、属性−値の組の並びを少なくとも含む１以上の長さを有するものであり、該属性の種類や該並びの長さが同じまたは異なる１つ以上の該タプルが複数記憶されるものであり、該タプルから検索キーがインデックス化され検索木が構築されるものであり、該検索木はノードを階層的に有する構成であり、該ノードの内最下層のリーフノードはエントリとして該タプルを識別するタプル識別子とキーを有するものであり、該ノードの内該リーフノードより上位のインナーノードはエントリとして下位ノードである子ノードの位置情報であるポインタとキーを有するものであり、該インデックスの構築において、エントリをノードに挿入する際、１つの挿入すべきエントリＸと、該エントリを挿入すべきレベル数Ｌ（前記リーフノードを０として階層が上がるごとに１増える階層数）が与えられた際、はじめにルートノードを操作対象ノードとし、操作対象ノードにおいて、「該操作対象ノードがすでに含む既存エントリに対し、該エントリＸを挿入した場合のペナルティ」が最も小さい該既存エントリを選出し、該既存エントリに含まれるポインタが指し示す子ノードを次の操作対象ノードと選定し、該次の操作対象ノードのレベル数がＬより大きい場合は、該次の操作対象ノードからさらに次の操作対象ノードを選定することを再帰的に繰り返し、該次の操作対象ノードのレベル数がＬに到達した場合は、このノードを選択ノードとするステップと、前記選択ノードが許容できる最大数のエントリを持っていない場合において、前記選択ノードに対し、前記エントリＸを追加するステップと、前記選択ノードが既に許容できる最大数のエントリを持っている場合において、前記エントリＸを追加しつつ前記選択ノードの分割を行うステップと、前記分割を行った場合において、前記選択ノードの上位ノードのエントリを更新するステップと、を有する情報蓄積検索方法において、該ペナルティは、該操作対象ノードがすでに含む既存エントリＡに対し、エントリＢを挿入する際、該エントリＢを挿入する前の該エントリＡと、挿入した後の該エントリＡとを比べた場合の、該エントリＡが検索される確率に対応した値の増分を示す値として定義される、ことを特徴とする情報蓄積検索方法である。
【００２６】
請求項２記載の発明は、請求項１に記載の分割を行うステップが、前記選択ノードが含む複数のエントリに前記エントリＸを追加した各エントリを２つのグループに順次、振り分ける際に、各グループがすでに含むエントリの和をとったエントリを前記既存エントリＡとし、該振り分けられるエントリを前記エントリＢとしてグループ毎に求めた各前記ペナルティに基づいて振り分け先のグループを選択して振り分けを行うステップと、該２つのグループうちの１つのグループに振り分けられた各エントリを前記選択ノードのエントリとするとともに、もう１つのグループに振り分けられた各エントリを新たに生成したノードのエントリとするステップと、該新たに生成したノードのエントリを該ノードの親ノードに挿入するステップと、を含むことを特徴とする情報蓄積検索方法である。
【００２７】
請求項３記載の発明は、請求項２に記載の分割を行うステップにおいて、前記選択ノードが含む複数のエントリに前記エントリＸを追加した各エントリを２つのグループに順次、振り分ける際、はじめに、前記各エントリに含まれる任意の２つのエントリの一方を前記既存エントリＡとし、他方のエントリを前記エントリＢとして求めた前記ペナルティから、前記他方のエントリが検索される確率に対応した値を減じた値が最も大きくなる２つのエントリを、前記２つのグループに振り分けることを特徴とする情報蓄積検索方法である。
【００２８】
請求項４記載の発明は、請求項１ないし３に記載のペナルティの算出において、前記エントリが検索される確率に対応した値として、該エントリに含まれる前記キーに含まれる各属性に対する重みづけ付き正規化長の和を用い、該重みづけ付き正規化長は、正規化長に、該属性が検索式に用いられる確率を掛け合わせた値であり、該正規化長は、該キーに含まれる該属性の最大値から最小値を引いた値を、それまで該検索木に挿入された全タプル集合に含まれる該属性の最大値から最小値を引いた値で除した値である、ことを特徴とする情報蓄積検索方法である。
【００２９】
請求項５記載の発明は、請求項４において、前記属性が検索式に用いられる確率として、属性出現回数をタプル総数で除した値を用い、該属性出現回数は、それまでに該検索木に挿入された全タプル集合における該属性の出現回数であり、該タプル総数は、それまでに該検索木に挿入された全タプル集合の要素数である、ことを特徴とする情報蓄積検索方法である。
【００３０】
請求項６記載の発明は、請求項１ないし５に記載の前記検索木を用いた検索において、検索式としての前記キーである検索キーに対し、前記ルートノードからその下位の前記ノードへと検索対象を変えながら、１つの該ノードを検索対象とし、該ノードが前記インナーノードであれば、該ノードに含まれる前記各エントリについて、該エントリのキーが前記検索キーに含まれる各属性を全て含み、かつ、該検索キーに含まれる各属性に対応する値または値範囲と該エントリのキーに含まれる該属性に対応する値または値範囲とが一致または部分的に一致する（一方の値または値範囲が、他方の値範囲に含まれるまたは一部重なる）かを調べる検索手順を行い、一致または部分的に一致する場合には、該エントリの前記ポインタで接続されたノードを検索対象、該検索キーを検索キーとして前記ノード検索手順を再帰的に行い、また、該ノードが前記リーフノードであれば、該ノードに含まれる前記各エントリについて、該エントリのキーが前記検索キーに含まれる各属性を全て含み、かつ、前記検索キーに含まれる各属性に対応する値または値範囲に該エントリのキーに含まれる該属性に対応する値が含まれるかを調べ、含まれる場合には該エントリの前記タプル識別子を検索結果タプル識別子集合に加えるノード検索ステップ、を有することを特徴とする情報蓄積検索方法である。
【００３１】
請求項７記載の発明は、蓄積検索対象の情報の単位であるタプルは、属性−値の組の並びを少なくとも含む１以上の長さを有するものであり、該属性の種類や該並びの長さが同じまたは異なる１つ以上の該タプルが複数記憶されるものであり、該タプルから検索キーがインデックス化され検索木が構築されるものであり、該検索木はノードを階層的に有する構成であり、該ノードの内最下層のリーフノードはエントリとして該タプルを識別するタプル識別子とキーを有するものであり、該ノードの内該リーフノードより上位のインナーノードはエントリとして下位ノードである子ノードの位置情報であるポインタとキーを有するものであり、該インデックスの構築において、エントリをノードに挿入する際、
１つの挿入すべきエントリＸと、該エントリを挿入すべきレベル数Ｌ（前記リーフノードを０として階層が上がるごとに１増える階層数）が与えられた際、はじめにルートノードを操作対象ノードとし、操作対象ノードにおいて、「該操作対象ノードがすでに含む既存エントリに対し、該エントリＸを挿入した場合のペナルティ」が最も小さい該既存エントリを選出し、該既存エントリに含まれるポインタが指し示す子ノードを次の操作対象ノードと選定し、該次の操作対象ノードのレベル数がＬより大きい場合は、該次の操作対象ノードからさらに次の操作対象ノードを選定することを再帰的に繰り返し、該次の操作対象ノードのレベル数がＬに到達した場合は、このノードを選択ノードとするステップと、前記選択ノードが許容できる最大数のエントリを持っていない場合において、前記選択ノードに対し、前記エントリＸを追加するステップと、前記選択ノードが既に許容できる最大数のエントリを持っている場合において、前記エントリＸを追加しつつ前記選択ノードの分割を行うステップと、前記分割を行った場合において、前記選択ノードの上位ノードのエントリを更新するステップと、をコンピュータを用いて実行するためのプログラムにおいて、該ペナルティは、該操作対象ノードがすでに含む既存エントリＡに対し、エントリＢを挿入する際、該エントリＢを挿入する前の該エントリＡと、挿入した後の該エントリＡとを比べた場合の、該エントリＡが検索される確率に対応した値の増分を示す値として定義される、ことを特徴とする情報蓄積検索プログラムである。
【００３２】
請求項８記載の発明は、請求項７に記載の分割を行うステップが、前記選択ノードが含む複数のエントリに前記エントリＸを追加した各エントリを２つのグループに順次、振り分ける際に、各グループがすでに含むエントリの和をとったエントリを前記既存エントリＡとし、該振り分けられるエントリを前記エントリＢとしてグループ毎に求めた各前記ペナルティに基づいて振り分け先のグループを選択して振り分けを行うステップと、該２つのグループうちの１つのグループに振り分けられた各エントリを前記選択ノードのエントリとするとともに、もう１つのグループに振り分けられた各エントリを新たに生成したノードのエントリとするステップと、該新たに生成したノードのエントリを該ノードの親ノードに挿入するステップと、を含むことを特徴とする情報蓄積検索プログラムである。
【００３３】
請求項９記載の発明は、請求項８に記載の分割を行うステップにおいて、前記選択ノードが含む複数のエントリに前記エントリＸを追加した各エントリを２つのグループに順次、振り分ける際、はじめに、前記各エントリに含まれる任意の２つのエントリの一方を前記既存エントリＡとし、他方のエントリを前記エントリＢとして求めた前記ペナルティから、前記他方のエントリが検索される確率に対応した値を減じた値が最も大きくなる２つのエントリを、前記２つのグループに振り分けることを特徴とする情報蓄積検索プログラムである。
【００３４】
請求項１０記載の発明は、請求項７ないし９に記載のペナルティの算出において、前記エントリが検索される確率に対応した値として、該エントリに含まれる前記キーに含まれる各属性に対する重みづけ付き正規化長の和を用い、該重みづけ付き正規化長は、正規化長に、該属性が検索式に用いられる確率を掛け合わせた値であり、該正規化長は、該キーに含まれる該属性の最大値から最小値を引いた値を、それまで該検索木に挿入された全タプル集合に含まれる該属性の最大値から最小値を引いた値で除した値である、ことを特徴とする情報蓄積検索プログラムである。
【００３５】
請求項１１記載の発明は、請求項１０において、前記属性が検索式に用いられる確率として、属性出現回数をタプル総数で除した値を用い、該属性出現回数は、それまでに該検索木に挿入された全タプル集合における該属性の出現回数であり、該タプル総数は、それまでに該検索木に挿入された全タプル集合の要素数である、ことを特徴とする情報蓄積検索プログラムである。
【００３６】
請求項１２記載の発明は、請求項７ないし１１に記載の前記検索木を用いた検索において、検索式としての前記キーである検索キーに対し、前記ルートノードからその下位の前記ノードへと検索対象を変えながら、１つの該ノードを検索対象とし、該ノードが前記インナーノードであれば、該ノードに含まれる前記各エントリについて、該エントリのキーが前記検索キーに含まれる各属性を全て含み、かつ、該検索キーに含まれる各属性に対応する値または値範囲と該エントリのキーに含まれる該属性に対応する値または値範囲とが一致または部分的に一致する（一方の値または値範囲が、他方の値範囲に含まれるまたは一部重なる）かを調べる検索手順を行い、一致または部分的に一致する場合には、該エントリの前記ポインタで接続されたノードを検索対象、該検索キーを検索キーとして前記ノード検索手順を再帰的に行い、また、該ノードが前記リーフノードであれば、該ノードに含まれる前記各エントリについて、該エントリのキーが前記検索キーに含まれる各属性を全て含み、かつ、前記検索キーに含まれる各属性に対応する値または値範囲に該エントリのキーに含まれる該属性に対応する値が含まれるかを調べ、含まれる場合には該エントリの前記タプル識別子を検索結果タプル識別子集合に加えるノード検索ステップ、を有することを特徴とする情報蓄積検索プログラムである。
【発明の効果】
【００３７】
本発明によれば、多種多次元のタプルに対し、統一的に１つの木構造インデックスを構築し、そのペナルティとして、エントリ挿入前後での検索される確率に対応する値（すなわち検索される確率ないし検索される確率の近似値）の増加量を用いることとした。このペナルティであれば、次元毎に大小関係を判別する必要はなく、エントリが含むキーの次元数や種類が異なっても定義可能となる。これにより、多種多次元のタプル集合を蓄積・検索する際の、複数のインデックスを用いることによるオーバーヘッド、すなわち処理量や記憶容量、処理速度が大きくなることを抑え、また多種多次元のタプル集合に対して検索効率を向上させるクラスタリングを実現することが可能となる。
【００３８】
また、本発明によれば、前記ペナルティとして、エントリに含まれるキーに含まれる各属性に対する重みづけ付き正規化長の和の増加量を用いるようにした。ある属性が検索式に用いられた場合、その値としてどの値を取り得るかの可能性は該属性の定義域内で一様と仮定すると、該エントリにアクセスする必要がある確率は（該エントリのキーに含まれる該属性の値範囲／該属性の定義域）で表されるが、さらにインデックスに蓄積した全タプルにおける該属性の最大値から最小値までを該属性の定義域と近似したものが該正規化長であり、重みづけ付き正規化長は、さらに該属性が検索式に用いられる確率を正規化長に乗じたものである。従って、エントリに含まれるキーに含まれる各属性に対する重みづけ付き正規化長の和は、検索時に、検索条件に適合するタプルを探すために該エントリにアクセスしなければならない確率の近似値に相当する。該ペナルティを用いることにより、検索時にアクセスしなければならないエントリ数を総じて小さくするよう木構造を構築することが可能となる。すなわち、検索の処理量、処理速度を向上させることが可能となる。
【００３９】
また、本発明によれば、該エントリの算出において用いる、属性が検索式に用いられる確率として、属性出現回数をタプル総数で除した値を用いた。これにより、各属性の検索式に用いられる確率が不明な場合でも、蓄積するタプル集合から該確率の推定値を得ることが可能となる。
【図面の簡単な説明】
【００４０】
【図１】本発明の情報蓄積検索方法を実行するための情報蓄積検索システム全体図を示す図である。
【図２】図１のシステムで用いられるタプルの例を示す図である。
【図３】図１のシステムで用いられる検索式の例を示す図である。
【図４】図１のサーバ・コンピュータ装置２０１の構成例を示すブロック図である。
【図５】図１のシステムで用いられるインデックスのデータ構造の例を示す図である。
【図６】図１のシステムで用いられるタプル表の例を示す図である。
【図７】図１のシステムで用いられるリーフノードのエントリ表の例を示す図である。
【図８】図１のシステムで用いられるインナーノードのエントリ表の例を示す図である。
【図９】図１のシステムで用いられる属性表の例を示す図である。
【図１０】図１のクライアント・コンピュータ装置３０１の構成例を示すブロック図である。
【図１１】図１のシステムにおけるエントリ挿入手順（Ｉｎｓｅｒｔ）のフローチャートである。
【図１２】図１のシステムにおける部分木選択手順（ＣｈｏｏｓｅＳｕｂｔｒｅｅ）のフローチャートである。
【図１３】図１４とあわせて図１のシステムにおけるノード分割手順（Ｓｐｌｉｔ）を示すフローチャートである。
【図１４】図１３とあわせて図１のシステムにおけるノード分割手順（Ｓｐｌｉｔ）を示すフローチャートである。
【図１５】図１のシステムにおけるノード分割手順によるノード分割例１を示す図である。
【図１６】図１のシステムにおけるノード分割手順によるノード分割例２を示す図である。
【図１７】図１のシステムにおけるキー集合情報調整手順（ＡｄｊｕｓｔＫｅｙｓ）のフローチャートである。
【図１８】図１のシステムにおけるノード検索手順（Ｓｅａｒｃｈ）のフローチャートである。
【発明を実施するための形態】
【００４１】
以下、図面を参照して本発明の実施形態について説明する。図１は、本発明の一実施形態による情報蓄積検索システムを示す概略ブロック図である。情報蓄積検索システムは、ネットワーク１０１を介して接続された、情報、すなわちタプルの蓄積・検索を行うサーバ・コンピュータ装置２０１と、タプルないし検索式の作成とサーバ・コンピュータ装置２０１とのタプルないし検索式ないし検索結果の送受信を行うクライアント・コンピュータ装置３０１とからなる。ネットワーク１０１は、インターネットなどの公衆網、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、専用線などの私設網からなる。なお、図１では簡単のためクライアント・コンピュータ装置３０１を１台のみ記載したが、それに限らず複数台設けても良い。
【００４２】
なお、サーバ・コンピュータ装置２０１およびクライアント・コンピュータ装置３０１は、コンピュータ及びその周辺装置と、そのコンピュータによって実行されるプログラムとを用いて実現することができる。また、そのプログラムは、コンピュータ読み取り可能な記録媒体や通信回線を介して提供することが可能である。
【００４３】
本実施形態では、サーバ・コンピュータ装置２０１によって、タプルを蓄積し、検索式によりタプルを検索する。タプルは、１つ以上の属性と値のペア（ＡＶペア）から構成される。蓄積するタプルのＡＶペアの数やその属性の種類は様々である。図２にタプルの例を示す。図２（ａ）は、３次元データのタプルの例であり、この例では、「機種種別」、「使用者」および「使用開始年月日」の各属性に、「ＰＣ」、「○○太郎」および「２００５／０４／０１」の各値がそれぞれ対（あるいは組）をなすことでタプルが構成されている。図２（ｂ）は、７次元データのタプルの例であり、この例では、「機器種別」、「使用者」、「緯度」、「経度」、「センシング時刻」、「センサＩＤ」、および「センサ値」の各属性に、「温度センサ」、「○○太郎」、「１２６０３０」、「５０１０１８」、「２００８／１１／１１  １２：３４：５６」、「１２３４５６」および「２３．５」の各値がそれぞれ対をなすことでタプルが構成されている。ここで、図２（ｂ）のタプルでは、緯度、経度の単位は秒であり、北緯と東経が正、南緯と西経が負で表現されることとしている。
【００４４】
また、検索式は、１つ以上の属性と値ないし値の範囲のペアから構成される。図３に検索式の例を示す。検索式は、検索条件を満たすタプルを検索結果として得るための記述であり、図３に示す例では属性「機器種別」の値が「温度センサ」であり、属性「緯度」の値が値の範囲「１２６０００〜１２７０００」内にあり、属性「経度」の値が値の範囲「５０１０００〜５０１１００」内にあるタプルを検索結果とするものである。検索時には、検索式に含まれる全ての属性を含み、かつ該属性の値が検索式に含まれる該属性の値ないし値の範囲内にあるタプルを検索結果とする。例えば、図３の検索式による検索においては、図２の（ｂ）のタプルが検索式に適合し、検索結果に含まれることになる。
【００４５】
次に、サーバ・コンピュータ装置２０１の内部構成について説明する。
図４は、サーバ・コンピュータ装置２０１の構成を示すブロック図である。サーバ・コンピュータ装置２０１は、クライアント・コンピュータ装置３０１からのタプル蓄積要求／タプル検索要求の受信または検索結果の送信を行う通信部２０２と、クライアント・コンピュータ装置３０１からの要求に応じて、インデックス構築を含む蓄積処理やインデックスを用いた検索処理を行う演算部２０３と、インデックスと属性表とタプル総数とタプル表とを保持する記憶部２０４とを備える。すなわち、記憶部２０４には、後述のインデックス、タプル表、属性表が格納される。
【００４６】
また、本実施形態では、記憶部２０４内における、検索式で示された検索条件を満たすタプルの格納位置を決定する際に、インデックスを用いたファイルアクセス法が採用されている。インデックスのデータ構造としては、背景技術で述べたような種々の検索木を用いることができる。本実施形態で用いられるインデックスのデータ構造の一例を図５に示す。インデックスのデータ構造は複数のノードと、階層的にそれらをつなぐ枝で表される木構造である。最も上位のノードをルートノードと呼び、最も下位のノードをリーフノードと呼ぶ。またリーフノード以外のノードをインナーノードと呼ぶ。図５に示す例では、４個のインナーノード４０２と、７個のリーフノード４０３とから検索木が構成されている。インナーノード４０２の最上位のノードがルートノード４０１である。各インナーノード４０２には枝で繋がれた他のノードへのポインタと、後述するエントリ表５０２とが保持されている。各リーフノード４０３には枝で繋がれた他のインナーノード４０２へのポインタと、後述するエントリ表５０３とが保持されている。
【００４７】
次に、記憶部２０４に格納されているタプル表の例を図６に示す。タプル表には、タプルＩＤとそのタプルの情報が格納される。図６に示すタプル表５０１には、２つのタプルＩＤ「００００００００１」および「００００００００２」と、各タプルＩＤにそれぞれ対応する２つのタプル「ｄｅｖｉｃｅ＿ｔｙｐｅ＝“ＰＣ”，ｕｓｅｒ＝“ｍｉｋｅ”，ｄａｔｅ＿ｏｆ＿ｆｉｒｓｔ＿ｕｓｅ＝“２００５／０４／０１”」および「ｄｅｖｉｃｅ＿ｔｙｐｅ＝“ｔｅｍｐｅｒａｔｕｒｅ  ｓｅｎｓｏｒ”，ｕｓｅｒ＝“ｍｉｋｅ”，ｌａｔ＝“１２６０３０”，ｌｏｎｇ＝“５０１０１８”，ｔｉｍｅ＝“２００８／１１／１１  １２：３４：５６”，ｓｅｎｓｏｒ＿ｉｄ＝“１２３４５６”，ｔｅｍｐｅｒａｔｕｒｅ＿ｖａｌｕｅ＝“２３．５”」の情報とが格納されている。
【００４８】
図７は、リーフノード４０３のエントリ表５０３の一例である。各リーフノード４０３は、１つ上位の階層のノード（親ノード）へのポインタと、図７に示すリーフノードのエントリ表５０３とを保持する。ノードへのポインタは当該ノードの蓄積アドレスを意味し、各ノード間を繋げる枝に相当する。図７に示すように、リーフノード４０３のエントリはタプルＩＤとタプルのキー（検索キーとも呼ばれる）の組から構成され、該キーは、１以上の長さを有する属性−値の組の並びから成る。すなわち、１個のエントリは、エントリ表５０３の縦の１列（１カラム）に該当する。リーフノードのエントリ表５０３は、Ｔ１以上Ｔ２以下の個数のリーフノード４０３のエントリを保持する。Ｔ１、Ｔ２は、予め定められた定数であり、どちらも正の整数、またＴ１＜Ｔ２である。
【００４９】
図７に示す例では、エントリ表５０３に、タプルＩＤ「０００００８１２９」とそのタプルＩＤに対応するタプルのキーの組とからなるエントリと、タプルＩＤ「０００００００４５」とそのタプルＩＤに対応するタプルのキーの組とからなるエントリと、タプルＩＤ「００００００８０２」とそのタプルＩＤに対応するタプルのキーの組とからなるエントリと、タプルＩＤ「０００００３５８１」とそのタプルＩＤに対応するタプルのキーの組とからなるエントリとの、４個のエントリが含まれている。この場合、例えば、タプルＩＤ「０００００８１２９」に対応するタプルのキーの組は、「ＰＣ」（属性「ｄｅｖｉｃｅ＿ｔｙｐｅ」に対する値）、「ｍｉｋｅ」（属性「ｕｓｅｒ」に対する値）、「２００７／１１／２３」（属性「ｄａｔｅ＿ｏｆ＿ｆｉｒｓｔ＿ｕｓｅ」に対する値）、「１０３４５６」（属性「ｌａｔ」に対する値）および「２１８２３４」（属性「ｌｏｎｇ」に対する値）である。また、例えば、タプルＩＤ「０００００００４５」に対応するタプルのキーの組は、「ｔｅｍｐｅｒａｔｕｒｅ  ｓｅｎｓｏｒ」（属性「ｄｅｖｉｃｅ＿ｔｙｐｅ」に対する値）、「ｍｉｋｅ」（属性「ｕｓｅｒ」に対する値）、「１３２２１０」（属性「ｌａｔ」に対する値）、「５０１２２２」（属性「ｌｏｎｇ」に対する値）、「２００２／０１／０１  １２：３４：５６」（属性「ｔｉｍｅ」に対する値）、「１１９８３」（属性「ｓｅｎｓｏｒ＿ｉｄ」に対する値）および「１５．４」（属性「ｓｅｎｓｏｒ＿ｖａｌｕｅ」に対する値）である。また、記号「ＮＵＬＬ」（空値）はエントリの終わりを示している。また、記号「−」は属性に対するキーが空値であることを示している。
【００５０】
また、図８は、インナーノード４０２のエントリ表５０２の一例である。インナーノードは、親ノードへのポインタと、図８に示すインナーノードのエントリ表５０２を保持する。インナーノード４０２のエントリは子ノードへのポインタと子ノードのキーの組から構成され、該キーは、１以上の長さを有する属性−値範囲の組の並びから成り、該並びは該子ノードが下位に含むタプル集合における各属性についての最小値から最大値までを表す。エントリ表５０２において、１個のエントリは、エントリ表５０２の縦の１列（１カラム）に該当する。例えば、図８において、「子ノード１のアドレス」と「子ノード２のアドレス」の「ｄｅｖｉｃｅ＿ｔｙｐｅ」は、それぞれ「“ａ”〜“ｋ”」、「“ｈ”〜“ｑ”」となっている。これは、「ｄｅｖｉｃｅ＿ｔｙｐｅ」の頭文字が“ａ”〜“ｋ”で始まるタプルは子ノード１に格納されている可能性があることを、“ｈ”〜“ｑ”  で始まるタプルは子ノード２に格納されている可能性があることを示している。すなわち、「ｄｅｖｉｃｅ＿ｔｙｐｅ」の頭文字が“ｈ”〜“ｋ”で始まるタプルについては、子ノード１または子ノード２のいずれかに格納されていることとなる。インナーノードのエントリ表は、Ｔ１以上Ｔ２以下の個数のインナーノードのエントリを保持する。また、この場合、エントリ表５０２には、子ノードへのポインタ「子ノード１のアドレス」とその子ノードのキーの組とからなるエントリと、子ノードへのポインタ「子ノード２のアドレス」とその子ノードのキーの組とからなるエントリと、子ノードへのポインタ「子ノード３のアドレス」とその子ノードのキーの組とからなるエントリと、子ノードへのポインタ「子ノード４のアドレス」とその子ノードのキーの組とからなるエントリとの、４個のエントリが含まれている。図８において、「Ｍ１〜Ｍ２」の形式の表記は、「Ｍ１」が最小値、「Ｍ２」が最大値を示している。
【００５１】
図５に示すように、データ構造の木構造が複数の階層構造を持つ場合において、ルートノード４０１はインナーノードであるが、一方で、インデックス全体が一つのノードのみからなる場合には、ルートノード４０１は最下位のノードでもあるためリーフノードとなる。ルートノード４０１がリーフノードの場合には、エントリ表に０以上Ｔ２以下の個数のリーフノードのエントリを保持する。またルートノード４０１がインナーノードの場合には、２以上Ｔ２以下の個数のインナーノードのエントリを保持する。いずれの場合においても、ルートノード４０１は親ノードをもたないため、親ノードへのポインタを保持しない。
【００５２】
次に、記憶部２０４に格納されている属性表の一例を図９に示す。属性表には、それまでに蓄積したタプル集合に含まれる全属性について、含まれていた回数（出現頻度）と最小値と最大値とが保持される。図９に示す属性表５０４には、タプルの各属性「ｄｅｖｉｃｅ＿ｔｙｐｅ」、「ｕｓｅｒ」、「ｄａｔｅ＿ｏｆ＿ｆｉｒｓｔ＿ｕｓｅ」、「ｌａｔ」、「ｌｏｎｇ」、「ｔｉｍｅ」、「ｓｅｎｓｏｒ＿ｉｄ」および「ｓｅｎｓｏｒ＿ｖａｌｕｅ」の出現頻度ならびに各属性の値の最小値および最大値が保持されている。なお、タプルの値の最小値および最大値は、例えば、タプルの値を、属性毎にあらかじめ設定された所定の変換処理によって、所定の数値に変換することで求めること等ができる。変換処理としては、例えば、タプルの値が文字列の場合は文字列を文字コードに変換した後に四則演算等の所定の演算処理を行って数値を得るようにしたり、時、分、秒で表される値を秒の単位で表するようにして数値を得るようにしたりする処理を用いることができる。
【００５３】
次に、クライアント・コンピュータ装置３０１の内部構成について説明する。
図１０は、クライアント・コンピュータ装置３０１の構成を示すブロック図である。クライアント・コンピュータ装置３０１は、サーバ・コンピュータ装置２０１へのタプル蓄積要求／タプル検索要求の送信または検索結果の受信を行う通信部３０２と、サーバ・コンピュータ装置２０１へ送信するタプル蓄積要求に含まれるタプルやタプル検索要求に含まれる検索式の作成、サーバ・コンピュータ装置２０１から受信した検索結果であるタプル集合を表示するタプル／検索式作成表示部３０３とを備える。タプル／検索式の作成には、入力デバイスを用いてユーザが入力する方法や、センサデバイスから得られたセンサデータから作成する方法がある。
【００５４】
本実施形態において、タプルを蓄積する際には、クライアント・コンピュータ装置３０１から受信したタプル蓄積要求に対し、サーバ・コンピュータ装置２０１の演算部２０３が、まず記憶部２０４が保持するタプル表５０１を参照し、未使用の新しいタプルＩＤを決定し、該タプルＩＤとタプル蓄積要求に含まれるタプルをタプル表５０１に追加する。また属性表５０４を更新するとともにタプル総数（すなわち蓄積しているタプルの全個数）を１増やす。さらに、記憶部２０４が保持するインデックスに該タプルに対応するエントリを挿入する。このときのエントリ挿入手順フローを図１１に示す。図１１に示す処理における引数のエントリＸ、レベル数Ｌとしては、それぞれ該エントリ、０とする。ここでレベル数は、リーフノードの階層の  レベル数を０とし、１つ上位の階層に上がるごとに、レベル数は１増えるものとする。このエントリＸは、例えば図７のエントリ表５０３に示される４個のエントリのいずれかに対応するようなデータである。
【００５５】
図１１に示すように、まず、“該エントリ、０（０はリーフノードのレベル数に該当する）”を引数Ｘ、Ｌとして、部分木選択手順を実施する（ステップＳ１１−１）。部分木選択手順（ステップＳ１１−１）では、エントリＸを挿入すべきレベル数Ｌのノードが選択ノードとして選択される（すなわちステップＳ１１−１のサブルーチンから戻る際に、挿入すべきノードを示すアドレスが返り値として返される）。この該部分木選択手順については後述する。
【００５６】
次に、ステップＳ１１−１で選択されたノードのエントリ表に記載されたエントリ数が当該エントリ表のエントリの個数の最大値Ｔ２未満かどうかを判断する（ステップＳ１１−２）。Ｔ２未満である場合には、該ノードのエントリ表に該エントリを追加する（ステップＳ１１−３）。ステップＳ１１−２においてＴ２未満でなかった場合には、該ノードと該エントリを入力とするノード分割手順を実施する（ステップＳ１１−４）。このノード分割手順については後述する。次に、該ノードを入力とするキー集合情報調整手順を実施し（ステップＳ１１−５）、処理を終える。このキー集合情報調整手順については後述する。
【００５７】
図１１のステップＳ１１−１で呼び出される該部分木選択手順フローを図１２に示す。部分木選択手順では、まず、変数ｃｕｒｒｅｎｔ（カレント）にルートノードのアドレスを代入し、変数ｌｖにルートノードのレベル数を代入する（ステップＳ１２−１）。変数ｃｕｒｒｅｎｔは、操作対象のノードのアドレスが代入される変数である。この場合、ステップＳ１２−１でルートノードのアドレスが最初に代入される。その後、順次、操作対象のノードのレベル数ｌｖが変化する度に、ステップＳ１２−７においてその子ノードのアドレスが代入されることで、更新されることになる。
【００５８】
次に、ｌｖと入力されたレベル数Ｌの大きさを比較し（ステップＳ１２−２）、等しいまたはＬの方が大きければ、ｃｕｒｒｅｎｔノードを選択することとし、ｃｕｒｒｅｎｔを返り値とし（ステップＳ１２−３）、処理を終了する。この例では、Ｌ＝０なので（すなわちＬにはリーフノードのレベル数が代入されているので）、ｃｕｒｒｅｎｔノードのレベル数ｌｖが０に到達したことろで、すなわち変数ｃｕｒｒｅｎｔでアドレスが指定されるノードがリーフノードとなったところで処理が終了する。
【００５９】
ステップＳ１２−２において、ｌｖの方が大きい場合は、変数ｃｈｉｌｄ＿ｎｕｍ、ｍｉｎ＿ｃｈｉｌｄに１を代入し（ステップＳ１２−４）、ｃｕｒｒｅｎｔノードのｃｈｉｌｄ＿ｎｕｍ番目のエントリと入力されたエントリＸを引数とする関数Ｐによりペナルティ値を計算し、変数ｍｉｎ＿ｐｅｎａｌｔｙに代入する（ステップＳ１２−５）。
【００６０】
関数Ｐは以下のように定義される。ただし、Ａ、Ｂはエントリを示す。
【００６１】
Ｐ（Ａ，Ｂ）＝Ｑ（Ａ＋Ｂ）−Ｑ（Ａ）  ・・・・・（１）
【００６２】
関数Ｐは、「該操作対象ノードがすでに含む既存エントリに対し、該エントリＸを挿入した場合のペナルティ」を表す関数であり、該操作対象ノードがすでに含む既存エントリＡに対し、エントリＢを挿入する際、該エントリＢを挿入する前の該エントリＡと、挿入した後の該エントリＡとを比べた場合の、該エントリＡが検索される確率に対応した値（すなわち検索される確率ないし検索される確率の近似値）の増分を示す値として定義される。ここで、関数Ｑ（Ｃ）は、エントリＣに含まれるキーに含まれる各属性に対する重みづけ付き正規化長の和であり、エントリＣが検索される確率（ないし確率の近似値）を示す。またＡ＋Ｂは、エントリＡのキーとエントリＢのキーの和をとった新たなキーを持つエントリを示す。ここで２つのキーの和をとったキーとは、該２つのキーに含まれる属性を全て含み、各属性の値として、該属性が該２つのキーのどちらか一方に含まれる場合には、該一方のキーに含まれる該属性の値もしくは値範囲と同じ値もしくは値範囲をもち、該属性が該２つのキーの両方に含まれる場合には、該両方のキーに含まれる該属性の２つの値もしくは値範囲のどちらをも含む最小限の値もしくは値範囲をもつキーを意味する。例えばキー（ａ＝３、ｂ＝２〜４）とキー（ａ＝４〜５、ｂ＝３〜５、ｃ＝１）の和をとったキーとは、（ａ＝３〜５、ｂ＝２〜５、ｃ＝１）となる。
【００６３】
ただし、本発明はこれに限るものではなく、例えば、２つのキーの和をとったキーに含まれる属性の値は、該２つのキーの該属性の値もしくは値範囲のどちらをも含む値もしくは値範囲とし、必ずしも最小限の値もしくは値範囲としないことも可能である。
【００６４】
また関数Ｑ（Ｃ）は以下のように定義される。
【００６５】
Ｑ（Ｃ）＝ΣＣｉ（（Ｌ´Ｃｉ／ＬＣｉ）・Ｒ（Ｃｉ））  ・・・・・（２）
【００６６】
ＣｉはエントリＣが持つキーに含まれる属性を示す。ΣＣｉ（Ｄ）は、すべてのＣｉについてのＤの総和を意味する。Ｌ´Ｃｉは、該キーに記述されたＣｉの最大値から最小値を引いた値であり、ＬＣｉは、インデックス内の全リーフノードが保持する全タプル集合Ｙにおける属性Ｃｉの最大値から最小値を引いた値である。ＬＣｉは属性表から得ることができる。（Ｌ´Ｃｉ／ＬＣｉ）が前記正規化長である。Ｒ（Ｃｉ）は、属性Ｃｉが検索式に用いられる確率であり、以下のように定義される。
【００６７】
Ｒ（Ｃｉ）＝（全タプル集合ＹにおけるＣｉの出現回数）／（全タプル集合Ｙの要素数）・・・・・（３）
【００６８】
全タプル集合ＹにおけるＣｉの出現回数は、属性表から得ることができる。全タプル集合Ｙの要素数とは、タプルの総数である。
【００６９】
ステップＳ１２−５では、変数ｍｉｎ＿ｐｅｎａｌｔｙにＰ（（ｃｈｉｌｄ＿ｎｕｍ番目のエントリ），Ｘ）の値が代入される。すなわち、変数ｃｕｒｒｅｎｔでアドレスが指定されるノードのｃｈｉｌｄ＿ｎｕｍ番目のエントリに対し、エントリＸを挿入する際、エントリＸを挿入する前のｃｈｉｌｄ＿ｎｕｍ番目のエントリと、挿入した後のｃｈｉｌｄ＿ｎｕｍ番目のエントリとを比べた場合の、ｃｈｉｌｄ＿ｎｕｍ番目のエントリが検索される確率に対応した値の増分を示す値が、変数ｍｉｎ＿ｐｅｎａｌｔｙに代入されることになる。ただし、ステップＳ１２−４で変数ｃｈｉｌｄ＿ｎｕｍに１が代入されているので、ステップＳ１２−５で関数Ｐを求める際には、変数ｃｕｒｒｅｎｔでアドレスが指定されるノードの１番目のエントリに対し、エントリＸを挿入する際、エントリＸを挿入する前の１番目のエントリと、挿入した後の１番目のエントリとを比べた場合の、１番目のエントリが検索される確率に対応した値の増分を示す値が、変数ｍｉｎ＿ｐｅｎａｌｔｙに代入されることになる。
【００７０】
次に、ｃｕｒｒｅｎｔに対応するノード（ｃｕｒｒｅｎｔノード）のｃｈｉｌｄ＿ｎｕｍ番目のエントリが存在するかを判定し（ステップＳ１２−６）、存在しない場合には、ｃｕｒｒｅｎｔノードのｍｉｎ＿ｃｈｉｌｄ番目の子ノードのアドレスをｃｕｒｒｅｎｔに代入し、ｌｖの大きさを１減らし（ステップＳ１２−７）、ステップＳ１２−２に戻る。
【００７１】
ステップＳ１２−６において、存在する場合には、ｃｕｒｒｅｎｔノードのｃｈｉｌｄ＿ｎｕｍ番目のエントリと入力されたエントリＸを引数とする該関数Ｐによりペナルティ値を計算し、該ペナルティ値がｍｉｎ＿ｐｅｎａｌｔｙよりも小さいか否かを判定する（ステップＳ１２−８）。このステップＳ１２−８では、変数ｃｕｒｒｅｎｔでアドレスが指定されるノード（すなわち操作対象のノード）の、２番目以降のエントリに対し、当該ノードのエントリが存在している間、エントリＸを挿入する際に、エントリＸを挿入する前の当該エントリと、挿入した後の当該エントリとを比べた場合の、当該エントリが検索される確率に対応した値の増分を示す値が、変数ｍｉｎ＿ｐｅｎａｌｔｙに代入されている値と比較されることになる。
【００７２】
ステップＳ１２−８において、小さくないと判定された場合には、ｃｈｉｌｄ＿ｎｕｍの値を１増やし（ステップＳ１２−９）、ステップＳ１２−６に戻る。
【００７３】
ステップＳ１２−８において、小さいと判定された場合には、ｃｈｉｌｄ＿ｎｕｍの値をｍｉｎ＿ｃｈｉｌｄに代入し、ｃｕｒｒｅｎｔノードのｃｈｉｌｄ＿ｎｕｍ番目のエントリと入力されたエントリＸを引数として関数Ｐにより計算したペナルティ値をｍｉｎ＿ｐｅｎａｌｔｙに代入し（ステップＳ１２−１０）、ステップＳ１２−９へ進む。このステップＳ１２−１０を繰り返し行うことで、変数ｍｉｎ＿ｐｅｎａｌｔｙが最も小さい関数Ｐの計算結果で更新されるとともに、変数ｍｉｎ＿ｃｈｉｌｄにその最も小さい関数Ｐの計算結果が得られたエントリの番号が代入されることになる。
【００７４】
上記のステップＳ１２−６、Ｓ１２−８、Ｓ１２−１０、Ｓ１２−９を繰り返し行うことで、ｃｕｒｒｅｎｔノードのすべてのエントリについて、エントリＸを挿入した場合の関数Ｐの値が求められ、すべてのエントリについて計算が終了した時点で、変数ｍｉｎ＿ｃｈｉｌｄにその最も小さい関数Ｐの計算結果が得られたエントリの番号が代入されることになる。例えば、図８のエントリ表５０２を有するノードがｃｕｒｒｅｎｔノードであったとすると、子ノード１〜４のアドレスを子ノードへのポインタとする４個のエントリのうち、エントリＸを挿入した場合に関数Ｐの値が最も小さくなるエントリの番号が変数ｍｉｎ＿ｃｈｉｌｄに代入されることになる。そして、すべてのエントリについて関数Ｐの計算および比較が終了すると、ステップＳ１２−７でｃｕｒｒｅｎｔノードのｍｉｎ＿ｃｈｉｌｄ番目の子ノードのアドレスが変数ｃｕｒｒｅｎｔに代入され、ｌｖの大きさが１減らされ、ステップＳ１２−２へ戻るので、関数Ｐの値が最も小さくなるエントリで指定された子ノードに対して、同様に、全てのエントリに対する関数Ｐの計算と最も小さい値のエントリを求める処理が行われることになる。
【００７５】
そして、ｃｕｒｒｅｎｔノードのレベル数ｌｖが、レベル数Ｌ（＝０）に達したところで、ｃｕｒｒｅｎｔを返り値として処理が終了することになる（ステップＳ１２−３）。
【００７６】
次に、図１１のステップＳ１１−４で呼び出されるノード分割手順フローを図１３及び図１４に示す。このノード分割手順は、分割対象のノード（ノードＮおよびそのアドレスをＮとする。）とエントリＸとを引数として呼び出される処理である。
【００７７】
まず、入力されたノードアドレスＮに対応するノード（ノードＮ）のエントリ表に、入力されたエントリＸを追加する（ステップＳ１３−１）。この場合、分割対象ノードはリーフノードなので、リーフノードのエントリ表にエントリＸが追加されることになる。
【００７８】
次に、変数ｉ、ｉ＿ｍａｘ、ｊ、ｊ＿ｍａｘ、ｄ＿ｍａｘにそれぞれ１、１、２、２、０を代入する（ステップＳ１３−２）。ここで、変数ｉおよびｊは、分割対象ノードにおける処理対象エントリの番号を一時的に記憶するための変数である。変数ｉ＿ｍａｘおよびｊ＿ｍａｘは関数Ｐ等を用いた演算結果が最大となるエントリの番号を一時的に記憶するための変数である。変数ｄ＿ｍａｘは関数Ｐ等を用いた演算結果の最大値を一時的に記憶するための変数である。このステップＳ１３−２では、それらの変数が初期化されている。
【００７９】
次に、ノードＮのｊ番目のエントリが存在するかどうかを判定し（ステップＳ１３−３）、存在する場合には、ｉとｊが等しいかを判定し（ステップＳ１３−４）、等しい場合には、ｉを１とし（ステップＳ１３−５）、ｊを１増加させ（ステップＳ１３−６）、ステップＳ１３−３に戻る。
【００８０】
ステップＳ１３−４において、等しくない場合には、下記ｄを計算する（ステップＳ１３−７）。
【００８１】
ｄ＝Ｐ（ｉ番目のエントリ，ｊ番目のエントリ）−Ｑ（ｊ番目のエントリ）  ・・・・・（４）
【００８２】
ｄがｄ＿ｍａｘより大きいかどうかを判定し（ステップＳ１３−８）、大きい場合には、ｉ＿ｍａｘ、ｊ＿ｍａｘ、ｄ＿ｍａｘにそれぞれｉ、ｊ、ｄを代入し（ステップＳ１３−９）、ｉを１増加させる（ステップＳ１３−１０）。
【００８３】
ステップＳ１３−８において、大きくない場合には、ステップＳ１３−９をとばしてステップＳ１３−１０へ進む。ステップＳ１３−１０の後、ステップＳ１３−４に戻る。
【００８４】
ステップＳ１３−３において、存在しない場合には、ノードＮのｉ＿ｍａｘ番目のエントリをエントリのグループＧ１に入れ、ｊ＿ｍａｘ番目のエントリをグループＧ２に入れ、さらに両者ともノードＮのエントリ表から削除する（ステップＳ１３−１１）。ここで、Ｇ１とＧ２が含むエントリ集合は、初期状態として空集合であり、ステップＳ１３−１１が終わった時点でそれぞれ１つずつエントリを含むこととなる。
【００８５】
このステップＳ１３−３〜Ｓ１３−１０の処理は、分割対象のノードＮの全エントリ（すなわちノードＮの既存のエントリにエントリＸを追加したエントリの集合）から、式（４）の値を最大とする２つのエントリを選択する処理である。式（４）は、ノードＮのｉ番目のエントリを既存エントリ、ｊ番目のエントリを挿入エントリとした場合のペナルティから、ｊ番目のエントリが検索される確率（ないしその近似値）を減じた値を求めるものである。この場合、関数Ｐは式（１）で表されるから、式（１）のエントリＡをｉ番目のエントリ、エントリＢをｊ番目のエントリとすると、式（４）は、ｄ＝Ｑ（ｉ番目のエントリ＋ｊ番目のエントリ）−Ｑ（ｉ番目のエントリ）−Ｑ（ｊ番目のエントリ）と表されることになる。
【００８６】
ステップＳ１３−３〜Ｓ１３−１０の処理が終了した時点で、変数ｉ＿ｍａｘおよび変数ｊ＿ｍａｘには、式（４）の値を最大とする、分割対象のノードＮの全エントリ中の２つのエントリの番号が代入されることになる。
【００８７】
そして、ステップＳ１３−１１では、空集合のグループＧ１にノードＮのｉ＿ｍａｘ番目のエントリが１つ代入され、空集合のグループＧ２にノードＮのｊ＿ｍａｘ番目のエントリが１つ代入されることになる。また、ノードＮのエントリ表からは、ｉ＿ｍａｘ番目のエントリとｊ＿ｍａｘ番目のエントリが削除されることになる。
【００８８】
次に、Ｔ１からＧ１内のエントリ数を引いた値が、ノードＮのエントリ表内に残っているエントリ数に比べて等しいまたは大きいか否かを判定し（ステップＳ１３−１２）、等しいか大きい場合には、ノードＮのエントリ表内に残っているエントリを全てグループＧ１に入れ、エントリ表内からは削除する（ステップＳ１３−１３）。
【００８９】
ステップＳ１３−１２において、否と判定された場合には、ステップＳ１３−１３を実施しない。
【００９０】
さらにＴ１からＧ２内のエントリ数を引いた値が、ノードＮのエントリ表内に残っているエントリ数に比べて等しいまたは大きいか否かを判定し（ステップＳ１３−１４）、等しいか大きい場合には、ノードＮのエントリ表内に残っているエントリを全てグループＧ２に入れ、エントリ表内からは削除する（ステップＳ１３−１５）。
【００９１】
ステップＳ１３−１４において、否と判定された場合には、ステップＳ１３−１５を実施しない。
【００９２】
このステップＳ１３−１２〜Ｓ１３−１５の処理では、ノードＮのエントリ表から、グループＧ１およびグループＧ２に代入される（振り分けられる）エントリ集合の個数が、各ノードにおけるエントリの最小値Ｔ１を下回らないようにするための処理である。後述するステップＳ１３−２４またはＳ１３−２５では、ノードＮのエントリ表に含まれるエントリは順次、グループＧ１またはグループＧ２に振り分けられるとともに、ノードＮのエントリ表からは削除されることになる。その際、例えば一方のグループに振り分けが偏ってしまうような場合があったとしても、ステップＳ１３−１２〜Ｓ１３−１５の処理によって各グループＧ１、Ｇ２には少なくともＴ１個のエントリが代入されるようになっている。
【００９３】
ｉ、ｉ＿ｍａｘ、ｄ＿ｍａｘにそれぞれ１、１、０を代入し（ステップＳ１３−１６）、ノードＮのエントリ表内のｉ番目のエントリＥｉが存在するか否かを判定する（ステップＳ１３−１７）。ここで、変数ｉは、分割対象ノードにおける処理対象エントリの番号を一時的に記憶するための変数である。変数ｉ＿ｍａｘは関数Ｐ等を用いたステップＳ１３−１８での演算結果が最大となるエントリの番号を一時的に記憶するための変数である。変数ｄ＿ｍａｘはステップＳ１３−１８での関数Ｐ等を用いた演算結果の最大値を一時的に記憶するための変数である。このステップＳ１３−１６では、それらの変数が初期化されている。
【００９４】
存在する場合には、下記ｄを計算する（ステップＳ１３−１８）。ただし（Ｇ１）、（Ｇ２）は、グループＧ１、Ｇ２に含まれる全エントリのキーの和をとった新たなキーを持つエントリを示す。
【００９５】
ｄ＝｜Ｐ（（Ｇ１）、Ｅｉ）−Ｐ（（Ｇ２）、Ｅｉ）｜  ・・・・・（５）
【００９６】
式（５）は、式（１）のペナルティ関数Ｐの計算において、グループＧ１に含まれる全エントリのキーの和をとった新たなキーを持つエントリを既存エントリＡとし、エントリＥｉを挿入するエントリＢとして求めた関数Ｐの値と、グループＧ２に含まれる全エントリのキーの和をとった新たなキーを持つエントリを既存エントリＡとし、エントリＥｉを挿入するエントリＢとして求めた関数Ｐの値との差の絶対値を変数ｄに代入する演算である。すなわち、ノードＮのエントリ表にまだ残されているエントリのうちのｉ番目のエントリについて、グループＧ１に挿入する場合のペナルティとグループＧ２に挿入する場合のペナルティとの差の大きさが変数ｄに代入されることになる。
【００９７】
次に、ｄがｄ＿ｍａｘより大きいかどうかを判定し（ステップＳ１３−１９）、大きい場合には、ｉ＿ｍａｘ、ｄ＿ｍａｘにそれぞれｉ、ｄを代入し（ステップＳ１３−２０）、ｉを１増加させる（ステップＳ１３−２１）。
【００９８】
ステップＳ１３−１９において、大きくない場合には、ステップＳ１３−２０をとばしてステップＳ１３−２１へ進む。ステップＳ１３−２１の後、ステップＳ１３−１７に戻る。
【００９９】
このステップＳ１３−１７〜Ｓ１３−２１の処理を繰り返し行うことで、ノードＮのエントリ表に残っているエントリのうちで、グループＧ１に振り分けた場合とグループＧ２に振り分けた場合でペナルティＰの値の差が最も大きくなるエントリの番号が、変数ｉ＿ｍａｘに記憶されることになる。
【０１００】
ステップＳ１３−１７において、存在しない場合には、ノードＮのエントリ表内のｉ＿ｍａｘ番目のエントリＥｉ＿ｍａｘが存在するかどうかを判定し（ステップＳ１３−２２）、存在する場合には、さらに下記式が成り立つか否かを判定する（ステップＳ１３−２３）。
【０１０１】
Ｐ（（Ｇ１），Ｅｉ＿ｍａｘ）＜  Ｐ（（Ｇ２），Ｅｉ＿ｍａｘ）  ・・・・・（６）
【０１０２】
成り立つ場合には、Ｅｉ＿ｍａｘをＧ１に入れ、エントリ表からは削除し（ステップＳ１３−２５）、ステップＳ１３−１２に戻る。
【０１０３】
成り立たない場合には、Ｅｉ＿ｍａｘをＧ２に入れ、エントリ表からは削除し（ステップＳ１３−２４）、ステップＳ１３−１２に戻る。
【０１０４】
式（６）は、ステップＳ１３−１７〜Ｓ１３−２１の処理で求められたｉ＿ｍａｘ番目のエントリＥｉ＿ｍａｘについて、グループＧ１に挿入した場合のペナルティＰとグループＧ２に挿入した場合のペナルティＰとを比較する条件式である。この比較結果に基づいて、ステップＳ１３−２４またはＳ１３−２５で、ペナルティが小さくなる方のグループへエントリＥｉ＿ｍａｘが挿入されることになる。
【０１０５】
ステップＳ１３−２２において、存在しない場合には、ノードＮのエントリ表にＧ１のエントリ集合を入れ、新しいノードＮ´を生成し、そのエントリ表にＧ２のエントリ集合を入れる（ステップＳ１３−２６）。ノードＮのすべてのエントリをグループＧ１またはグループＧ２に振り分けた後は、ノードＮのエントリ表にはエントリが存在しないことになる。この場合、ステップＳ１３−１７およびＳ１３−２２はいずれも判定結果が「ＮＯ」となるので、ステップＳ１３−２６へ進み、ノードＮのエントリ表にグループＧ１に振り分けられたすべてのエントリが入れられ、新たに生成されたノードＮ´のエントリ表にグループＧ２に振り分けられたすべてのエントリが入れられることになる。
【０１０６】
次に、ノードＮがルートノードか否かを判定し（図１４のステップＳ１３−２７）、ルートノードでない場合には、ノードＮの親ノードが保持するエントリ表内のエントリ数がＴ２未満かどうかを判定する（ステップＳ１３−２８）。
【０１０７】
Ｔ２未満である場合には、ノードＮの親ノードのエントリ表に、新しいノードＮ´に対応するエントリ、すなわちキーとしてノードＮ´のエントリ表内の全エントリのキーの和をとったキーをもち、またノードＮ´へのポインタをもつエントリを追加する（ステップＳ１３−２９）。
【０１０８】
ステップＳ１３−２７において、ノードＮがルートノードである場合には、新しいノードＮ´´を生成し、ノードＮの親ノードとする。すなわち、ノードＮに親ノードとしてノードＮ´´へのポインタを保持させる。さらに、ノードＮに対応するエントリをノードＮ´´のエントリ表に追加し（ステップＳ１３−３０）、ステップＳ１３−２９へ進む。
【０１０９】
ステップＳ１３−２９の後、ノードＮの親ノードを入力とするキー集合情報調整手順を実施し（ステップＳ１３−３２）、処理を終える。
【０１１０】
ステップＳ１３−２８において、Ｔ２未満でない場合には、ノードＮの親ノードと、Ｎ´に対応するエントリを入力とするノード分割手順を実施し（すなわち図１３および図１４に示すノード分割手順を再帰呼び出しし）（ステップＳ１３−３１）、ステップＳ１３−３２に進む。
【０１１１】
該ノード分割手順によりノードが分割される様子の例を図１５に示す。
この例では、Ｔ１＝２、Ｔ２＝４とする。図１５左に示すように、今、３つのノードＮ１〜Ｎ３からなる検索木において、各ノードのエントリ表にエントリＥ１〜Ｅ１０が保持されている状態を考える。
【０１１２】
エントリＥ１０は最後に該検索木に挿入され、これにより、ノードＮ３のエントリ表に保持しているエントリ数がＴ２を超える５となった場合、エントリ数を減らすために、ノード分割手順が実施される（図１１のステップＳ１１−２、ステップＳ１１−４）。
【０１１３】
この結果、図１５右に示すように、ノードＮ３がＮ３と新たなノードＮ４に分割され、Ｎ３が保持していたエントリの一部は、Ｎ４へ移る（図１３のステップＳ１３−１〜ステップＳ１３−２６）。これに伴い、新たなノードＮ４に対応するエントリＥ１１がＮ３の親ノードであるＮ１のエントリ表に追加される（図１４のステップＳ１３−２９）。
【０１１４】
該ノード分割手順によりノードが分割される様子のもう１つの例を図１６に示す。
図１５に示した例のように、ノード分割手順においては、分割対象のノードの親ノードのエントリ表に新しいエントリが追加される。これにより、親ノードが保持するエントリ数がＴ２以上となる場合、さらに該親ノードがノード分割対象となる（図１４のステップＳ１３−２８、ステップＳ１３−３１）。
【０１１５】
図１６は、該親ノードがルートノードだった場合の例である。
図１６に示すように、ルートノードＮ１が分割される場合には、Ｎ１と新たなノードＮ７に分割されるだけでなく、新たなノードＮ８がルートノードとして生成され、Ｎ１、Ｎ７に対応するエントリをエントリ表に保持する（図１４のステップＳ１３−２７、ステップＳ１３−３０、ステップＳ１３−２９）。このとき、検索木の階層が１つ増え、ルートノードのレベル数は１増えることとなる。
【０１１６】
次に、図１１のステップＳ１１−５または図１４のステップＳ１３−３２で呼び出されるキー集合情報調整手順フローを図１７に示す。
図１１のキー集合情報調整手順フローでは、まず引数として入力されたノードアドレスＮが示すノード（ノードＮ）がルートノードかどうかを判定する（ステップＳ１７−１）。
【０１１７】
ルートノードでない場合には、ノードＮの親ノードのエントリ表内の、ノードＮに対応するエントリ、すなわちポインタとしてノードＮのアドレスを保持するエントリのキーを、その時点でのノードＮに対応するキー、すなわちノードＮのエントリ表内のエントリ集合のキーの和をとったキーで上書きする（ステップＳ１７−２）。
【０１１８】
さらに、ノードＮの親ノードを入力とするキー集合情報調整手順を実施し（再帰呼び出しし）（ステップＳ１７−３）、処理を終える。
【０１１９】
ステップＳ１７−１において、ルートノードであった場合には、そのまま処理を終える。
【０１２０】
なお、本実施形態においては、リーフノードのエントリにタプルＩＤを含ませ、タプルそのものはタプル表に格納することとしたが、本発明の範囲はそれに限らず、リーフノードのエントリにタプルそのものを含ませることも可能である。
【０１２１】
また本実施形態においては、各属性が検索式に用いられる確率の近似値として、属性出現回数をタプル総数で除した値を用いたが、本発明の範囲はそれに限らず、各属性が検索式に用いられる確率について、予めデータベース管理者が入力することとしたり、実際にユーザが用いた検索式の統計情報に基づいて算出したりすることも可能である。
【０１２２】
また本実施形態においては、ペナルティの計算において、入力される２つのエントリのキーが含む全属性について考慮したが、本発明の範囲はそれに限らず、検索式に用いられる確率が高い属性のうち例えば上位１０個の属性についての項のみを考慮することも可能である。すなわち、他の属性の項については０とみなしてもよい。
【０１２３】
また本実施形態では、各属性が検索式に用いられる確率は独立として扱ったが、本発明の範囲はそれに限らず、各属性の共起性、すなわち１つの検索式に同時に現れる確率を考慮したペナルティの計算を行うことも可能である。たとえば、属性Ａと属性Ｂを条件に含む検索式が用いられる確率をＲとすると、その属性の組み合わせに対する重みづけ付き正規化長を（属性Ａの正規化長）×（属性Ｂの正規化長）×Ｒと定義し、全属性の全組合せに対するこのような重みづけ付き正規化長の和の増加量をペナルティとすればよい。
【０１２４】
次に、本実施形態のシステムにおける検索処理について説明する。
検索処理では、クライアント・コンピュータ装置３０１から受信したタプル検索要求に対し、サーバ・コンピュータ装置２０１の演算部２０３は、まず記憶部２０４が保持するインデックスから、受信した検索式が意味する検索条件を満たすタプルのＩＤ集合を取得する。具体的には、検索結果タプルＩＤリストを空にした後、記憶部２０４が保持するインデックスのルートノードを検索対象ノードとしてノード検索手順を実行することにより、検索結果タプルＩＤリスト内に該ＩＤ集合を得ることができる。さらに、記憶部２０４が保持するタプル表を参照し、該ＩＤ集合に対応するタプル集合を抽出し、検索結果として該タプル集合をタプル検索要求元であるクライアント・コンピュータ装置３０１に送信する。
【０１２５】
ノード検索手順フローを図１８に示す。
図１８に示すフローは、上記検索木を用いたノード検索手順のフローであって、検索式としてのキーである検索キーに対し、ルートノードからその下位のノードへと検索対象を変えながら、１つのノードを検索対象ノードとして検索を行う際に呼び出されるものであるとともに、ステップＳ１８−７において再帰呼び出しされるものである。図１８のフローでは、まず、検索対象ノードがリーフノードか否かを判定し（ステップＳ１８−１）、リーフノードである場合には、検索対象ノードのエントリ表に記載されたエントリのうち、検索条件を満たすものを検索結果タプルＩＤリストに追加し（ステップＳ１８−２）、処理を終える。
【０１２６】
ステップＳ１８−１において、リーフノードでない場合には、まず変数ｉに１を代入し（ステップＳ１８−３）、検索対象ノードに含まれるエントリ表内のｉ番目のエントリが存在するか否かを判定する（ステップＳ１８−４）。存在しない場合には、処理を終える。
【０１２７】
ステップＳ１８−４において、ｉ番目のエントリが存在する場合には、該エントリに含まれるポインタが指し示す子ノード以下のノードに検索条件を満たすタプルが存在し得るか否かを、該エントリに含まれるキーより判定する（ステップＳ１８−５）。存在しえない場合には、変数ｉを１増加させ（ステップＳ１８−６）、ステップＳ１８−４に戻る。
【０１２８】
ステップＳ１８−５において、存在し得る場合には、該エントリのポインタが指し示す子ノードを検索対象ノードとして再帰的にノード検索手順を実施する（ステップＳ１８−７）。
【０１２９】
本実施形態によれば、多種多次元のタプルに対し、統一的に１つの木構造インデックスを構築し、そのペナルティとして、エントリ挿入前後での検索される確率に対応する値（すなわち検索される確率ないし検索される確率の近似値）の増加量を用いている。このペナルティであれば、次元毎に大小関係を判別する必要はなく、エントリが含むキーの次元数や種類が異なっても定義可能となる。これにより、多種多次元のタプル集合を蓄積・検索する際の、複数のインデックスを用いることによるオーバーヘッド、すなわち処理量や記憶容量、処理速度が大きくなることを抑え、また多種多次元のタプル集合に対して検索効率を向上させるクラスタリングを実現することが可能となる。
【０１３０】
また、本実施形態によれば、前記ペナルティとして、エントリに含まれるキーに含まれる各属性に対する重みづけ付き正規化長の和の増加量を用いるようにしている。ある属性が検索式に用いられた場合、その値としてどの値を取り得るかの可能性は該属性の定義域内で一様と仮定すると、該エントリにアクセスする必要がある確率は（該エントリのキーに含まれる該属性の値範囲／該属性の定義域）で表されるが、さらにインデックスに蓄積した全タプルにおける該属性の最大値から最小値までを該属性の定義域と近似したものが該正規化長であり、重みづけ付き正規化長は、さらに該属性が検索式に用いられる確率を正規化長に乗じたものである。従って、エントリに含まれるキーに含まれる各属性に対する重みづけ付き正規化長の和は、検索時に、検索条件に適合するタプルを探すために該エントリにアクセスしなければならない確率の近似値に相当する。該ペナルティを用いることにより、検索時にアクセスしなければならないエントリ数を総じて小さくするよう木構造を構築することが可能となる。すなわち、検索の処理量、処理速度を向上させることが可能となる。
【０１３１】
また、本実施形態によれば、該エントリの算出において用いる、属性が検索式に用いられる確率として、属性出現回数をタプル総数で除した値を用いている。これにより、各属性の検索式に用いられる確率が不明な場合でも、蓄積するタプル集合から該確率の推定値を得ることが可能となる。
【０１３２】
なお、本発明が特徴とする構成と、上記実施形態における構成との対応関係は次のとおりである。
【０１３３】
本発明の特徴は、蓄積検索対象の情報の単位であるタプル（図２）は、属性−値の組の並びを少なくとも含む１以上の長さを有するものであり、該属性の種類や該並びの長さが同じまたは異なる１つ以上の該タプルが複数記憶されるものであり、該タプルから検索キーがインデックス化され検索木（図５）が構築されるものであり、該検索木はノード（図５のルートノード４０１、インナーノード４０２、リーフノード４０３）を階層的に有する構成であり、該ノードの内最下層のリーフノードはエントリとして該タプルを識別するタプル識別子（タプルＩＤ）とキーを有するものであり（図７）、該ノードの内該リーフノードより上位のインナーノードはエントリとして下位ノードである子ノードの位置情報であるポインタとキーを有するものであり（図８）、該インデックスの構築において、エントリをノードに挿入する際、１つの挿入すべきエントリＸと、該エントリを挿入すべきレベル数Ｌ（リーフノードを０として階層が上がるごとに１増える階層数）が与えられた際（図１１のステップＳ１１−１、図１２のフロー）、はじめにルートノードを操作対象ノードとし（図１２のステップＳ１２−１）、操作対象ノードにおいて、「該操作対象ノードがすでに含む既存エントリに対し、該エントリＸを挿入した場合のペナルティ」が最も小さい該既存エントリを選出し（図１２のステップＳ１２−６、Ｓ１２−８、Ｓ１２−１０、Ｓ１２−９）、該既存エントリに含まれるポインタが指し示す子ノードを次の操作対象ノードと選定し（図１２のステップＳ１２−７）、該次の操作対象ノードのレベル数がＬより大きい場合は（図１２のステップＳ１２−２で「ＮＯ」）、該次の操作対象ノードからさらに次の操作対象ノードを選定することを再帰的に繰り返し（図１２のステップＳ１２−６、Ｓ１２−８、Ｓ１２−１０、Ｓ１２−９、Ｓ１２−７）、該次の操作対象ノードのレベル数がＬに到達した場合は（図１２のステップＳ１２−２で「ＹＥＳ」）、このノードを選択ノードとするステップ（図１２のステップＳ１２−３）と、選択ノードが許容できる最大数のエントリを持っていない場合において（図１１のステップＳ１１−２で「ＹＥＳ」）、選択ノードに対し、エントリＸを追加するステップ（図１１のステップＳ１１−３）と、選択ノードが既に許容できる最大数のエントリを持っている場合において（図１１のステップＳ１１−２で「ＮＯ」）、エントリＸを追加しつつ選択ノードの分割を行うステップ（図１１のステップＳ１１−４、図１３のステップＳ１３−１およびＳ１３−２以降のステップ）と、分割を行った場合において、選択ノードの上位ノードのエントリを更新するステップ（図１１のステップＳ１１−５、図１７のフロー）と、を有する情報蓄積検索方法において、該ペナルティは、該操作対象ノードがすでに含む既存エントリＡに対し、エントリＢを挿入する際、該エントリＢを挿入する前の該エントリＡと、挿入した後の該エントリＡとを比べた場合の、該エントリＡが検索される確率に対応した値の増分を示す値として定義される（式（１）、図１２のステップＳ１２−５、Ｓ１２−８）、ことである。
【０１３４】
また、他の発明は、上記分割を行うステップが、選択ノードが含む複数のエントリにエントリＸを追加した各エントリを２つのグループに順次、振り分ける際に（図１３のステップＳ１３−２４、Ｓ１３−２５）、各グループがすでに含むエントリの和をとったエントリ（（Ｇ１）、（Ｇ２））を既存エントリＡとし、該振り分けられるエントリ（Ｅｉ）をエントリＢとしてグループ毎に求めた各ペナルティに基づいて振り分け先のグループを選択して振り分けを行うステップ（図１３のステップＳ１３−１７〜Ｓ１３−２５）と、該２つのグループうちの１つのグループに振り分けられた各エントリを選択ノードのエントリとするとともに、もう１つのグループに振り分けられた各エントリを新たに生成したノードのエントリとするステップ（図１３のステップＳ１３−２６）と、該新たに生成したノードのエントリを該ノードの親ノードに挿入するステップ（図１４のステップＳ１３−２９）と、を含むことを特徴とする。
【０１３５】
また、他の発明は、分割を行うステップ（図１１のステップＳ１１−４、図１３のステップＳ１３−１およびＳ１３−２以降のステップ）において、選択ノードが含む複数のエントリにエントリＸを追加した各エントリを２つのグループに順次、振り分ける際、はじめに、各エントリに含まれる任意の２つのエントリの一方（ｉ番目のエントリ）を既存エントリＡとし、他方のエントリ（ｊ番目のエントリ）をエントリＢとして求めたペナルティから、他方のエントリ（ｊ番目のエントリ）が検索される確率に対応した値を減じた値が最も大きくなる２つのエントリを、２つのグループに振り分ける（図１３のステップＳ１３−２〜Ｓ１３−１１）ことを特徴とする。
【０１３６】
また、他の発明は、上記ペナルティの算出において、エントリが検索される確率に対応した値（Ｑ（Ｃ））として、該エントリに含まれるキーに含まれる各属性に対する重みづけ付き正規化長の和を用い（式（２））、該重みづけ付き正規化長は、正規化長（Ｌ´Ｃｉ／ＬＣｉ）に、該属性が検索式に用いられる確率（Ｒ（Ｃｉ））を掛け合わせた値であり、該正規化長は、該キーに含まれる該属性の最大値から最小値を引いた値（Ｌ´Ｃｉ）を、それまで該検索木に挿入された全タプル集合に含まれる該属性の最大値から最小値を引いた値（ＬＣｉ）で除した値である、ことを特徴とする。
【０１３７】
また、他の発明は、属性が検索式に用いられる確率（Ｒ（Ｃｉ））として、属性出現回数をタプル総数で除した値を用い、該属性出現回数は、それまでに該検索木に挿入された全タプル集合における該属性の出現回数であり、該タプル総数は、それまでに該検索木に挿入された全タプル集合の要素数である（式（３））、ことを特徴とする。
【０１３８】
また、他の発明は、上記検索木を用いた検索において（図１８のフロー）、検索式としてのキーである検索キーに対し、ルートノードからその下位のノードへと検索対象を変えながら、１つの該ノードを検索対象とし、該ノードがインナーノードであれば（図１８のステップＳ１８−１で「ＮＯ」）、該ノードに含まれる各エントリについて、該エントリのキーが検索キーに含まれる各属性を全て含み、かつ、該検索キーに含まれる各属性に対応する値または値範囲と該エントリのキーに含まれる該属性に対応する値または値範囲とが一致または部分的に一致する（一方の値または値範囲が、他方の値範囲に含まれるまたは一部重なる）かを調べる検索手順を行い（ステップＳ１８−４、Ｓ１８−５）、一致または部分的に一致する場合には（ステップＳ１８−５で「ＹＥＳ」）、該エントリのポインタで接続されたノードを検索対象、該検索キーを検索キーとしてノード検索手順を再帰的に行い（ステップＳ１８−７）、また、該ノードがリーフノードであれば（ステップＳ１８−１で「ＹＥＳ」）、該ノードに含まれる各エントリについて、該エントリのキーが検索キーに含まれる各属性を全て含み、かつ、検索キーに含まれる各属性に対応する値または値範囲に該エントリのキーに含まれる該属性に対応する値が含まれるかを調べ、含まれる場合には該エントリのタプル識別子を検索結果タプル識別子集合に加える（ステップＳ１８−２）、ノード検索ステップ、を有することを特徴とする。
【符号の説明】
【０１３９】
１０１  ネットワーク
２０１  サーバ・コンピュータ装置
２０２  通信部
２０３  演算部
３０４  記憶部
３０１  クライアント・コンピュータ装置
３０２  通信部
３０３  タプル／検索式作成表示部
４０１  ルートノード
４０２  インナーノード
４０３  リーフノード
５０１  タプル表
５０２  インナーノードのエントリ表
５０３  リーフノードのエントリ表
５０４  属性表
【図１】
0005430436.tif 000002
【図２】
0005430436.tif 000003
【図３】
0005430436.tif 000004
【図４】
0005430436.tif 000005
【図５】
0005430436.tif 000006
【図６】
0005430436.tif 000007
【図７】
0005430436.tif 000008
【図８】
0005430436.tif 000009
【図９】
0005430436.tif 000010
【図１０】
0005430436.tif 000011
【図１１】
0005430436.tif 000012
【図１２】
0005430436.tif 000013
【図１３】
0005430436.tif 000014
【図１４】
0005430436.tif 000015
【図１５】
0005430436.tif 000016
【図１６】
0005430436.tif 000017
【図１７】
0005430436.tif 000018
【図１８】
0005430436.tif 000019