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