(57)【要約】      （修正有）【課題】データベース又は情報検索システムに格納されたキーの２つ以上の集合への論理積、論理和、差分、及び排他的論理和等の演算を含むデータベース又は情報検索システム内のクエリを実行する時間効率的な方法を提供するトライ、コンピュータ実施方法及び非一時的コンピュータ可読媒体を提供する。【解決手段】実行モデルにおいて、全てのデータソースはトライである。２つ以上の入力トライが、各集合演算に従って結合されて、各結果トライのノードが関連付けられたキーの集合を取得する。このようにして実行される論理積演算は、特に２つ以上のデータ項目がクエリに関わる場合、効率的な範囲クエリに使用することができる。ビットマップに基づくトライの実施の物理代数は、集合演算の論理代数に直接対応し、ビット単位のブール演算による効率的な実施を可能にする。【選択図】図２９
2020098583.tif 000002
【特許請求の範囲】
【請求項１】
電子データベースアプリケーション又は情報検索システムで使用されるトライであって、前記トライは１つ又は複数のノードを含み、
前記トライにより構成される親ノード、好ましくは、２つ以上の子ノードを有する各親ノードは、ビットマップ及び１つ又は複数のポインタを含み、各ポインタには前記ビットマップにおいて設定されたビットが関連付けられ、各ポインタは前記親ノードの子ノードを指し、前記トライは、
前記トライにより構成される親ノード、好ましくは、１つのみの子ノードを有する各親ノードは、前記子ノードへのポインタを含まず、及び／又は前記子ノードは、メモリにおいて、前記親ノードに相対して予め定義された位置に格納されることを特徴とする、トライ。
【請求項２】
１つのみの子ノードを有する前記親ノードの前記子ノードは、メモリにおいて、前記親ノードの直後の位置に格納される、請求項１に記載のトライ。
【請求項３】
ノード、好ましくは各子ノードには、キー部分が関連付けられ、前記トライ内のルートノードから別のノード、特にリーフノードへのパスがキーを定義し、前記キーは、前記パス内の前記ノードに関連付けられた前記キー部分を連結したものである、請求項１又は２に記載のトライ。
【請求項４】
電子データベースアプリケーション又は情報検索システムで使用されるトライであって、前記トライは１つ又は複数のノードを含み、
前記トライにより構成される親ノード、好ましくは、２つ以上の子ノードを有する少なくとも各親ノードは、ビットマップを含み、
ノード、好ましくは各子ノードには、キー部分が関連付けられ、
子ノード、好ましくは、親が２つ以上の子ノードを有する少なくとも各子ノードの前記キー部分の値は、前記子ノードが関連付けられたビットを有する前記親ノードにより構成されるビットマップ内の（設定）ビットの値によって決まり、前記トライは、
ノード、好ましくは、１つのみの子ノードを有し、且つ全ての子孫ノードが多くとも１つの子ノードを有する、各ノードは、末端分岐ノードと記され、
末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられた前記キー部分の前記値は、前記子孫ノードの前記親ノードに含まれるビットマップ内の（設定）ビットの値によって決まらないことを特徴とするトライ。
【請求項５】
前記末端分岐ノードは２つ以上の子孫ノードを有する、請求項４に記載のトライ。
【請求項６】
前記末端分岐ノードの親は２つ以上の子ノードを有する、請求項４又は５に記載のトライ。
【請求項７】
前記末端分岐ノードとしての記しは、ビットが設定されていないビットマップである、請求項４〜６のいずれか一項に記載のトライ。
【請求項８】
前記末端分岐ノードの前記ビットマップは、２つ以上の子ノードを有する親ノードに含まれるビットマップと同じ長さ又はフォーマットを有する、請求項７に記載のトライ。
【請求項９】
前記トライに含まれる末端分岐ノード、好ましくは各末端分岐ノード及び／又は前記末端分岐ノードの子孫ノード、好ましくは各子孫ノードは、子ノードへのポインタを含まず、及び／又は前記子ノードは、メモリにおいて、前記親ノードに相対して予め定義された位置に、好ましくは、メモリにおいて前記親ノードの直後の位置に格納される、請求項４〜８のいずれか一項に記載のトライ。
【請求項１０】
末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましく各子孫ノードに関連付けられた前記キー部分の前記値は、前記子孫ノードの前記親ノードに含まれる、請求項４〜９のいずれか一項に記載のトライ。
【請求項１１】
末端分岐ノード、好ましくは各末端分岐ノードの前記子孫ノード、好ましくは全ての子孫ノードに関連付けられた前記キー部分の前記値は、前記末端分岐ノード後に連続して格納される、請求項４〜１０のいずれか一項に記載のトライ。
【請求項１２】
末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられた前記キー部分の前記値の符号化は、２つ以上の子ノードを有する親ノードに含まれるビットマップよりも、必要とするメモリ空間が少ない、請求項４〜１１のいずれか一項に記載のトライ。
【請求項１３】
末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられた前記キー部分の前記値は、二進数として符号化される、請求項４〜１２のいずれか一項に記載のトライ。
【請求項１４】
２つ以上の子ノードを有する親ノード、好ましくは各親ノードに含まれる前記ビットマップは、３２ビット、６４ビット、１２８ビット、又は２５６ビットを有し、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられた前記キー部分は、５ビット、６ビット、７ビット、又は８ビットによりそれぞれ符号化される、請求項４〜１３のいずれか一項に記載のトライ。
【請求項１５】
末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられた前記キー部分の前記値は、整数値として符号化される、請求項４〜１４のいずれか一項に記載のトライ。
【請求項１６】
親ノードである前記末端分岐ノードの子孫ノード、好ましくは、親ノードである各子孫ノードは、設定ビットが子ノードに関連付けられた前記キー部分の前記値を決めるビットマップを含まない、請求項４〜１４のいずれか一項に記載のトライ。
【請求項１７】
２つ以上の子ノードを有する、前記トライに含まれる親ノード、好ましくは、少なくとも各親ノードは、１つ又は複数のポインタを含み、各ポインタには、前記親ノードに含まれる前記ビットマップに設定されたビットが関連付けられ、各ポインタは前記親ノードの子ノードを指す、請求項４〜１６のいずれか一項に記載のトライ。
【請求項１８】
前記トライは請求項１又は２に記載のトライである、請求項４〜１７のいずれか一項に記載のトライ。
【請求項１９】
電子データベースアプリケーション又は情報検索システムで使用されるトライであって、前記トライは１つ又は複数のノードを含み、
ノード、好ましくは、２つ以上の子ノードを有する少なくとも各親ノードは、論理ビットマップの形態のビットマップ及び幾つかのポインタを含み、各ポインタには前記論理ビットマップにおいて設定されたビットが関連付けられ、各ポインタは前記ノードの子ノードを指し、前記トライは、
前記論理ビットマップが複数のセクションに分割され、ヘッダビットマップ及び幾つかのコンテンツビットマップにより符号化され、
各セクションには、前記ヘッダビットマップ内のビットが関連付けられ、
１つ又は複数のビットが設定された前記論理ビットマップの各セクションについて、前記ヘッダビットマップにおいて、前記セクションに関連付けられたビットは設定され、前記セクションはコンテンツビットマップとして格納されることを特徴とするトライ。
【請求項２０】
ビットが設定されていない前記論理ビットマップの各セクションについて、前記ヘッダビットマップにおいて、前記セクションに関連付けられたビットは設定されず、前記セクションはコンテンツビットマップとして格納されない、請求項１９に記載のトライ。
【請求項２１】
前記セクションのそれぞれはコヒーレントである、請求項１９又は２０に記載のトライ。
【請求項２２】
全てのセクションは同じサイズを有する、請求項１９〜２１のいずれか一項に記載のトライ。
【請求項２３】
前記セクションのサイズは１バイトである、請求項２２に記載のトライ。
【請求項２４】
コンテンツビットマップとして記憶されるセクションの量は、前記ヘッダビットマップにおいて設定されたビット数に等しい、請求項１９〜２３のいずれか一項に記載のトライ。
【請求項２５】
前記ヘッダビットマップのサイズは１バイトである、請求項１９〜２４のいずれか一項に記載のトライ。
【請求項２６】
前記コンテンツビットマップは、メモリにおいて前記ヘッダビットマップに相対して予め定義された位置に格納される、請求項１９〜２５のいずれか一項に記載のトライ。
【請求項２７】
前記論理ビットマップの前記コンテンツビットマップは、配列、リスト、又は連続した物理若しくは仮想メモリロケーションに格納される、請求項１９〜２６のいずれか一項に記載のトライ。
【請求項２８】
前記コンテンツビットマップは、前記コンテンツビットマップのセクションに関連付けられた設定ビットが前記ヘッダビットマップに配置される順と同順又は逆順で格納される、請求項１９〜２７のいずれか一項に記載のトライ。
【請求項２９】
前記論理ビットマップの全てのコンテンツビットマップ内のあるコンテンツビットマップのランクは、前記ヘッダビットマップ内の全ての設定ビット内の、前記コンテンツビットマップの前記セクションに関連付けられた前記設定ビットのランクに対応する、請求項１９〜２８のいずれか一項に記載のトライ。
【請求項３０】
ノードに含まれるポインタ、好ましくはノードの各ポインタ及び／又はリーフノードではない各ノードのポインタは、請求項１９〜２９のいずれか一項における論理ビットマップに定義された符号化方法で符号化される、請求項１９〜２９のいずれか一項に記載のトライ。
【請求項３１】
前記トライは請求項１〜１８のいずれか一項に記載のトライである、請求項１９〜３０のいずれか一項に記載のトライ。
【請求項３２】
ノード、好ましくは各子ノードにはキー部分が関連付けられ、ルートノードから前記トライ内の別のノード、特にリーフノードへのパスはキーを定義し、前記キーは、前記パス内の前記ノードに関連付けられた前記キー部分を連結したものである、請求項１〜３１のいずれか一項に記載のトライ。
【請求項３３】
電子データベースアプリケーション又は情報検索システムで使用されるトライであって、前記トライは１つ又は複数のノードを含み、
ノード、好ましく各子ノードにはキー部分が関連付けられ、ルートノードから前記トライ内の別のノード、特にリーフノードへのパスはキーを定義し、前記キーは、前記パス内の前記ノードに関連付けられた前記キー部分を連結したものであり、前記トライは、
前記キーが制御情報及びコンテンツ情報を含むことを特徴とする、トライ。
【請求項３４】
前記キーは、コンテンツ情報を含む１つ又は複数のキー部を含み、前記キー部のそれぞれについて、前記制御情報は、前記キー部に含まれる前記コンテンツ情報のデータ型を指定するデータ型情報要素を含む、請求項３３に記載のトライ。
【請求項３５】
キー部、好ましくは各キー部は、前記キー部に含まれる前記コンテンツ情報の前記データ型を指定するデータ型情報要素を含む、請求項３４に記載のトライ。
【請求項３６】
前記データ型情報要素は、好ましくは前記コンテンツ情報要素前に、前記コンテンツ情報要素により配置される、請求項３５に記載のトライ。
【請求項３７】
前記データ型情報要素は一緒に配置され、好ましくは、データ型が指定される前記コンテンツ情報要素と同順又は逆順で配置される、請求項３４に記載のトライ。
【請求項３８】
前記制御情報は、前記キーにおいて前記コンテンツ情報前に配置される、請求項３７に記載のトライ。
【請求項３９】
前記キーは、異なるデータ型のコンテンツ情報を含む２つ以上のキー部を含む、請求項３４〜３８のいずれか一項に記載のトライ。
【請求項４０】
前記データ型の少なくとも１つは、固定サイズのデータ型である、請求項３４〜３９のいずれか一項に記載のトライ。
【請求項４１】
前記固定サイズのデータ型は整数、長整数、倍精度浮動小数点、又は時刻／日付けプリミティブである、請求項４０に記載のトライ。
【請求項４２】
前記データ型の少なくとも１つは、可変サイズのデータ型である、請求項３４〜４１のいずれか一項に記載のトライ。
【請求項４３】
前記可変サイズのデータ型は、文字列、好ましくはユニコード文字列、又は可変精度整数である、請求項４２に記載のトライ。
【請求項４４】
前記キー部の情報は、２つ以上のキー部分に含まれる、請求項３４〜４３のいずれか一項に記載のトライ。
【請求項４５】
キー部に含まれる前記コンテンツ情報の前記データ型は、可変サイズのデータ型であり、前記コンテンツ情報要素の終わりは、特定のシンボルにより又は前記キー部を含む前記キー部分の特定の１つ内の特定のビットにより記される、請求項３４〜４４のいずれか一項に記載のトライ。
【請求項４６】
前記制御情報は、前記最後のキー部を識別する情報を含む、請求項３４〜４５のいずれか一項に記載のトライ。
【請求項４７】
前記制御情報は、前記トライが動的集合の格納に使用されるか、それとも連想配列の格納に使用されるかについての情報を含む、請求項３３〜４６のいずれか一項に記載のトライ。
【請求項４８】
前記トライは、請求項１〜３２のいずれか一項に記載のトライである、請求項３３〜４７のいずれか一項に記載のトライ。
【請求項４９】
２つ以上の子ノードを有するノード、このマイクは少なくとも各親ノードは、ビットマップ及び幾つかのポインタを含み、各ポインタには、前記ビットマップにおいて設定されたビットが関連付けられ、各ポインタは前記ノードの子ノードを指す、請求項３３〜４８のいずれか一項に記載のトライ。
【請求項５０】
電子データベースアプリケーション又は情報検索システムで使用されるトライであって、前記トライは１つ又は複数のノードを含み、
ノード、好ましくは各子ノードにはキー部分が関連付けられ、
前記トライ内のルートノードから別のノード、特にリーフノードへのパスが、前記ノードが関連付けられたキーを定義し、前記キーは、前記パス上の前記ノードに関連付けられた前記キー部分を連結したものであり、前記トライは、
２つ以上のデータ項目はキーにおいて符号化され、前記データ項目の最後における１つ又は２つ、好ましくは各データ項目は、２つ以上の構成要素からなり、
前記キーは２つ以上の連続セクションを含み、前記セクションの少なくとも１つ又は２つ、好ましくは各セクションは、前記キーに符号化された前記データ項目の２つ以上の構成要素を含むことを特徴とするトライ。
【請求項５１】
キーのセクション、好ましくは各セクションは、前記キーに符号化された前記データ項目のそれぞれから少なくとも及び／又は多くとも１つの構成要素を含む、請求項５０に記載のトライ。
【請求項５２】
キーの２つ以上、好ましくは全てのセクションについて、異なるデータ項目に属する構成要素は、前記セクション内で同じ順序で並べられる、請求項５０又は５１に記載のトライ。
【請求項５３】
データ項目の前記構成要素を含む前記セクションの前記順序は、前記データ項目内の前記構成要素の順序に対応する、請求項５０〜５２のいずれか一項に記載のトライ。
【請求項５４】
子ノード、好ましくは前記子ノードのそれぞれに関連付けられた前記キー部分は、データ項目の構成要素の一部に対応する、請求項５０〜５３のいずれか一項に記載のトライ。
【請求項５５】
子ノード、好ましくは前記子ノードのそれぞれに関連付けられた前記キー部分は、データ項目の１つの構成要素に対応し、及び／又はデータ項目、好ましくは各データ項目の構成要素、好ましくは各構成要素は、前記トライの１つの子ノードに関連付けられた前記キー部分に対応する、請求項５０〜５３のいずれか一項に記載のトライ。
【請求項５６】
子ノード、好ましくは前記子ノードのそれぞれに関連付けられた前記キー部分は、データ項目の２つ以上の構成要素に対応する、請求項５０〜５３のいずれか一項に記載のトライ。
【請求項５７】
キーの前記データ項目の２つ以上、好ましくは全ては、同じ数の構成要素を有する、請求項５０〜５６のいずれか一項に記載のトライ。
【請求項５８】
２つ以上のデータ項目はジオロケーションデータを表す、請求項５０〜５７のいずれか一項に記載のトライ。
【請求項５９】
データ項目は、経度、緯度、文字列、又はこれらの２つ以上の組合せを表す、請求項５０〜５８のいずれか一項に記載のトライ。
【請求項６０】
データ項目の前記構成要素は、前記データ項目の二進符号化のビット群である、請求項５０〜５９のいずれか一項に記載のトライ。
【請求項６１】
ビット群は６ビットを含む、請求項６０に記載のトライ。
【請求項６２】
データ項目は数である、請求項５０〜６１のいずれか一項に記載のトライ。
【請求項６３】
前記データ項目は整数、長整数、又は倍長整数である、請求項６２に記載のトライ。
【請求項６４】
前記データ項目は６４ビット整数である、請求項６２又は６３に記載のトライ。
【請求項６５】
前記データ項目の前記構成要素は数字である、請求項６２〜６４のいずれか一項に記載のトライ。
【請求項６６】
前記数字は予め定義された基数、好ましくは６４を有する、請求項６５に記載のトライ。
【請求項６７】
データ項目は文字列である、請求項５０〜６６のいずれか一項に記載のトライ。
【請求項６８】
前記データ項目の前記構成要素は１文字である、請求項６７に記載のトライ。
【請求項６９】
データ項目はバイトの配列である、請求項５０〜６８のいずれか一項に記載のトライ。
【請求項７０】
前記トライは請求項１〜４９のいずれか一項に記載のトライである、請求項５０〜６９のいずれか一項に記載のトライ。
【請求項７１】
請求項３４に従属する場合、データ項目は、キー部又はキー部に含まれる前記コンテンツ情報に対応する、請求項７０に記載のトライ。
【請求項７２】
２つ以上の子ノードを有するノード、好ましくは少なくとも各親ノードは、ビットマップ及び幾つかのポインタを含み、各ポインタには前記ビットマップにおいて設定されたビットが関連付けられ、各ポインタは前記ノードの子ノードを指す、請求項３３〜７１のいずれか一項に記載のトライ。
【請求項７３】
前記ビットマップは、予め定義されたサイズの整数としてメモリに記憶される、請求項１〜３２のいずれか一項、請求項４９、又は７２に記載のトライ。
【請求項７４】
前記ビットマップのサイズは３２ビット、６４ビット、１２８ビット、又は２５６ビットである、請求項１〜３２のいずれか一項、請求項４９、７２、又は７３に記載のトライ。
【請求項７５】
前記トライは、標的コンピュータシステムで格納され処理されるのに適し、前記ビットマップの前記サイズは、前記標的コンピュータシステムのＣＰＵのレジスタ、システムバス、データバス、及び／又はアドレスバスのビット幅に等しい、請求項１〜３２のいずれか一項、請求項４９、又は請求項７２〜７４のいずれか一項に記載のトライ。
【請求項７６】
前記トライの前記ビットマップ及び／又は前記ポインタ及び／又は前記ノードは、配列、好ましくは長整数若しくはバイトのインアンド配列、リスト、又は連続した物理若しくは仮想メモリロケーションに格納される、請求項１〜３２のいずれか一項、請求項４９、又は請求項７２〜７５のいずれか一項に記載のトライ。
【請求項７７】
前記メモリは、物理若しくは仮想メモリ、好ましくは連続メモリであり、又は物理若しくは仮想メモリ、好ましくは連続メモリを含む、請求項１〜１６のいずれか一項、請求項２６、２７、又は７６に記載のトライ。
【請求項７８】
２つ以上の子ノードを有する親ノード、好ましくは少なくとも各親ノードに含まれるポインタの量は、前記親ノードに含まれるビットマップにおいて設定されたビット量に等しい、請求項１〜３２のいずれか一項、請求項４９、又は請求項７２〜７７のいずれか一項に記載のトライ。
【請求項７９】
親ノードの全てのポインタ内のあるポインタのランクは、前記親ノードの前記ビットマップ内の全ての設定ビット内のそのポイントに関連付けられた設定ビットのランクに対応する、請求項１〜３２のいずれか一項、請求項４９、又は請求項７２〜７８のいずれか一項に記載のトライ。
【請求項８０】
前記ポインタは、前記ビットが前記ビットマップにおいて設定されるのと同順又は逆順に格納される、請求項１〜３２のいずれか一項、請求項４９、又は請求項７２〜７７のいずれか一項に記載のトライ。
【請求項８１】
親ノードに含まれるポインタは、前記子ノードに含まれるビットマップを指す、請求項１〜３３のいずれか一項、請求項４９、又は請求項７２〜８０のいずれか一項に記載のトライ。
【請求項８２】
前記トライのリーフノード、好ましくは各リーフノードに含まれるポインタの数はゼロである、請求項１〜３３のいずれか一項、請求項４９、又は請求項７２〜８１のいずれか一項に記載のトライ。
【請求項８３】
親が2つ以上の子ノードを有する子ノード、好ましくは少なくとも各子ノードの前記キー部分の前記値は、ビットが前記子ノードに関連付けられた前記親ノードに含まれる前記ビットマップ内の（設定）ビットの前記値によって決まる、請求項３、又は３３〜８２のいずれか一項に記載のトライ。
【請求項８４】
前記キー部分に利用可能な異なる値の最大量は、前記ビットマップのサイズによって定義される、請求項４〜１８のいずれか一項又は請求項８３に記載のトライ。
【請求項８５】
前記ビットマップの前記サイズは、前記キー部分に可能な英字を定義する、請求項４〜１８のいずれか一項、請求項８３、又は８４に記載のトライ。
【請求項８６】
前記トライ内の各キー部分は、同じ予め定義されたサイズの値を格納可能である、請求項３又は３２〜８５のいずれか一項に記載のトライ。
【請求項８７】
前記予め定義されるサイズは、５ビット値、６ビット値、７ビット値、又は８ビット値に対応する、請求項８６に記載のトライ。
【請求項８８】
データ項目の値、好ましくは全てのデータ項目の値の符号化は、データ項目の前記データ型を符号なし整数を本質的な特徴とするオフセット二進数表現に変換することによって得られる、請求項１〜８７のいずれか一項に記載のトライ。
【請求項８９】
前記整数は長整数である、請求項８８に記載のトライ。
【請求項９０】
前記データ項目の前記データ型が浮動小数点数である場合、前記符号化は、前記データ項目の前記データ型をオフセット二進数表現に変換することによって得られる、請求項８８又は８９に記載のトライ。
【請求項９１】
前記データ項目の前記データ型が２の補数の符号付き整数である場合、前記符号化は、前記データ項目の前記データ型をオフセット二進数表現に変換することによって得られる、請求項８８〜９０のいずれか一項に記載のトライ。
【請求項９２】
前記トライは、動的集合又は連想配列を格納する、請求項１〜９１のいずれか一項に記載のトライ。
【請求項９３】
電子データベース又は情報検索システムからデータを検索する方法であって、
２つ以上の入力トライを取得するステップであって、各入力トライは、前記電子データベース若しくは情報検索システムに記憶されたキーの集合又は電子データベースクエリ若しくは情報検索システムクエリの結果キーを格納する、取得するステップと、
論理演算を使用して前記入力トライを結合して、結果トライの前記ノードに関連付けられた前記キーの集合を取得するステップと、
出力として、前記結果トライの前記ノードに関連付けられた前記キーの集合及び／又は他のデータ項目又は前記結果キーの前記ノードに関連付けられた前記キーのサブセット及び／又は他のデータ項目、特に、前記結果トライのリーフに関連付けられた前記キー及び／又は他のデータ項目又は前記結果トライのノードに関連付けられたキーから導出されたキー若しくは値の集合を提供するステップと、
を含み、
トライは１つ又は複数のノードを含み、各子ノードにはキー部分が関連付けられ、ルートノードから前記トライ内の別のノードへのパスは、ノードに関連付けられたキーを定義し、前記キーは、前記パス上の前記ノードに関連付けられた前記キー部分を連結したものであり、
前記論理演算が差分である場合、前記結果トライの前記親ノードは、第１の入力トライの前記親ノードであり、前記結果トライの親ノードの前記リーフは、前記論理演算を使用して、前記第１の入力トライ内の対応する親ノードの子ノードの集合と、他の入力トライ内の任意の対応する親ノードの子ノードの集合とを結合したものであり、
前記論理演算が差分ではない場合、前記結果トライ内の各ノードの前記子ノードの集合は、前記論理演算を使用して、前記入力トライ内の前記対応するノードの前記子ノードの集合を結合したものであり、
異なるトライの前記ノードに関連付けられた前記キーが同一である場合、前記異なるトライの２つ以上のノードは互いに対応する、方法。
【請求項９４】
出力として提供された前記キーの集合は、トライで提供される、請求項９３に記載の方法。
【請求項９５】
出力として提供された前記キーの集合は、カーソル又は反復子により提供される、請求項９３に記載の方法。
【請求項９６】
前記入力トライを結合するステップは、
前記結果トライの前記ルートノードに対して結合関数を実行すること
を含み、
前記結果トライの入力ノードに対して前記結合関数を実行することは、
前記論理演算を使用して、前記結果トライの前記入力ノードに対応する前記入力トライの前記ノードの子ノードの前記集合を結合することにより、前記結果トライの前記入力ノードの子ノードの集合を特定することと、
前記結果トライの前記入力ノードに特定された前記子ノードのそれぞれに対して前記結合関数を実行することと、
を含む、請求項９３〜９５のいずれか一項に記載の方法。
【請求項９７】
前記入力トライを結合するステップは、縦型トラバーサル、横型トラバーサル、又はそれらの組合せを使用して実行される、請求項９３〜９６のいずれか一項に記載の方法。
【請求項９８】
縦型トラバーサルで前記入力トライを結合するステップを実行することは、前記入力ノードの前記子ノードの１つの前記結合関数を実行することと、その子ノードによって形成される前記サブトライをトラバースしてから、その子ノードの次の兄弟ノードに対して前記結合関数を実行することとを含む、請求項９７に記載の方法。
【請求項９９】
横型トラバーサルで前記入力トライを結合するステップを実行することは、前記結果トライの前記入力ノードに特定された前記子ノードのそれぞれに対して前記結合関数を実行することと、前記結果トライの前記入力ノードに対して特定された前記子ノードのそれぞれの子ノードの集合を特定してから、前記結果トライの前記入力ノードの任意の孫ノードに対して前記結合関数を実行することとを含む、請求項９７又は９８に記載の方法。
【請求項１００】
入力トライにおけるノード、好ましくは入力トライ内の少なくとも全ての親ノードはビットマップを含む、請求項９３〜９９のいずれか一項に記載の方法。
【請求項１０１】
トライ内の子ノードの前記キー部分の前記値は、ビットが子ノードに関連付けられた前記子ノードの親ノードに含まれる前記ビットマップ内の（設定）ビットの前記値によって決まる、請求項１００に記載の方法。
【請求項１０２】
前記論理演算を使用した前記入力トライの子ノードの前記結合は、前記論理演算を使用して前記入力トライの前記子ノードのそれぞれの前記ビットマップを結合することを含む、請求項１００又は１０１に記載の方法。
【請求項１０３】
前記ビットマップを結合することは、結合ビットマップを得ることを含み、前記結合の前記結果を特定するステップは、前記結合ビットマップに基づいて実行される、請求項１０２に記載の方法。
【請求項１０４】
前記論理演算は論理積、論理和、差分、又は排他的論理和である、請求項９３〜１０３のいずれか一項に記載の方法。
【請求項１０５】
前記論理演算を使用することは、ＡＮＤブール演算子、ＯＲブール演算子、又はＸＯＲブール演算子を使用することを結合することを含む、請求項１０４に記載の方法。
【請求項１０６】
前記論理演算を使用することは、ビット単位ＡＮＤブール演算子、ビット単位ＯＲブール演算子、ビット単位ＡＮＤ  ＮＯＴブール演算子、又はビット単位ＸＯＲブール演算子を使用してノードの前記ビットマップを結合することを含む、請求項１００〜１０３、又は１０５のいずれか一項に記載の方法。
【請求項１０７】
前記入力トライの１つ又は複数は、同じ又は異なる論理演算を使用して、特許請求の範囲に記載されるデータベースクエリを実行する方法の前記出力である、請求項９３〜１０６のいずれか一項に記載の方法。
【請求項１０８】
前記入力トライの１つ又は複数は、前記入力トライを結合する前記演算中に動的に生成される仮想トライである、請求項９３〜１０６のいずれか一項に記載の方法。
【請求項１０９】
少なくとも、好ましくは多くとも、前記論理演算を使用して前記入力トライを結合するのに必要とされる前記仮想トライの部分が動的に生成される、請求項１０８に記載の方法。
【請求項１１０】
電子データベース若しくは情報検索システムに格納されたキーの集合又は電子データベースクエリ若しくは情報システムクエリの結果キーの集合に対して範囲クエリを実行することにより、前記電子データベース又は前記情報検索システムからデータを検索する方法であって、
１つ又は複数の範囲の定義を取得するステップと、請求項９３〜１００のいずれか一項に記載の電子データベース又は情報検索システムからデータを検索する方法を実行するステップと、
を含み、
１つの入力トライは、前記１つ又は複数の範囲についてサーチすべき前記キーの集合又は前記結果キーの集合を格納する入力集合トライであり、
別の入力トライは、前記定義が得られた前記１つ又は複数の範囲に含まれる全ての値を格納する範囲トライであり、
前記論理演算は論理積である、方法。
【請求項１１１】
範囲は、特定のデータ型の第１の値と第２の値との間の全ての対を含む離散した順序付き値の集合である、請求項１１０に記載の方法。
【請求項１１２】
前記範囲は前記第１及び／又は第２の値を含む、請求項１１１に記載の方法。
【請求項１１３】
範囲トライは、請求項１０８又は１０９において定義される仮想トライである、請求項１１０〜１１２のいずれか一項に記載の方法。
【請求項１１４】
前記入力集合トライのリーフに関連付けられたキーは、特定のデータ型の１つのデータ項目を符号化する、請求項１１０〜１１２のいずれか一項に記載の方法。
【請求項１１５】
１つ又は複数の範囲の前記定義は、前記１つのデータ項目の１つ又は複数の範囲の定義を含む、請求項１１４に記載の方法。
【請求項１１６】
前記入力集合トライのリーフに関連付けられたキーは、特定のデータ型の２つ以上のデータ項目を符号化する、請求項１１０〜１１３のいずれか一項に記載の方法。
【請求項１１７】
１つ又は複数の範囲の前記定義は、前記データ項目の１つ又は複数の１つ又は複数の範囲の定義を含む、請求項１１６に記載の方法。
【請求項１１８】
前記範囲トライは、前記入力集合トライの前記リーフに関連付けられたキーにより符号化される前記データ項目のそれぞれの１項目範囲トライを結合することによって得られる多項目範囲トライであり、データ項目の前記１項目範囲トライは、前記データ項目の１つ又は複数の範囲に含まれる全ての値を格納する、請求項１１６又は１１７に記載の方法。
【請求項１１９】
前記１項目範囲トライの結合は、前記多項目範囲トライとの前記入力集合トライの結合を実施する関数内で実行される、請求項１１８に記載の方法。
【請求項１２０】
前記１項目範囲トライの結合は、前記多項目範囲トライとの前記入力集合トライの結合を実施する関数への入力として、前記多項目範囲トライを提供する関数によって実行される、請求項１１８に記載の方法。
【請求項１２１】
１項目範囲トライは、請求項１０８又は１０９において定義される仮想範囲トライである、請求項１１８〜１２０のいずれか一項に記載の方法。
【請求項１２２】
範囲の定義が得られない各データ項目の前記１項目範囲トライは、前記データ項目の可能な値の全範囲を格納する、請求項１１８〜１２１のいずれか一項に記載の方法。
【請求項１２３】
前記多項目範囲トライは、前記１項目範囲トライに格納された前記データ項目の前記値の全ての組合せを格納する、請求項１１８〜１２２のいずれか一項に記載の方法。
【請求項１２４】
範囲トライは、前記入力集合トライと同じ構造又はフォーマットを有する、請求項１０９〜１２３のいずれか一項に記載の方法。
【請求項１２５】
範囲トライの前記リーフに関連付けられたキーは、前記入力集合トライの前記リーフに関連付けられたキーと同じデータ型のデータ項目を符号化する、請求項１２４に記載の方法。
【請求項１２６】
範囲トライにおいて、特定のデータ型のデータ項目又はそのようなデータ項目の構成要素は、前記入力集合トライ内の対応するデータ項目又は前記データ項目の構成要素と同じレベルのノードに符号化される、請求項１２４又は１２５に記載の方法。
【請求項１２７】
前記方法は、前記入力集合トライの前記リーフに関連付けられたキーの集合を出力として提供する、請求項１０９〜１２６のいずれか一項に記載の方法。
【請求項１２８】
前記方法は、前記入力集合トライの前記リーフに関連付けられたキーによって符号化された前記データ項目のサブセットを符号化する縮小項目キーの集合を出力として提供する、請求項１１６〜１２６のいずれか一項に記載の方法。
【請求項１２９】
前記範囲トライとの前記入力集合トライの結合の結果として、前記縮小項目キーに符号化されないデータ項目に関連する前記入力集合トライの異なる分岐から得られる前記縮小項目キーの集合は、前記出力を提供する前、マージされる、請求項１２８に記載の方法。
【請求項１３０】
前記範囲トライとの前記入力集合トライの結合の結果として得られる前記縮小項目キーの集合は、前記出力を提供する前、新たに作成されたトライに書き込まれ、それにより、複製キーをなくす、請求項１２８又は１２９に記載の方法。
【請求項１３１】
近似文字列照合を実行することにより電子データベース又は情報検索システムからデータを検索する方法であって、
−サーチ文字列を取得するステップと、
−前記サーチ文字列及び／又は前記サーチ文字列の変形を含む近似文字列の集合を格納する一致トライを構築するステップと、
−論理積演算を使用して、前記一致トライを、前記電子データベース又は情報検索システムに格納された文字列の集合を格納するストレージトライと結合して、結果トライを取得するステップと、
−出力として、前記結果トライのノードの結果集合に関連付けられた文字列及び／又は他のデータ項目を提供するステップと、
を含み、
トライは１つ又は複数のノードを含み、各子ノードにはキー部分が関連付けられ、ルートノードから前記トライ内の別のノードへのパスは、ノードに関連付けられたキーを定義し、前記キーは、前記パス上の前記ノードに関連付けられた前記キー部分を連結したものである、方法。
【請求項１３２】
前記一致トライ内の１つ又は複数の子ノードは、２つ以上の親ノードを有する、請求項１３１に記載の方法。
【請求項１３３】
前記ストレージトライ及び前記結果トライ内の各子ノードは、１つのみの親ノードを有する、請求項１３１又は１３２に記載の方法。
【請求項１３４】
前記結果トライ内の各ノードの前記子ノードの集合は、前記一致トライ内の前記対応するノードの前記子ノードの集合と、前記ストレージトライ内の各ノードの前記子ノードの集合は、前記一致トライ内の前記対応するノードの前記子ノードの集合との論理積であり、同じキーが異なるトライの前記ノードに関連付けられる場合、前記異なるトライのノードは互いに対応する、請求項１３１〜１３３のいずれか一項に記載の方法。
【請求項１３５】
前記一致トライは、前記ストレージトライとの前記一致トライの前記論理積中に動的に生成される仮想トライである、請求項１３１〜１３４のいずれか一項に記載の方法。
【請求項１３６】
少なくとも、好ましくは多くとも、前記ストレージトライとの前記一致トライの論理積に必要な前記仮想トライの部分が動的に生成される、請求項９３〜１３５のいずれか一項に記載の方法。
【請求項１３７】
前記出力において提供されるデータ項目は、前記結果トライのノードの前記結果集合のノードに関連付けられた文字列を含むデータユニット、好ましくはドキュメント識別子を表す、請求項１３１〜１３６のいずれか一項に記載の方法。
【請求項１３８】
前記ストレージトライは、好ましくは、ドキュメントに含まれる文字列及び前記ドキュメント識別子のそれぞれを２つのキー部、例えば（文字列，長）として格納するインデックストライ又は物理インデックストライである、請求項１３１〜１３７のいずれか一項に記載の方法。
【請求項１３９】
前記一致トライは一致ノードの集合を含み、各一致ノードには、前記近似文字列の集合からの前記文字列の１つに対応する１つ又は複数のキーが関連付けられ、前記ノードの結果集合は、前記一致トライ内の前記一致ノードの集合に対応する前記結果トライのノードの集合であり、前記結果トライの前記ノードに関連付けられたキーが、前記一致トライの前記ノードに関連付けられたキーと同一である場合、前記結果トライのノードは前記一致トライのノードに対応する、請求項１３１〜１３８のいずれか一項に記載の方法。
【請求項１４０】
数Ｎを取得するステップを更に含み、前記サーチ文字列の変形は、前記サーチ文字列での多くともＮ個の１文字挿入、削除、及び／又は置換によって取得することができる文字列の集合からなる、請求項１３１〜１３９のいずれか一項に記載の方法。
【請求項１４１】
前記一致トライを構築するステップは、
−前記近似文字列の集合を表す有限オートマトンを構築することと、
−前記有限オートマトンから前記一致トライを導出することと、
を含む、請求項１３１〜１４０のいずれか一項に記載の方法。
【請求項１４２】
前記有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移には、特定の文字、好ましくは前記サーチ文字列に含まれる文字、ワイルドカード文字、又は空文字列が関連付けられる、請求項９３〜１４１のいずれか一項に記載の方法。
【請求項１４３】
前記有限オートマトンを構築するステップは、
−前記近似文字列の集合を表す非決定性有限オートマトンを構築することと、
−前記非決定性有限オートマトンから決定性有限オートマトンを導出することと、
を含み、
前記一致トライは前記決定性有限オートマトンから導出される、請求項１４１又は１４２に記載の方法。
【請求項１４４】
前記決定性有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移には、特定の文字、好ましくは前記サーチ文字列に含まれる文字又はワイルドカード文字が関連付けられる、請求項９３〜１４３のいずれか一項に記載の方法。
【請求項１４５】
前記一致トライ及び前記ストレージトライ内のノード、好ましくは少なくとも全ての親ノードは、ビットマップを含み、トライ内の子ノードのキー部分の値は、ビットが前記子ノードに関連付けられた前記子ノードの親ノードに含まれる前記ビットマップ内の（設定）ビットの値によって決まる、請求項１３１〜１４４のいずれか一項に記載の方法。
【請求項１４６】
前記一致トライの子ノードと前記ストレージトライの子ノードとの論理積は、前記論理積演算を使用して前記子ノードのそれぞれの前記ビットマップを結合することを含む、請求項９３〜１４５のいずれか一項に記載の方法。
【請求項１４７】
前記有限オートマトンから前記一致トライを導出するステップは、前記遷移に関連付けられた特定の文字又はワイルドカード文字の符号化により、前記有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移を関連付けることにより、拡張有限オートマトンを取得することを含み、前記符号化は、長さ及び／又はフォーマットが前記一致トライの前記親ノードに含まれる前記ビットマップに等しい１つ又は複数のビットマップからなり、又は表し、前記一致トライは前記拡張有限オートマトンから導出される、請求項１４１、１４５、又は１４６に記載の方法。
【請求項１４８】
特定の文字の符号化の場合、厳密に１ビットが、前記符号化に含まれるか、又は表される前記ビットマップのそれぞれにおいて設定される、請求項９３〜１４７のいずれか一項に記載の方法。
【請求項１４９】
ワイルドカード文字の符号化の場合、全ての有効文字符号化のビットは、前記符号化に含まれ、又は前記符号化によって表される前記ビットマップにおいて設定され、遷移元の状態に関連付けられた前記特定の文字の前記符号化を除く全ての有効文字符号化のビットは、前記符号化に含まれ、又は前記符号化によって表される前記ビットマップにおいて設定される、請求項１４７又は１４８に記載の方法。
【請求項１５０】
前記一致トライ、前記ストレージトライ、又は前記結果トライに格納された文字は、各トライのＭ＞１個、好ましくは５＞Ｍ個のキー部分によって符号化される、請求項１４５〜１４９のいずれか一項に記載の方法。
【請求項１５１】
前記有限オートマトンから前記一致トライを導出するステップは、前記有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移をＭ−１レベルの中間状態と、前記中間状態のＭ−１個を介して前記２つの状態をリンクするＭ個の遷移の１つ又は複数のシーケンスとで置換することにより、又は前記有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移に、前記Ｍ−１レベルの中間状態と、前記中間状態のＭ−１個を介して前記２つの状態をリンクするＭ個の遷移の１つ又は複数のシーケンスとを関連付けることにより、前記近似文字列の集合を表す完全有限オートマトンを取得することを含み、シーケンス内の前記Ｍ個の遷移のそれぞれには、長さ及び／又はフォーマットが前記一致トライの前記親ノードに含まれる前記ビットマップに等しいビットマップからなり、又は表される中間符号化が関連付けられ、前記一致トライは前記完全有限オートマトンから導出される、請求項９３〜１５０のいずれか一項に記載の方法。
【請求項１５２】
前記有限オートマトンの前記２つの状態間の前記遷移に、特定の文字が関連付けられる場合、前記シーケンスの前記Ｍ個の遷移が関連付けられた前記中間符号化に含まれ、又は表される前記ビットマップを連結したものは、前記特定の文字の符号化であり、前記ビットマップのそれぞれにおいて厳密に１ビットが設定される、請求項１５１に記載の方法。
【請求項１５３】
前記有限オートマトンの前記２つの状態間の前記遷移にワイルドカードが関連付けられる場合、シーケンスの前記Ｍ個の遷移が関連付けられた前記中間符号化に含まれ、又は表される前記ビットマップを連結したものは、全ての有効文字符号化のビットが、符号化に含まれ、若しくは表されるビットマップにおいて設定され、又は前記遷移の発端である状態に関連付けられた前記特定の文字の符号化を除く全ての有効文字符号化のビットが、符号化に含まれ、若しくは表されるビットマップにおいて設定される符号化及び／又は前記特定の文字の符号化の１つ又は複数の部分又は全ての有効文字符号化のビットが前記符号化に含まれ、又は表される前記ビットマップにおいて設定され、若しくは前記遷移が発端とする状態に関連付けられた前記特定の文字の前記符号化を除く全ての有効文字符号化のビットが、前記符号化に含まれ、又は表される前記ビットマップにおいて設定される符号化の１つ又は複数の部分を含む１つ又は複数の符号化を含む、請求項１５１又は１５２に記載の方法。
【請求項１５４】
前記拡張有限オートマトン又は前記完全有限オートマトンはそれぞれ、幾つかの行を含むデータ構造により表され、又は格納され、各行は、前記拡張有限オートマトン又は前記完全有限オートマトンの１つの状態を表し、前記状態を発端とする遷移のそれぞれにタプルを含み、各タプルは、前記遷移に関連付けられた前記符号化と、前記遷移が終わる前記状態への参照とを含む、請求項１４７〜１４９又は１５１〜１５３のいずれか一項に記載の方法。
【請求項１５５】
前記データ構造は、遷移が終わる各状態について、好ましくは前記状態への各参照においてビットとして符号化される、この状態が一致状態であるか否かについての情報を含む、請求項９３〜１５４のいずれか一項に記載の方法。
【請求項１５６】
前記データ構造は、遷移元の前記拡張有限オートマトン又は前記完全有限オートマトンの状態のそれぞれの行を含む、請求項１５４又は１５５に記載の方法。
【請求項１５７】
トライは請求項１〜９２のいずれか一項に記載のトライである、請求項９３〜１５６のいずれか一項に記載の方法。
【請求項１５８】
特に、キー若しくはキー及び値を格納し、クエリの結果キー若しくはキー及び値を格納し、又はクエリの入力キー若しくはキー及び値を格納する、電子データベースアプリケーション又は情報検索システムにおいて請求項１〜９２のいずれか一項に記載のトライを使用するコンピュータ実施方法。
【請求項１５９】
請求項１〜９２のいずれか一項に記載のトライを生成するコンピュータ実施方法。
【請求項１６０】
請求項１〜９２のいずれか一項に記載のトライを格納した非一時的コンピュータ可読媒体。
【請求項１６１】
請求項１〜９２のいずれか一項に記載のトライを表す電子データのストリーム。
【請求項１６２】
請求項１〜９２のいずれか一項に記載のトライにより、キー若しくはキー及び値、クエリの結果キー若しくはキー及び値、又はクエリの入力キー若しくはキー及び値を格納する電子データベース又は情報検索システム。
【請求項１６３】
請求項９３〜１５９のいずれか一項に記載の方法を実行する命令を含む、コンピュータプログラム、特にデータベースアプリケーション又は情報検索システムプログラム。
【請求項１６４】
請求項９３〜１５９のいずれか一項に記載の方法を実行するように構成された、１つ又は複数のプロセッサ及びメモリを含むデータ処理デバイス又はシステム。
【請求項１６５】
請求項１６４のコンピュータプログラムを記憶した好ましくは非一時的コンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
発明の技術分野
本発明は、一般的には、データベース及び情報検索システムにおけるトライデータ構造の有効使用及び高性能を有するそのようなシステムへの問い合わせに関する。
【背景技術】
【０００２】
発明の背景
データベース及び情報検索システムは、構造化情報及び非構造化情報の処理に使用されている。一般に、構造化データはデータベース（例えば、関係データベース）の領域であり、一方、非構造化情報は情報検索システム（例えば、全文サーチ）の領域である。データベースエンジンは、データを格納し検索する、データベース管理システム（又は他のアプリケーション）の部分である。情報検索システムでは、この機能はサーチエンジンによって実行される。
【０００３】
索引付けは、データベース又は情報検索システムの性能改善に使用される。クエリ用のインデックス（「キー」によるルックアップ又はアクセスとも呼ばれる）なしでは、結果を届けるためにデータベース全体又は情報ベース全体をスキャンする必要があり、遅すぎて有用ではない。
【０００４】
データベースインデックスは、書籍により提供されるインデックスと同等である：特定のキーワードを見つけるために、ユーザは書籍全体を読む必要はなく、その代わり、インデックス中の特定のキーワードを調べることができ、インデックスは、そのキーワードが関連するページへの参照を含む。これはサーチエンジンの背後にある基本原理でもある：任意の所与のサーチ語について、サーチエンジンは、適切なインデックスを調べることによりサーチ語を含むドキュメントを素早く見つける。情報検索システムの一例のクエリは全文サーチであり、その言葉（単語）はキーとして格納され、ドキュメントＩＤもキーとして格納される（例えば、以下の図７０の説明を参照）。例えば、「林檎（apple）」という言葉を１０及び３３のＩＤを有するドキュメントで見つけることができる場合、２つの複合キー（「林檎」、１０）及び（「林檎」、３３）がインデックスに格納される。これらの言葉はキーとして格納され、それにより、例えば、「林檎」及び「梨（pear）」のサーチを行うことができる。
【０００５】
索引付けの従来の手法は、いわゆるＢツリーインデックスを使用するものであった。１９７２年にR. Bayer及びE. McCreightによって発明されたＢツリーはなお、この目的で使用される主要なデータ構造である。しかしながら、Ｂツリーインデックスには主な欠点がある。例えば、データにアクセスする時間は、データ量に伴って対数的に増大する。データサイズが１桁増大すると、アクセス時間は概ね２倍になり、データサイズが２桁増大すると、アクセス時間は３倍になる等々である。更に、Ｂツリーインデックスは、いわゆる低基数基準の場合、クエリ性能を改善するのに役立たない。例えば、「男性（male）」、「女性（female）」、及び「未知（unknown）」という値を有する属性「性別（gender）」へのインデックス作成は、全てのレコードのスキャン及びフィルタリングと比較して性能を改善しない。最後に、多次元クエリ、すなわち、複数の基準／属性を含むクエリは、効率的に扱うことが難しく、その理由は、Ｂツリーインデックスを効率的に結合する（組み合わせる）ことができないためである。
【０００６】
M. Boehm et al.,“Efficient In-Memory Indexing with Generalized Prefix-Trees”, in: T. Haerder et al.(eds.), BTW. LNI, vol. 180, pp. 227-246, Kaiserslautern, Germany(2011)は、「トライ」又はトライデータ構造を使用することによってデータベースインデックスを格納し処理することを示唆している。トライとはツリーデータ構造であり、「基数木」又は「プレフィックス木」と呼ばれることもある。トライ（trie）という用語は「reTRIEval（検索）」という言葉に由来する。ノード内部にキーを格納する代わりに、トライのノードへのパスは、関連付けられたキーを定義し、ここで、ルートは空キーを示す。より具体的には、各ノードには、値（本明細書では「ノードの値」と呼ばれることもある）を親ノードからのポインタにより示し得るキー部分が関連付けられる。値は、可能な値の予め定義された英字から選択される。ルートノードからトライ内の別のノード、例えば、リーフノードへのパスは、ノードに関連付けられたキー（又は内部ノード、すなわち、リーフノードではないノードである場合、「キープレフィックス」）を定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものである。トライの時間複雑性は、トライ内に存在するキーの量に依存せず、キーの長さに依存する。
【０００７】
空間効率的なトライデータ構造
トライデータ構造を実施する一方法は、ノードをメモリに別個に格納することであり、各ノードは、ノードがリーフノードであるか否かを示すノードタイプ情報、その子ノードへのポインタの配列（少なくともノードがリーフノードではない場合）、及びリーフノードの場合、恐らくはペイロード、例えば、キーに関連付けられた値を含む。この手法を使用すると、ノードからノードへのトラバースは一定時間の動作であり、その理由は、各子ポインタが、各キー部分を表す配列エントリに対応するためである。しかしながら、少数のみの子ノードを有するノードの場合、対応する配列が多くの空エントリを含み格納するため、メモリ使用は非常に非効率的であり得る。これは、より大きな英字が使用される場合、特に当てはまり、その理由は、大量の子ポインタを格納する必要があるためである。
【０００８】
メモリ空間をより効率的に使用するために、空ポインタの格納を回避するトライデータ構造の実施が開発された。そのような解決策の本質は、可能な全てのポインタを含む配列の代わりに、非空ポインタのみのリストをそれぞれのキー部分値と共に格納することにある。この手法の欠点は、ノードからノードにトラバースするために、各親ノード内のリストをスキャンする必要があるか、又はリストがキー部分の値により順序付けられる場合、バイナリサーチを実行する必要があることである。加えて、キー部分の特定の値の特定のポインタを識別する必要があるため、キー部分の関連値も格納する必要があり、メモリ空間効率を下げる。
【０００９】
トライデータ構造をコンパクト形式で格納する他の方法も開発されている。例えば、Ph. Bagwell,“Fast And Space Efficient Trie Searches”, Technical Report, EPFL, Switzerland(2000)には、ビットマップに基づくトライデータ構造が開示されている。そのようなトライデータ構造はビットマップを使用して、親ノードの全ての非空ポインタを記す。特に、ビットマップ内の設定ビットは有効（非空）分岐を記す。各親ノードも１つ又は複数のポインタを含み、各ポインタには、ビットマップ内で設定されたビットが関連付けられ、各ポインタは親ノードの子ノードを指す。子ノードのキー部分の値は、子ノードを指すポインタに値が関連付けられた親ノードに含まれるビットマップ内の（設定された）ビットの値により決まる。
【００１０】
ポインタは所定の長さ又はサイズを有し、ビットがビットマップにおいて設定されるのと同順又は逆順に格納することができる。ビットマップにおいて設定されたビットに関連付けられたポインタのメモリアドレスは、ビットマップにおいて設定された最下位ビットの数に基づいて容易に計算することができる。各ポインタ、ひいては次の子ノードのこの特定は、単純なビット演算及び設定ビット数を特定するＣＴＰＯＰ（ポピュレーションカウント）演算を使用して、設定される最下位ビットの量を効率的に計算することができるため、高速である。例えば、そのようなポピュレーションカウント方法は、Javaプログラミング言語で利用可能であり、「Ｌｏｎｇ．ｂｉｔＣｏｕｎｔ（）」と呼ばれる。ＣＴＰＯＰ自体は、「ビットハック」を使用してかなり効率的に実施することができ、多くの近代のＣＰＵは実に、固有命令としてＣＴＰＯＰを提供している。
【００１１】
ビットマップは、有効分岐が関連付けられた英字値を示すため、格納する必要があるのは既存（非空）のポインタのみである。したがって、メモリ使用を低減することができる。他方、特定のポインタのアドレスは、ビットマップ内の設定ビットの中での関連ビットのアラン句に基づいて一定時間で容易に特定することができる。最後に、子ノードへのポインタに関連付けられたビットの値は、子ノードのキー部分値を効率的に表す。したがって、ビットマップに基づくトライデータ構造は、図４に示されるリストに基づくトライデータ構造と比較して、メモリ割り振りを取り扱い、トライを処理するより効率的な手法を提供する。
【００１２】
しかしながら、本発明者は、多くの用途状況で、メモリ空間の使用が非効率的であることを発見した。これは、トライが疎に存在し、及び／又は空間を無駄にする、それぞれ１つの子ポインタを有するノード連鎖に劣化する場合、特に当てはまる。したがって、データベースアプリケーション又は情報検索システムによって使用されるトライの格納に必要なメモリ空間を更に低減し、特に、トライをトラバースするのに必要な速度をあまり上げずに、トライの実施に必要なポインタ及び／又はビットマップの格納に必要なメモリ量を低減することが望ましい。
【００１３】
キー符号化
通常、従来技術で使用されるトライの英字の基数は、ユニコードのような大きな英字からの文字に対応できるようにするために、比較的大きく、例えば、２５６である。２５６個の異なる値を用いると、８ビット（２８＝２５６）、すなわち１バイトを符号化することができる。しかしながら、トライが上述したようにビットマップを使用する場合、ビットマップの幅は、英字の基数に伴って増大する。例えば、基数が２５６の英字は、２５６ビットのビットマップサイズを必要とする。そのような大きなビットマップは特に、トライが疎に存在する場合、空間非効率的であり得、その理由は、２５６ビットをあらゆるノードに割り振る必要があるが、それらの一部しか使用されないことがあるためである。更に、近代のコンピュータのレジスタのビット幅は通常、わずか６４ビットであるため、例えば、２５６ビットを有する大きなビットマップは、時間効率的に処理することができない。仮にトライが更に大きな英字の文字に適応するので、効率問題は更に大きくなる。したがって、従来技術において文字を空間効率的且つ時間効率的に格納することができる英字の基数は制限される。
【００１４】
更に、従来技術では、トライは、予め定義されたデータ型の格納のみに使用され、データ型は通常、数字又は文字のような原始的なデータ型に制限される。そのような使用は、トライに格納することができるキーに制約を課し、トライデータ構造をデータベース又は情報検索システムインデックスの格納に適さないようにする恐れがある。
【００１５】
したがって、本発明の更なる目的は、柔軟に使用することができるトライ及び／又は柔軟にトライを使用する方法を提供することである。実際に、本発明の目的は、汎用データベース又は情報検索システムインデックスとして使用することができるトライデータ構造及び汎用データベース又は情報検索システムインデックスとしてトライデータ構造を使用する方法を提供することである。更に、本発明の目的は、２つ以上のデータ項目を含むデータベースクエリを時間効率的に処理することができるようにデータベースインデックスのキーを格納するトライを提供することである。
【００１６】
クエリ実行
データベースで実行されるクエリは一般に、論理代数（例えば、ＳＱＬ）で表現される。それらの実行のために、クエリは物理代数：物理クエリ実行プラン（ＱＥＰ：physical query execution plan）に変換される必要がある。クエリは書き換えられ、最適化され、クエリ実行エンジン（ＱＥＥ）がデータベースに対する先行ステップにより生成されたＱＥＰを実行するようなＱＥＰが準備される。
【００１７】
処理のために、ＱＥＰは一般に、クエリ結果の生成を目的とした１組の関連演算子を含む。大半のデータベースはＱＥＰをツリーで表し、ツリーでは、ノードは演算子であり、リーフはデータソースであり、エッジは生産者−消費者形態での演算子間の関係である。
【００１８】
多くのデータベースエンジンは、ＱＥＥ内の反復子ベースの実行モデルに従い、このモデルでは、演算子は以下のメソッドを実施する：Ｏｐｅｎ（データの生成に向けて演算子を準備する）、Ｎｅｘｔ（演算子消費者の需要下で新しいデータユニットを生成する）、Ｃｌｏｓｅ（実行を終了させ、リソースを解放する）。ルート演算子から始まるこれらの演算の１つの呼び出しは、データソース（及びリーフ）に達するまで、演算子の子に伝搬する等々である。このようにして、制御は消費者から生産者に流れ落ち、データは、クエリ実行プラン演算子ツリー内で生産者から消費者まで上に流れる。そのような手法は、各演算子がグローバル知識を必要としないため、クリーンな設計及びカプセル化を提供する。
【００１９】
しかしながら、そのような実行モデルには深刻な欠点がある。まず第１に、各演算子はグローバル知識を有さないため、グローバルの視点から有益な最適化を適用することができない。加えて、クエリプランは静的であるため、クエリ実行中に適応的最適化を適用することは困難であることが分かり得る。その結果、良好なＱＥＰの作成には、複雑なアルゴリズムを含むクエリオプティマイザに強く依存する。そして最後に、反復子手法は、演算子呼び出し毎にたった１つのデータユニット、例えばレコードしか送出しない。この手法は、それら自体が小さな結果集合を返す大きなサブ結果集合を結合する演算子には非効率的である。
【００２０】
これらの欠点の１つの一例として、データベースに対して実行すべきクエリが、ＡがレコードＩＤの短いリスト、例えば（１，２，…，１０）を返すが、Ｂ及びＣが長いリスト、例えば（１，２，…，１０，０００）及び（２０，０００，…，５０，０００）を返す「Ａ  ｉｎｔｅｒｓｅｃｔ（Ｂ  ｕｎｉｏｎ  Ｃ）」等の表現である場合。クエリオプティマイザが予測機能を有さず、実行前にクエリを（Ａ  ｉｎｔｅｒｓｅｃｔ  Ｂ）ｕｎｉｏｎ（Ａ  ｉｎｔｅｒｓｅｃｔ  Ｃ）に書き換えない場合、クエリはかなり非効率的である。
【００２１】
したがって、論理積（ＡＮＤ）、論理和（ＯＲ）、及び否定論理積（ＡＮＤ  ＮＯＴ）等の演算を含むデータベースクエリ又は情報検索システムクエリをデータベース若しくは情報検索システムに格納された２つ以上の組のキー又はデータベース若しくは情報検索システムの入力若しくは結果キーの集合に対して実行する、より時間効率的な情報を有することが望ましい。
【００２２】
更に、従来技術によるデータベースの範囲クエリ性能は、インデックスのサイズ（データベースに含まれ、インデックスにより索引付けられるレコード数）に伴って低減する。したがって、インデックスサイズの増大に伴って上手くスケーリングされた、範囲クエリを実行するより時間効率的な方法を有することが望ましい。
【発明の概要】
【課題を解決するための手段】
【００２３】
これらの目的の１つ又は複数は、独立クレームの趣旨により達成される。好ましい実施形態は従属クレームの趣旨である。
【００２４】
本発明は、Ｂツリー及び導関数がなお主要戦略であるデータベースアプリケーションの索引付け解決策及び通常、逆インデックスが使用される情報検索アプリケーションの索引付け解決策を提供する。逆インデックスとは、言葉が、その言葉を含むドキュメントを列挙するインデックスである。トライはレベル毎に処理されるため、本発明は、階層トライ構造を利用して、遅延評価を可能にすることができる。したがって、本発明は、第１レベルのトライを連想配列として使用して、逆インデックスを実施することができ、ここで、言葉はトライ内に格納されたキーである。第２レベル（すなわち、連想配列のリーフノードとして）において、本発明はトライを集合として使用して、ドキュメントのリスト（すなわち、ＩＤの集合）を実施することができる。したがって、本発明では、Ｂツリー及び逆インデックスを１つの汎用解決策で置換することができ、したがって、この１つの汎用解決策を「コンフルエンスインデックス（confluence index）」と呼称することができる。
【００２５】
本発明のインデックスデータ構造及びクエリ処理モデルは、ビット単位のトライに基づき、従来技術によるインデックス構造に取って代わる潜在性を有する：データ構造は頻繁に更新することができ、低基数及び高基数を有するキーに対して機能し、圧縮／圧縮解除（データ構造はコンパクトであり、又は幾つかの場合、簡潔でさえある）なしで空間効率的である。加えて、トライに基づくため、キー演算による挿入、更新、削除、及びクエリにＯ（｜Ｍ｜）一定時間複雑性を継承する（｜Ｍ｜はキーの長さ）。これは、ツリーに基づく手法にとって通常のＯ（ｌｏｇｎ）複雑性よりもよい（ｎはインデックス内のキーの数である）。そして、本発明のインデックスデータ構造及びクエリ処理モデルは、データベースの充填から独立したクエリ時間を提供することができる。好ましい実施形態では、クエリ処理での設定演算子の結果は、トライとして「見える」。これにより、機能構成及び遅延評価が可能になる。副次的影響として、物理代数は論理代数にそのまま対応し、クエリオプティマイザで通常行われる所与のクエリに適した物理的実行プランを作成するタスクを簡易化する。本発明の第１の実施形態は、電子データベースアプリケーション又は情報検索システムで使用されるトライであり、トライは１つ又は複数のノードを含み、２つ以上の子ノードを有する、トライに含まれる親ノード、好ましくは各親ノードは、ビットマップ及び１つ又は複数のポインタを含み、各ポインタにはビットマップにおいて設定されたビットが関連付けられ、各ポインタは親ノードの子ノードを指す。トライは、１つのみの子ノードを有する、トライに含まれる親ノード、好ましくは、親ノードは、子ノードへのポインタを含まず、及び／又は子ノードは、メモリにおいて、親ノードに相対して予め定義された位置に格納されることを特徴とする。
【００２６】
第２の実施形態によれば、第１の実施形態において、１つのみの子ノードを有する親ノードの子ノードは、メモリにおいて、親ノードの直後の位置に格納される。
【００２７】
第３の実施形態によれば、第１又は第２の実施形態において、ノード、好ましくは各子ノードには、キー部分が関連付けられ、トライ内のルートノードから別のノード、特にリーフノードへのパスがキーを定義し、キーは、パス内のノードに関連付けられたキー部分を連結したものである。
【００２８】
末端最適化
本発明の第４の実施形態は、電子データベースアプリケーション又は情報検索システムで使用されるトライであり、トライは１つ又は複数のノードを含み、２つ以上の子ノードを有する、トライに含まれる親ノード、好ましくは少なくとも各親ノードはビットマップを含み、ノード、好ましくは各子ノードには、キー部分が関連付けられ、親が２つ以上の子ノードを有する、子ノード、好ましくは少なくとも各子ノードのキー部分の値は、子ノードが関連付けられたビットを有する親ノードに含まれるビットマップ内の（設定）ビットの値によって決まる。トライは、１つのみの子ノードを有し、全ての子孫ノードが多くとも１つの子ノードを有するノード、好ましくは各ノードは、末端分岐ノードと記され、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられたキー部分の値は、子孫ノードの親ノードに含まれるビットマップ内の（設定）ビットの値によって決まらないことを特徴とする。
【００２９】
第５の実施形態によれば、第４の実施形態において、末端分岐ノードは２つ以上の子孫ノードを有する。
【００３０】
第６の実施形態によれば、第４又は第５の実施形態において、末端分岐ノードの親は２つ以上の子ノードを有する。
【００３１】
第７の実施形態によれば、第４〜第６の実施形態において、末端分岐ノードとしての記しは、ビットが設定されていないビットマップである。
【００３２】
第８の実施形態によれば、第７の実施形態において、末端分岐ノードのビットマップは、２つ以上の子ノードを有する親ノードに含まれるビットマップと同じ長さ又はフォーマットを有する。
【００３３】
第９の実施形態によれば、第４〜第８の実施形態のいずれか１つにおいて、トライに含まれる末端分岐ノード、好ましくは各末端分岐ノード及び／又は末端分岐ノードの子孫ノード、好ましくは各子孫ノードは、子ノードへのポインタを含まず、及び／又は子ノードは、メモリにおいて、親ノードに相対して予め定義された位置に、好ましくは、メモリにおいて親ノードの直後の位置に格納される。
【００３４】
第１０の実施形態によれば、第４〜第９の実施形態のいずれか１つにおいて、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましく各子孫ノードに関連付けられたキー部分の値は、子孫ノードの親ノードに含まれる。
【００３５】
第１１の実施形態によれば、第４〜第１０の実施形態のいずれか１つにおいて、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは全ての子孫ノードに関連付けられたキー部分の値は、末端分岐ノード後に連続して格納される。
【００３６】
第１２の実施形態によれば、第４〜第１１の実施形態のいずれか１つにおいて、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられたキー部分の値の符号化は、２つ以上の子ノードを有する親ノードに含まれるビットマップよりも、必要とするメモリ空間が少ない。
【００３７】
第１３の実施形態によれば、第４〜第１２の実施形態のいずれか１つにおいて、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられたキー部分の値は、二進数として符号化される。
【００３８】
第１４の実施形態によれば、第４〜第１３の実施形態のいずれか１つにおいて、２つ以上の子ノードを有する親ノード、好ましくは各親ノードに含まれるビットマップは、３２ビット、６４ビット、１２８ビット、又は２５６ビットを有し、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられたキー部分は、５ビット、６ビット、７ビット、又は８ビットによりそれぞれ符号化される。
【００３９】
第１５の実施形態によれば、第４〜第１４の実施形態のいずれか１つにおいて、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられたキー部分の値は、整数値として符号化される。
【００４０】
第１６の実施形態によれば、第４〜第１４の実施形態のいずれか１つにおいて、親ノードである末端分岐ノードの子孫ノード、好ましくは、親ノードである各子孫ノードは、設定ビットが子ノードに関連付けられたキー部分の値を決めるビットマップを含まない。
【００４１】
第１７の実施形態によれば、第４〜第１６の実施形態のいずれか１つにおいて、２つ以上の子ノードを有する、トライに含まれる親ノード、好ましくは、少なくとも各親ノードは、１つ又は複数のポインタを含み、各ポインタには、親ノードに含まれるビットマップに設定されたビットが関連付けられ、各ポインタは親ノードの子ノードを指す。
【００４２】
第１８の実施形態によれば、第４〜第１７の実施形態のいずれか１つにおいて、トライは第１又は第２の実施形態によるトライである。
【００４３】
ビットマップ圧縮
本発明の第１９の実施形態は、電子データベースアプリケーション又は情報検索システムで使用されるトライであり、トライは１つ又は複数のノードを含み、２つ以上の子ノードを有するノード、好ましくは少なくとも各親ノードは、論理ビットマップの形態のビットマップ及び幾つかのポインタを含み、各ポインタには論理ビットマップにおいて設定されたビットが関連付けられ、各ポインタはノードの子ノードを指す。トライは、論理ビットマップが複数のセクションに分割され、ヘッダビットマップ及び幾つかのコンテンツビットマップにより符号化され、各セクションには、ヘッダビットマップ内のビットが関連付けられ、１つ又は複数のビットが設定された論理ビットマップの各セクションについて、ヘッダビットマップにおいて、セクションに関連付けられたビットは設定され、セクションはコンテンツビットマップとして格納されることを特徴とする。
【００４４】
第２０の実施形態によれば、第１９の実施形態において、ビットが設定されていない論理ビットマップの各セクションについて、ヘッダビットマップにおいて、セクションに関連付けられたビットは設定されず、セクションはコンテンツビットマップとして格納されない。
【００４５】
第２１の実施形態によれば、第１９又は第２０の実施形態のいずれかにおいて、セクションのそれぞれはコヒーレントである。
【００４６】
第２２の実施形態によれば、第１９〜第２１の実施形態のいずれかにおいて、全てのセクションは同じサイズを有する。
【００４７】
第２３の実施形態によれば、第２２の実施形態において、セクションのサイズは１バイトである。
【００４８】
第２４の実施形態によれば、第１９〜第２３の実施形態のいずれか１つにおいて、コンテンツビットマップとして記憶されるセクションの量は、ヘッダビットマップにおいて設定されたビット数に等しい。
【００４９】
第２５の実施形態によれば、第１９〜第２４の実施形態のいずれか１つにおいて、ヘッダビットマップのサイズは１バイトである。
【００５０】
第２６の実施形態によれば、第１９〜第２５の実施形態のいずれか１つにおいて、コンテンツビットマップは、メモリにおいてヘッダビットマップに相対して予め定義された位置に格納される。
【００５１】
第２７の実施形態によれば、第１９〜第２６の実施形態のいずれか１つにおいて、論理ビットマップのコンテンツビットマップは、配列、リスト、又は連続した物理若しくは仮想メモリロケーションに格納される。
【００５２】
第２８の実施形態によれば、第１９〜第２７の実施形態のいずれか１つにおいて、コンテンツビットマップは、コンテンツビットマップのセクションに関連付けられた設定ビットがヘッダビットマップに配置される順と同順又は逆順で格納される。
【００５３】
第２９の実施形態によれば、第１９〜第２８の実施形態のいずれか１つにおいて、論理ビットマップの全てのコンテンツビットマップ内のあるコンテンツビットマップのランクは、ヘッダビットマップ内の全ての設定ビット内の、コンテンツビットマップのセクションに関連付けられた設定ビットのランクに対応する。
【００５４】
第３０の実施形態によれば、第１９〜第２９の実施形態のいずれか１つにおいて、ノードに含まれるポインタ、好ましくはノードの各ポインタ及び／又はリーフノードではない各ノードのポインタは、第１９〜第２９の実施形態のいずれか１つにおける論理ビットマップに定義された符号化方法で符号化される。
【００５５】
第３１の実施形態によれば、第１９〜第３０の実施形態のいずれか１つにおいて、トライは第１〜第１８の実施形態のいずれか１つにおけるトライである。
【００５６】
第３２の実施形態によれば、第１９〜第３１の実施形態のいずれか１つにおいて、ノード、好ましくは各子ノードにはキー部分が関連付けられ、ルートノードからトライ内の別のノード、特にリーフノードへのパスはキーを定義し、キーは、パス内のノードに関連付けられたキー部分を連結したものである。
【００５７】
制御情報を含むキー
本発明の第３３の実施形態は、電子データベースアプリケーション又は情報検索システムで使用されるトライであり、トライは１つ又は複数のノードを含み、ノード、好ましく各子ノードにはキー部分が関連付けられ、ルートノードからトライ内の別のノード、特にリーフノードへのパスはキーを定義し、キーは、パス内のノードに関連付けられたキー部分を連結したものである。トライは、キーが制御情報及びコンテンツ情報を含むことを特徴とする。
【００５８】
第３４の実施形態によれば、第３３の実施形態において、キーは、コンテンツ情報を含む１つ又は複数のキー部を含み、キー部のそれぞれについて、制御情報は、キー部に含まれるコンテンツ情報のデータ型を指定するデータ型情報要素を含む。
【００５９】
第３５の実施形態によれば、第３４の実施形態において、キー部、好ましくは各キー部は、キー部に含まれるコンテンツ情報のデータ型を指定するデータ型情報要素を含む。
【００６０】
第３６の実施形態によれば、第３５の実施形態において、データ型情報要素は、好ましくはコンテンツ情報要素前に、コンテンツ情報要素により配置される。
【００６１】
第３７の実施形態によれば、第３４の実施形態において、データ型情報要素は一緒に配置され、好ましくは、データ型が指定されるコンテンツ情報要素と同順又は逆順で配置される。
【００６２】
第３８の実施形態によれば、第３７の実施形態において、制御情報は、キーにおいてコンテンツ情報前に配置される。
【００６３】
第３９の実施形態によれば、第３４〜第３８の実施形態のいずれか１つにおいて、キーは、異なるデータ型のコンテンツ情報を含む２つ以上のキー部を含む。
【００６４】
第４０の実施形態によれば、第３４〜第３９の実施形態のいずれか１つにおいて、データ型の少なくとも１つは、固定サイズのデータ型である。
【００６５】
第４１の実施形態によれば、第４０の実施形態において、固定サイズのデータ型は整数、長整数、倍精度浮動小数点、又は時刻／日付けプリミティブである。
【００６６】
第４２の実施形態によれば、第３４〜第４１の実施形態のいずれか１つにおいて、データ型の少なくとも１つは、可変サイズのデータ型である。
【００６７】
第４３の実施形態によれば、第４２の実施形態において、可変サイズのデータ型は、文字列、好ましくはユニコード文字列、又は可変精度整数である。
【００６８】
第４４の実施形態によれば、第３４〜第４３の実施形態のいずれか１つにおいて、キー部の情報は、２つ以上のキー部分に含まれる。
【００６９】
第４５の実施形態によれば、第３４〜第４４の実施形態のいずれか１つにおいて、キー部に含まれるコンテンツ情報のデータ型は、可変サイズのデータ型であり、コンテンツ情報要素の終わりは、特定のシンボルにより又はキー部を含むキー部分の特定の１つ内の特定のビットにより記される。
【００７０】
第４６の実施形態によれば、第３４〜第４５の実施形態のいずれか１つにおいて、制御情報は、最後のキー部を識別する情報を含む。
【００７１】
第４７の実施形態によれば、第３３〜第４６の実施形態のいずれか１つにおいて、制御情報は、トライが動的集合の格納に使用されるか、それとも連想配列の格納に使用されるかについての情報を含む。
【００７２】
第４８の実施形態によれば、第３３〜第４７の実施形態のいずれか１つにおいて、トライは、第１〜第３２のいずれか１つによるトライである。
【００７３】
第４９の実施形態によれば、第３３〜第４８の実施形態のいずれか１つにおいて、２つ以上の子ノードを有するノード、好ましくは少なくとも各親ノードは、ビットマップ及び幾つかのポインタを含み、各ポインタには、ビットマップにおいて設定されたビットが関連付けられ、各ポインタはノードの子ノードを指す。
【００７４】
インタリーブ多項目キー
本発明の第５０の実施形態は、電子データベースアプリケーション又は情報検索システムで使用されるトライであり、トライは１つ又は複数のノードを含み、ノード、好ましくは各子ノードにはキー部分が関連付けられ、トライ内のルートノードから別のノード、特にリーフノードへのパスが、ノードが関連付けられたキーを定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものである。トライは、２つ以上のデータ項目はキーにおいて符号化され、データ項目の最後における１つ又は２つ、好ましくは各データ項目は、２つ以上の構成要素からなり、キーは２つ以上の連続セクションを含み、セクションの少なくとも１つ又は２つ、好ましくは各セクションは、キーに符号化されたデータ項目の２つ以上の構成要素を含むことを特徴とする。
【００７５】
第５１の実施形態によれば、第５０の実施形態において、キーのセクション、好ましくは各セクションは、キーに符号化されたデータ項目のそれぞれから少なくとも及び／又は多くとも１つの構成要素を含む。
【００７６】
第５２の実施形態によれば、第５０又は第５１の実施形態のいずれか１つにおいて、キーの２つ以上、好ましくは全てのセクションについて、異なるデータ項目に属する構成要素は、セクション内で同じ順序で並べられる。
【００７７】
第５３の実施形態によれば、第５０〜第５２の実施形態のいずれか１つにおいて、データ項目の構成要素を含むセクションの順序は、データ項目内の構成要素の順序に対応する。
【００７８】
第５４の実施形態によれば、第５０〜第５３の実施形態のいずれか１つにおいて、子ノード、好ましくは子ノードのそれぞれに関連付けられたキー部分は、データ項目の構成要素の一部に対応する。
【００７９】
第５５の実施形態によれば、第５０〜第５３の実施形態のいずれか１つにおいて、子ノード、好ましくは子ノードのそれぞれに関連付けられたキー部分は、データ項目の１つの構成要素に対応し、及び／又はデータ項目、好ましくは各データ項目の構成要素、好ましくは各構成要素は、トライの１つの子ノードに関連付けられたキー部分に対応する。
【００８０】
第５６の実施形態によれば、第５０〜第５３の実施形態のいずれか１つにおいて、子ノード、好ましくは子ノードのそれぞれに関連付けられたキー部分は、データ項目の２つ以上の構成要素に対応する。
【００８１】
第５７の実施形態によれば、第５０〜第５６の実施形態のいずれか１つにおいて、キーのデータ項目の２つ以上、好ましくは全ては、同じ数の構成要素を有する。
【００８２】
データ項目及びその構成要素のタイプ
第５８の実施形態によれば、第５０〜第５７の実施形態のいずれか１つにおいて、２つ以上のデータ項目はジオロケーションデータを表す。
【００８３】
第５９の実施形態によれば、第５０〜第５８の実施形態のいずれか１つにおいて、データ項目は、経度、緯度、文字列、又はこれらの２つ以上の組合せを表す。
【００８４】
第６０の実施形態によれば、第５０〜第５９の実施形態のいずれか１つにおいて、データ項目の構成要素は、データ項目の二進符号化のビット群である。
【００８５】
第６１の実施形態によれば、第６０の実施形態において、ビット群は６ビットを含む。
【００８６】
第６２の実施形態によれば、第５０〜第６１の実施形態のいずれか１つにおいて、データ項目は数である。
【００８７】
第６３の実施形態によれば、第６２の実施形態において、データ項目は整数、長整数、又は倍長整数である。
【００８８】
第６４の実施形態によれば、第６２又は第６３の実施形態のいずれか１つにおいて、データ項目は６４ビット整数である。
【００８９】
第６５の実施形態によれば、第６２〜第６４の実施形態のいずれか１つにおいて、データ項目の構成要素は数字である。
【００９０】
第６６の実施形態によれば、第６５の実施形態において、数字は予め定義された基数、好ましくは６４を有する。
【００９１】
第６７の実施形態によれば、第５０〜第６６の実施形態のいずれか１つにおいて、データ項目は文字列である。
【００９２】
第６８の実施形態によれば、第６７の実施形態において、データ項目の構成要素は１文字である。
【００９３】
第６９の実施形態によれば、第５０〜第６８の実施形態のいずれか１つにおいて、データ項目はバイトの配列である。
【００９４】
第７０の実施形態によれば、第５０〜第６９の実施形態のいずれか１つにおいて、トライは第１〜第４９の実施形態のいずれか１つにおけるトライである。
【００９５】
第７１の実施形態によれば、第７０の実施形態において、第３４の実施形態に従属する場合、データ項目は、キー部又はキー部に含まれるコンテンツ情報に対応する。
【００９６】
第７２の実施形態によれば、第３３〜第７１の実施形態のいずれか１つにおいて、２つ以上の子ノードを有するノード、好ましくは少なくとも各親ノードは、ビットマップ及び幾つかのポインタを含み、各ポインタにはビットマップにおいて設定されたビットが関連付けられ、各ポインタはノードの子ノードを指す。
【００９７】
一般的なトライ特徴
ビットマップ及びメモリの詳細
第７３の実施形態によれば、第１〜３２、第４９、又は第７２の実施形態のいずれか１つにおいて、ビットマップは、予め定義されたサイズの整数としてメモリに記憶される。
【００９８】
第７４の実施形態によれば、第１〜第３２、第４９、第７２、又は第７３の実施形態のいずれか１つにおいて、ビットマップのサイズは３２ビット、６４ビット、１２８ビット、又は２５６ビットである。
【００９９】
第７５の実施形態によれば、第１〜第３２、第４９、又は第７２〜第７４の実施形態のいずれか１つにおいて、トライは、標的コンピュータシステムで格納され処理されるのに適し、ビットマップのサイズは、標的コンピュータシステムのＣＰＵのレジスタ、システムバス、データバス、及び／又はアドレスバスのビット幅に等しい。
【０１００】
第７６の実施形態によれば、第１〜第３２、第４９、又は第７２〜第７５の実施形態のいずれか１つにおいて、トライのビットマップ及び／又はポインタ及び／又はノードは、配列、好ましくは長整数若しくはバイトのインアンド配列、リスト、又は連続した物理若しくは仮想メモリロケーションに格納される。
【０１０１】
第７７の実施形態によれば、第１〜第１６、第２６、第２７、又は第７６の実施形態のいずれか１つにおいて、メモリは、物理若しくは仮想メモリ、好ましくは連続メモリであり、又は物理若しくは仮想メモリ、好ましくは連続メモリを含む。
【０１０２】
ポインタ
第７８の実施形態によれば、第１〜第３２、第４９、又は第７２〜第７７の実施形態のいずれか１つにおいて、２つ以上の子ノードを有する親ノード、好ましくは少なくとも各親ノードに含まれるポインタの量は、前記親ノードに含まれるビットマップにおいて設定されたビット量に等しい。
【０１０３】
第７９の実施形態によれば、第１〜第３２、第４９、又は第７２〜第７８の実施形態のいずれか１つにおいて、親ノードの全てのポインタ内のあるポインタのランクは、親ノードのビットマップ内の全ての設定ビット内のそのポイントに関連付けられた設定ビットのランクに対応する。
【０１０４】
第８０の実施形態によれば、第１〜第３２、第４９、又は第７２〜第７９の実施形態のいずれか１つにおいて、ポインタは、ビットがビットマップにおいて設定されるのと同順又は逆順に格納される。
【０１０５】
第８１の実施形態によれば、第１〜第３３、第４９、又は第７２〜第８０の実施形態のいずれか１つにおいて、親ノードに含まれるポインタは、子ノードに含まれるビットマップを指す。
【０１０６】
第８２の実施形態によれば、第１〜第３３、第４９、又は第７２〜第８１の実施形態のいずれか１つにおいて、トライのリーフノード、好ましくは各リーフノードに含まれるポインタの数はゼロである。
【０１０７】
キー部分
第８３の実施形態によれば、第３、又は第３３〜第８２の実施形態のいずれか１つにおいて、親が２つ以上の子ノードを有する子ノード、好ましくは少なくとも各子ノードのキー部分の値は、ビットが子ノードに関連付けられた親ノードに含まれるビットマップ内の（設定）ビットの値によって決まる。
【０１０８】
第８４の実施形態によれば、第４〜第１８又は第８３の実施形態のいずれか１つにおいて、キー部分に利用可能な異なる値の最大量は、ビットマップのサイズによって定義される。
【０１０９】
第８５の実施形態によれば、第４〜第１８、第８３、又は第８４の実施形態のいずれか１つにおいて、ビットマップのサイズは、キー部分に可能な英字を定義する。
【０１１０】
第８６の実施形態によれば、第３又は第３２〜第８５の実施形態のいずれか１つにおいて、トライ内の各キー部分は、同じ予め定義されたサイズの値を格納可能である。
【０１１１】
第８７の実施形態によれば、第８６の実施形態において、予め定義されるサイズは、５ビット値、６ビット値、７ビット値、又は８ビット値に対応する。
【０１１２】
効率的な範囲クエリのキー符号化
第８８の実施形態によれば、第１〜第８７の実施形態のいずれか１つにおいて、データ項目の値、好ましくは全てのデータ項目の値の符号化は、データ項目のデータ型を符号なし整数を本質的な特徴とするオフセット二進数表現に変換することによって得られる。
【０１１３】
第８９の実施形態によれば、第８８の実施形態において、整数は長整数である。
【０１１４】
第９０の実施形態によれば、第８８又は第８９の実施形態のいずれか１つにおいて、データ項目のデータ型が浮動小数点数である場合、符号化は、データ項目のデータ型をオフセット二進数表現に変換することによって得られる。
【０１１５】
第９１の実施形態によれば、第８８〜第９０の実施形態のいずれか１つにおいて、データ項目のデータ型が２の補数の符号付き整数である場合、符号化は、データ項目のデータ型をオフセット二進数表現に変換することによって得られる。
【０１１６】
他
第９２の実施形態によれば、第１〜第９１の実施形態のいずれか１つにおいて、トライは、動的集合又は連想配列を格納する。
【０１１７】
トライへのブール演算
本発明の第９３の実施形態は、電子データベース又は情報検索システムからデータを検索する方法であり、本方法は、２つ以上の入力トライを取得することであって、各入力トライは、電子データベース若しくは情報検索システムに記憶されたキーの集合又は電子データベースクエリ若しくは情報検索システムクエリの結果キーを格納する、取得することと、論理演算を使用して入力トライを結合して、結果トライのノードに関連付けられたキーの集合を取得することと、出力として、結果トライのノードに関連付けられたキーの集合及び／又は他のデータ項目（例えば、ドキュメント識別子）又は結果キーのノードに関連付けられたキーのサブセット及び／又は他のデータ項目、特に、結果トライのリーフに関連付けられたキー及び／又は他のデータ項目又は結果トライのノードに関連付けられたキーから導出されたキー若しくは値の集合を提供することを含み、
−トライは１つ又は複数のノードを含み、各子ノードにはキー部分が関連付けられ、ルートノードからトライ内の別のノードへのパスは、ノードに関連付けられたキーを定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものであり、
−論理演算が差分である場合、結果トライの親ノードは、第１の入力トライの親ノードであり、結果トライの親ノードのリーフは、論理演算を使用して、第１の入力トライ内の対応する親ノードの子ノードの集合と、他の入力トライ内の任意の対応する親ノードの子ノードの集合とを結合したものであり、
−論理演算が差分ではない場合、結果トライ内の各ノードの子ノードの集合は、論理演算を使用して、入力トライ内の対応するノードの子ノードの集合を結合したものであり、
−異なるトライのノードに関連付けられたキーが同一である場合、異なるトライの２つ以上のノードは互いに対応する。
【０１１８】
第９４の実施形態によれば、第９３の実施形態において、出力として提供されたキーの集合は、トライで提供される。
【０１１９】
第９５の実施形態によれば、第９３の実施形態において、出力として提供されたキーの集合は、カーソル又は反復子により提供される。
【０１２０】
結合ステップ
第９６の実施形態によれば、第９３〜第９５の実施形態のいずれか１つにおいて、入力トライを結合するステップは、結果トライのルートノードに対して結合関数を実行することを含み、結果トライの入力ノードに対して結合関数を実行することは、論理演算を使用して、結果トライの入力ノードに対応する入力トライのノードの子ノードの集合を結合することにより、結果トライの入力ノードの子ノードの集合を特定することと、結果トライの入力ノードに特定された子ノードのそれぞれに対して結合関数を実行することとを含む。
【０１２１】
第９７の実施形態によれば、第９３〜第９６の実施形態のいずれか１つにおいて、入力トライを結合するステップは、縦型トラバーサル、横型トラバーサル、又はそれらの組合せを使用して実行される。
【０１２２】
第９８の実施形態によれば、第９７の実施形態において、縦型トラバーサルで入力トライを結合するステップを実行することは、入力ノードの子ノードの１つの結合関数を実行することと、その子ノードによって形成されるサブトライをトラバースしてから、その子ノードの次の兄弟ノードに対して結合関数を実行することとを含む。
【０１２３】
第９９の実施形態によれば、第９７又は第９８の実施形態のいずれか１つにおいて、横型トラバーサルで入力トライを結合するステップを実行することは、結果トライの入力ノードに特定された子ノードのそれぞれに対して結合関数を実行することと、結果トライの入力ノードに対して特定された子ノードのそれぞれの子ノードの集合を特定してから、結果トライの入力ノードの任意の孫ノードに対して結合関数を実行することとを含む。
【０１２４】
ビットマップ
第１００の実施形態によれば、第９３〜第９９の実施形態のいずれか１つにおいて、入力トライにおけるノード、好ましくは入力トライ内の少なくとも全ての親ノードはビットマップを含む。
【０１２５】
第１０１の実施形態によれば、第１００の実施形態において、トライ内の子ノードのキー部分の値は、ビットが子ノードに関連付けられた子ノードの親ノードに含まれるビットマップ内の（設定）ビットの値によって決まる。
【０１２６】
第１０２の実施形態によれば、第１００又は第１０１の実施形態のいずれか１つにおいて、論理演算を使用した入力トライの子ノードの結合は、論理演算を使用して入力トライの子ノードのそれぞれのビットマップを結合することを含む。
【０１２７】
第１０３の実施形態によれば、第１０２の実施形態において、ビットマップを結合することは、結合ビットマップを得ることを含み、結合の結果を特定するステップは、結合ビットマップに基づいて実行される。
【０１２８】
論理演算
第１０４の実施形態によれば、第９３〜第１０３の実施形態のいずれか１つにおいて、論理演算は論理積、論理和、差分、又は排他的論理和である。
【０１２９】
第１０５の実施形態によれば、第１０４の実施形態において、論理演算を使用することは、ＡＮＤブール演算子、ＯＲブール演算子、又はＸＯＲブール演算子を使用することを含む。
【０１３０】
第１０６の実施形態によれば、第１００〜第１０３、又は第１０５の実施形態のいずれか１つにおいて、論理演算を使用することは、ビット単位ＡＮＤブール演算子、ビット単位ＯＲブール演算子、ビット単位ＡＮＤ  ＮＯＴブール演算子、又はビット単位ＸＯＲブール演算子を使用してノードのビットマップを結合することを含む。
【０１３１】
ブールトライ演算の結合
第１０７の実施形態によれば、第９３〜第１０６の実施形態のいずれか１つにおいて、入力トライの１つ又は複数は、同じ又は異なる論理演算を使用して、本明細書に記載されるデータベースクエリを実行する方法の出力である。
【０１３２】
仮想トライ
第１０８の実施形態によれば、第９３〜第１０６の実施形態のいずれか１つにおいて、入力トライの１つ又は複数は、入力トライを結合する演算中に動的に生成される仮想トライである。
【０１３３】
第１０９の実施形態によれば、第１０８の実施形態において、少なくとも、好ましくは多くとも、論理演算を使用して入力トライを結合するのに必要とされる仮想トライの部分が動的に生成される。
【０１３４】
範囲クエリ
本発明の第１１０の実施形態は、電子データベース若しくは情報検索システムに格納されたキーの集合又は電子データベースクエリ若しくは情報システムクエリの結果キーの集合に対して範囲クエリを実行することにより、電子データベース又は情報検索システムからデータを検索する方法であり、１つ又は複数の範囲の定義を取得するステップと、第９３〜第１００の実施形態のいずれか１つにおける電子データベース又は情報検索システムからデータを検索する方法を実行するステップとを含み、１つの入力トライは、１つ又は複数の範囲についてサーチすべきキーの集合又は結果キーの集合を格納する入力集合トライであり、別の入力トライは、定義が得られた１つ又は複数の範囲に含まれる全ての値を格納する範囲トライであり、論理演算は論理積である。
【０１３５】
第１１１の実施形態によれば、第１１０の実施形態において、範囲は、特定のデータ型の第１の値と第２の値との間の全ての対を含む離散した順序付き値の集合である。
【０１３６】
第１１２の実施形態によれば、第１１１の実施形態において、範囲は第１及び／又は第２の値を含む。
【０１３７】
第１１３の実施形態によれば、第１１０〜第１１２の実施形態のいずれか１つにおいて、範囲トライは、第１０８又は１０９の実施形態のいずれか１つにおいて定義される仮想トライである。
【０１３８】
１項目入力集合トライ
第１１４の実施形態によれば、第１１０〜第１１２の実施形態のいずれか１つにおいて、入力集合トライのリーフに関連付けられたキーは、特定のデータ型の１つのデータ項目を符号化する。
【０１３９】
第１１５の実施形態によれば、第１１４の実施形態において、１つ又は複数の範囲の定義は、１つのデータ項目の１つ又は複数の範囲の定義を含む。
【０１４０】
多項目入力集合トライ
第１１６の実施形態によれば、第１１０〜第１１３の実施形態のいずれか１つにおいて、入力集合トライのリーフに関連付けられたキーは、特定のデータ型の２つ以上のデータ項目を符号化する。
【０１４１】
第１１７の実施形態によれば、第１１６の実施形態において、１つ又は複数の範囲の定義は、データ項目の１つ又は複数の１つ又は複数の範囲の定義を含む。
【０１４２】
１項目範囲トライからの多項目範囲トライの取得
第１１８の実施形態によれば、第１１６又は第１１７の実施形態において、範囲トライは、入力集合トライのリーフに関連付けられたキーにより符号化されるデータ項目のそれぞれの１項目範囲トライを結合することによって得られる多項目範囲トライであり、データ項目の１項目範囲トライは、データ項目の１つ又は複数の範囲に含まれる全ての値を格納する。
【０１４３】
第１１９の実施形態によれば、第１１８の実施形態において、１項目範囲トライの結合は、多項目範囲トライとの入力集合トライの結合を実施する関数内で実行される。
【０１４４】
第１２０の実施形態によれば、第１１８の実施形態において、１項目範囲トライの結合は、多項目範囲トライとの入力集合トライの結合を実施する関数への入力として、多項目範囲トライを提供する関数によって実行される。
【０１４５】
第１２１の実施形態によれば、第１１８〜第１２０の実施形態のいずれか１つにおいて、１項目範囲トライは、第１０８又は第１０９の実施形態において定義される仮想範囲トライである。
【０１４６】
第１２２の実施形態によれば、第１１８〜第１２１の実施形態のいずれか１つにおいて、範囲の定義が得られない各データ項目の１項目範囲トライは、データ項目の可能な値の全範囲を格納する。
【０１４７】
第１２３の実施形態によれば、第１１８〜第１２２の実施形態のいずれか１つにおいて、多項目範囲トライは、１項目範囲トライに格納されたデータ項目の値の全ての組合せを格納する。
【０１４８】
範囲トライの構造
第１２４の実施形態によれば、第１０９〜第１２３の実施形態のいずれか１つにおいて、範囲トライは、入力集合トライと同じ構造又はフォーマットを有する。
【０１４９】
第１２５の実施形態によれば、第１２４の実施形態において、範囲トライのリーフに関連付けられたキーは、入力集合トライのリーフに関連付けられたキーと同じデータ型のデータ項目を符号化する。
【０１５０】
第１２６の実施形態によれば、第１２４又は第１２５の実施形態のいずれか１つにおいて、範囲トライにおいて、特定のデータ型のデータ項目又はそのようなデータ項目の構成要素は、入力集合トライ内の対応するデータ項目又はデータ項目の構成要素と同じレベルのノードに符号化される。
【０１５１】
範囲クエリの出力
第１２７の実施形態によれば、第１０９〜第１２６の実施形態のいずれか１つにおいて、方法は、入力集合トライのリーフに関連付けられたキーの集合及び／又は他のデータ項目を出力として提供する。
【０１５２】
第１２８の実施形態によれば、第１１６〜第１２６の実施形態のいずれか１つにおいて、方法は、入力集合トライのリーフに関連付けられたキーによって符号化されたデータ項目のサブセットを符号化する縮小項目キーの集合を出力として提供する。
【０１５３】
第１２９の実施形態によれば、第１２８の実施形態において、範囲トライとの入力集合トライの結合の結果として、縮小項目キーに符号化されないデータ項目に関連する入力集合トライの異なる分岐から得られる縮小項目キーの集合は、出力を提供する前、マージされる。
【０１５４】
第１３０の実施形態によれば、第１２８又は第１２９の実施形態のいずれか１つにおいて、範囲トライとの入力集合トライの結合の結果として得られる縮小項目キーの集合は、出力を提供する前、新たに作成されたトライに書き込まれ、それにより、出力を提供する前、複製キーをなくす。
【０１５５】
ファジーサーチ
本発明の第１３１の実施形態は、近似文字列照合を実行することにより電子データベース又は情報検索システムからデータを検索する方法であり、方法は、サーチ文字列を取得するステップと、サーチ文字列及び／又はサーチ文字列の変形を含む近似文字列の集合を格納する一致トライを構築するステップと、論理積演算を使用して、一致トライを、電子データベース又は情報検索システムに格納された文字列の集合を格納するストレージトライと結合して、結果トライを取得するステップと、出力として、結果トライのノードの結果集合に関連付けられた文字列及び／又は他のデータ項目を提供するステップを含み、トライは１つ又は複数のノードを含み、各子ノードにはキー部分が関連付けられ、ルートノードからトライ内の別のノードへのパスは、ノードに関連付けられたキーを定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものである。
【０１５６】
第１３２の実施形態によれば、第１３１の実施形態において、一致トライ内の１つ又は複数の子ノードは、２つ以上の親ノードを有する。
【０１５７】
第１３３の実施形態によれば、第１３１又は第１３２の実施形態のいずれか１つにおいて、ストレージトライ及び結果トライ内の各子ノードは、１つのみの親ノードを有する。
【０１５８】
第１３４の実施形態によれば、第１３１〜第１３３の実施形態のいずれか１つにおいて、結果トライ内の各ノードの子ノードの集合は、一致トライ内の対応するノードの子ノードの集合と、ストレージトライ内の各ノードの子ノードの集合は、一致トライ内の対応するノードの子ノードの集合との論理積であり、同じキーが異なるトライのノードに関連付けられる場合、異なるトライのノードは互いに対応する。
【０１５９】
第１３５の実施形態によれば、第１３１〜第１３４の実施形態のいずれか１つにおいて、一致トライは、ストレージトライとの一致トライの論理積中に動的に生成される仮想トライである。
【０１６０】
第１３６の実施形態によれば、第９３〜第１３４の実施形態において、少なくとも、好ましくは多くとも、ストレージトライとの一致トライの論理積に必要な仮想トライの部分が動的に生成される。
【０１６１】
第１３７の実施形態によれば、第１３１〜第１３６の実施形態のいずれか１つにおいて、出力において提供されるデータ項目は、結果トライのノードの結果集合のノードに関連付けられた文字列を含むデータユニット、好ましくはドキュメント識別子を表す。
【０１６２】
第１３８の実施形態によれば、第１３１〜第１３７の実施形態のいずれか１つにおいて、ストレージトライは、好ましくは、ドキュメントに含まれる文字列及びドキュメント識別子のそれぞれを２つのキー部、例えば（文字列、長）として格納するインデックストライ又は物理インデックストライである。
【０１６３】
第１３９の実施形態によれば、第１３１〜第１３８の実施形態のいずれか１つにおいて、一致トライは一致ノードの集合を含み、各一致ノードには、近似文字列の集合からの文字列の１つに対応する１つ又は複数のキーが関連付けられ、ノードの結果集合は、一致トライ内の一致ノードの集合に対応する結果トライのノードの集合であり、結果トライのノードに関連付けられたキーが、一致トライのノードに関連付けられたキーと同一である場合、結果トライのノードは一致トライのノードに対応する。
【０１６４】
第１４０の実施形態によれば、第１３１〜第１３９の実施形態のいずれか１つにおいて、方法は、数Ｎを取得するステップを更に含み、サーチ文字列の変形は、サーチ文字列での多くともＮ個の１文字挿入、削除、及び／又は置換によって取得することができる文字列の集合からなる。
【０１６５】
第１４１の実施形態によれば、第１３１〜第１４０の実施形態のいずれか１つにおいて、一致トライを構築するステップは、近似文字列の集合を表す有限オートマトンを構築することと、有限オートマトンから一致トライを導出することとを含む。
【０１６６】
第１４２の実施形態によれば、第９３〜第１４１の実施形態において、有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移には、特定の文字、好ましくはサーチ文字列に含まれる文字、ワイルドカード文字、又は空文字列が関連付けられる。
【０１６７】
第１４３の実施形態によれば、第１４１又は第１４２の実施形態のいずれか１つにおいて、有限オートマトンを構築するステップは、近似文字列の集合を表す非決定性有限オートマトンを構築することと、非決定性有限オートマトンから決定性有限オートマトンを導出することとを含み、一致トライは決定性有限オートマトンから導出される。
【０１６８】
第１４４の実施形態によれば、第９３〜第１４３の実施形態において、決定性有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移には、特定の文字、好ましくはサーチ文字列に含まれる文字又はワイルドカード文字が関連付けられる。
【０１６９】
第１４５の実施形態によれば、第１３１〜第１４４の実施形態のいずれか１つにおいて、一致トライ及びストレージトライ内のノード、好ましくは少なくとも全ての親ノードは、ビットマップを含み、トライ内の子ノードのキー部分の値は、ビットが子ノードに関連付けられた子ノードの親ノードに含まれるビットマップ内の（設定）ビットの値によって決まる。
【０１７０】
第１４６の実施形態によれば、第９３〜第１４５の実施形態において、一致トライの子ノードとストレージトライの子ノードとの論理積は、論理積演算を使用して子ノードのそれぞれのビットマップを結合することを含む。
【０１７１】
第１４７の実施形態によれば、第１４５又は第１４６の実施形態のいずれか１つにおいて、有限オートマトンから一致トライを導出するステップは、遷移に関連付けられた特定の文字又はワイルドカード文字の符号化により、有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移を関連付けることにより、拡張有限オートマトンを取得することを含み、符号化は、長さ及び／又はフォーマットが一致トライの親ノードに含まれるビットマップに等しい１つ又は複数のビットマップからなり、又は表し、一致トライは拡張有限オートマトンから導出される。
【０１７２】
第１４８の実施形態によれば、第９３〜第１４７の実施形態において、特定の文字の符号化の場合、厳密に１ビットが、符号化に含まれるか、又は表されるビットマップのそれぞれにおいて設定される。
【０１７３】
第１４９の実施形態によれば、第１４７又は第１４８の実施形態のいずれか１つにおいて、ワイルドカード文字の符号化の場合、全ての有効文字符号化のビットは、符号化に含まれ、又は符号化によって表されるビットマップにおいて設定され、遷移元の状態に関連付けられた特定の文字の符号化を除く全ての有効文字符号化のビットは、符号化に含まれ、又は符号化によって表されるビットマップにおいて設定される。
【０１７４】
第１５０の実施形態によれば、第１４５〜第１４９の実施形態のいずれか１つにおいて、一致トライ、ストレージトライ、又は結果トライに格納された文字は、各トライのＭ＞１個、好ましくは５＞Ｍ個のキー部分によって符号化される。
【０１７５】
第１５１の実施形態によれば、第９３〜第１５０の実施形態において、有限オートマトンから一致トライを導出するステップは、有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移をＭ−１レベルの中間状態と、中間状態のＭ−１個を介して２つの状態をリンクするＭ個の遷移の１つ又は複数のシーケンスとで置換することにより、又は有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移に、Ｍ−１レベルの中間状態と、中間状態のＭ−１個を介して２つの状態をリンクするＭ個の遷移の１つ又は複数のシーケンスを関連付けることにより、近似文字列の集合を表す完全有限オートマトンを取得することを含み、シーケンス内のＭ個の遷移のそれぞれには、長さ及び／又はフォーマットが一致トライの親ノードに含まれるビットマップに等しいビットマップからなり、又は表される中間符号化が関連付けられ、一致トライは完全有限オートマトンから導出される。
【０１７６】
第１５２の実施形態によれば、第１５１の実施形態において、有限オートマトンの２つの状態間の遷移に、特定の文字が関連付けられる場合、シーケンスのＭ個の遷移が関連付けられた中間符号化に含まれ、又は表されるビットマップを連結したものは、特定の文字の符号化であり、ビットマップのそれぞれにおいて厳密に１ビットが設定される。
【０１７７】
第１５３の実施形態によれば、第１５１又は第１５２の実施形態において、有限オートマトンの２つの状態間の遷移にワイルドカードが関連付けられる場合、シーケンスのＭ個の遷移が関連付けられた中間符号化に含まれ、又は表されるビットマップを連結したものは、全ての有効文字符号化のビットが、符号化に含まれ、若しくは表されるビットマップにおいて設定され、又は遷移の発端である状態に関連付けられた特定の文字の符号化を除く全ての有効文字符号化のビットが、符号化に含まれ、若しくは表されるビットマップにおいて設定される符号化及び／又は特定の文字の符号化の１つ又は複数の部分又は全ての有効文字符号化のビットが符号化に含まれ、又は表されるビットマップにおいて設定され、若しくは遷移が発端とする状態に関連付けられた特定の文字の符号化を除く全ての有効文字符号化のビットが、符号化に含まれ、又は表されるビットマップにおいて設定される符号化の１つ又は複数の部分を含む１つ又は複数の符号化を含む。
【０１７８】
第１５４の実施形態によれば、第１４７〜第１４９又は第１５１〜第１５３の実施形態のいずれか１つにおいて、拡張有限オートマトン又は完全有限オートマトンはそれぞれ、幾つかの行を含むデータ構造により表され、又は格納され、各行は、拡張有限オートマトン又は完全有限オートマトンの１つの状態を表し、状態を発端とする遷移のそれぞれにタプルを含み、各タプルは、遷移に関連付けられた符号化と、遷移が終わる状態への参照とを含む。
【０１７９】
第１５５の実施形態によれば、第９３〜第１５４の実施形態において、データ構造は、遷移が終わる各状態について、好ましくは状態への各参照においてビットとして符号化される、この状態が一致状態であるか否かについての情報を含む。
【０１８０】
第１５６の実施形態によれば、第１５４又は第１５５の実施形態のいずれか１つにおいて、データ構造は、遷移元の拡張有限オートマトン又は完全有限オートマトンの状態のそれぞれの行を含む。
【０１８１】
トライデータ構造
第１５７の実施形態によれば、第９３〜第１３０の実施形態のいずれか１つにおいて、トライは第１〜第９２の実施形態のいずれか１つに記載のトライである。
【０１８２】
発明の異なるカテゴリ
本発明の第１５８の実施形態は、特に、キー若しくはキー及び値を格納し、クエリの結果キー若しくはキー及び値を格納し、又はクエリの入力キー若しくはキー及び値を格納する、電子データベースアプリケーション又は情報検索システムにおいて第１〜第９２の実施形態のいずれか１つにおけるトライを使用するコンピュータ実施方法である。
【０１８３】
本発明の第１５９の実施形態は、第１〜第９２の実施形態のいずれか１つにおけるトライを生成するコンピュータ実施方法である。
【０１８４】
本発明の第１６０の実施形態は、第１〜第９２の実施形態のいずれか１つにおけるトライを格納した非一時的コンピュータ可読媒体である。
【０１８５】
本発明の第１６１の実施形態は、第１〜第９２の実施形態のいずれか１つにおけるトライを表す電子データのストリームである。
【０１８６】
本発明の第１６２の実施形態は、第１〜第９２の実施形態のいずれか１つにおけるトライにより、キー若しくはキー及び値、クエリの結果キー若しくはキー及び値、又はクエリの入力キー若しくはキー及び値を格納する電子データベース又は情報検索システムである。
【０１８７】
本発明の第１６３の実施形態は、第９３〜第１６２の実施形態のいずれか１つにおける方法を実行する命令を含む、コンピュータプログラム、特にデータベースアプリケーション情報検索システムプログラムである。
【０１８８】
本発明の第１６４の実施形態は、第９３〜第１６３の実施形態のいずれか１つにおける方法を実行するように構成された、１つ又は複数のプロセッサ及びメモリを含むデータ処理デバイス又はシステムである。
【０１８９】
本発明の第１６５の実施形態は、第１６４の実施形態におけるコンピュータプログラムを記憶した好ましくは非一時的コンピュータ可読媒体である。
【０１９０】
図面の簡単な説明
以下、本発明について、好ましい実施形態に関連して図面を参照して更に詳細に説明する。
【図面の簡単な説明】
【０１９１】
【図１】従来技術によるデータベースで使用されるトライデータ構造の一例を示す。
【図２】従来技術で使用されるトライデータ構造の別の例を示す。
【図３】図２のトライデータ構造の従来技術による実施を示す。
【図４】図２のトライデータ構造の別の従来技術による実施を示す。
【図５】図２のトライデータ構造の別の従来技術による実施を示す。
【図６】従来技術によるトライにおいて、ノードの子ポインタがいかに決定されるかを示す。
【図７Ａ】本発明によるトライにおいて、リーフノードがマップにいかに格納されるか及び「最後」のビットマップがいかに集合に格納されるかを示す。
【図７Ｂ】本発明によるトライにおいて、リーフノードがマップにいかに格納されるか及び「最後」のビットマップがいかに集合に格納されるかを示す。
【図７Ｃ】本発明によるトライにおいて、リーフノードがマップにいかに格納されるか及び「最後」のビットマップがいかに集合に格納されるかを示す。
【図８】本発明による第１の空間最適化が効率的であるトライの一例を提供する。
【図９】本発明による第１の空間最適化を示す。
【図１０】本発明による第２の空間最適化が効率的なトライの一例を提供する。
【図１１】本発明による第２の空間最適化の汎用格納構成を示す。
【図１２】本発明による第２の空間最適化を示す。
【図１３】本発明により空間最適化されたトライのノードがいかに、汎用的にアクセスされるかを示す。
【図１４Ａ】本発明により空間最適化されたトライへのキーの挿入を示す。
【図１４Ｂ】本発明により空間最適化されたトライへのキーの挿入を示す。
【図１４Ｃ】本発明により空間最適化されたトライへのキーの挿入を示す。
【図１５】本発明による第１及び第２の空間最適化の効率を測定するために行われた実験の結果を示す。
【図１６】本発明による第３の空間最適化を示す。
【図１７】本発明による第３の空間最適化の効率を測定するために行われた実験の結果を示す。
【図１８】本発明によるトライに格納すべき制御情報及びコンテンツ情報をキー内に配置する第１の方法を示す。
【図１９】本発明によるトライに格納すべき制御情報及びコンテンツ情報をキー内に配置する第２の方法を示す。
【図２０】本発明によるキー符号化の一例を示す。
【図２１】本発明により符号化されたキーを格納するトライを示す。
【図２２】値（Ｘ＝１２，Ｙ＝４５）を有する二次元キーの一例を示す。
【図２３】図２１に示されたキーをいかに本発明によるトライに格納することができるかの一例を与える。
【図２４】従来技術でのデータベースクエリ処理フェーズを示す。
【図２５】従来技術によるデータベースで使用される例示的なクエリ実行プランを示す。
【図２６】従来技術によるデータベースにおけるクエリ実行モデルに従った演算子制御及びデータフローを示す。
【図２７】従来技術によるデータベースのクエリ実行プランに従った１度に１タプルの処理を示す。
【図２８】従来技術によるデータベースのクエリ実行モデルに従った１度に１演算子の処理を示す。
【図２９】本発明のクエリ実行モデルに従ったトライ制御及びデータフローを示す。
【図３０】本発明による２つのトライに論理積演算子を適用する一例を示す。
【図３１】本発明による論理積が実行される２つのトライ例を示す。
【図３２】レベル１及びレベル２で図３１の２つのトライ例のビットマップに対して実行されたビット毎のＡＮＤ演算を示す。
【図３３】図３１の２つのトライへの論理積演算中の分岐スキップを示す。
【図３４】図３１の２つのトライへの論理積演算の結果トライを示す。
【図３５】本発明による、２つのトライに論理和演算子を適用する一例を示す。
【図３６】図３５の２つのトライへの論理和演算の結果トライを示す。
【図３７】本発明による、２つのトライに差分演算子を適用する一例を示す。
【図３８】本発明による、範囲クエリにおける論理積演算し、入力集合トライ、及び範囲トライの相互作用を示す。
【図３９】本発明による範囲クエリを実行する方法の一例を示す。
【図４０】本発明による二次元範囲クエリを実行する方法の一例を示す。
【図４１】図４０の一次元範囲トライがインタリーブされていかに結合されるかを示す。
【図４２】図４１の結果として得られたインタリーブ範囲トライを示す。
【図４３】図４０の一次元範囲トライが非インタリーブでいかに結合されるかを示す。
【図４４】図４３の結果として得られた非インタリーブ範囲トライを示す。
【図４５】入力集合トライが非インタリーブで格納される場合、範囲クエリ中、図４０の入力集合トライのどのノードが訪問されるかを示す。
【図４６】入力集合トライがインタリーブで格納される場合、範囲クエリ中、図４０の入力集合トライのどのノードが訪問されるかを示す。
【図４７】一次元出力を有する本発明による二次元範囲クエリを示す。
【図４８Ａ】最大編集距離２を有するサーチ文字列「ａｂｃ」に一致する非決定性有限オートマトンを示す。
【図４８Ｂ】編集距離１の場合の「ａｂｃ」に一致する決定性有限オートマトンを示す。
【図４８Ｃ】図４８Ｂのオートマトンの遷移の拡大を示し、ユニコード文字の符号化方式及び図２１を参照して説明したユニコード文字の文字列が使用される。
【図４８Ｄ】１０ビットの各ユニコード文字が２つのキー部分により表されるマッチトライの結果上部を示す。
【図４８Ｅ】図４８Ｄのマッチトライを導出することができる完全有限オートマトンの状態を表すのに使用することができる、複数の配列の１配列としてのデータ構造を示す。
【図４９】ミュンヘンのエリア内の小さな矩形内の全ロケーションの実験的ジオデータサーチクエリの仕様を示す。
【図５０】第１の一連の実験的ジオデータサーチクエリを実行するデータベースにロードされた残りのレコードを示す。
【図５１】第２の一連の実験的ジオデータサーチクエリを実行するデータベースにロードされた残りのレコードを示す。
【図５２】実験的ジオデータサーチクエリにより決定された暫定結果集合及び最終結果集合を示す。
【図５３】従来技術による手法の性能測定結果を示す。
【図５４】本発明による標準索引付け手法で使用される非インタリーブ二次元インデックストライでの抽象ビューを示す。
【図５５】本発明による標準索引付け手法でのマルチＯＲ演算子の使用を示す。
【図５６】本発明による標準索引付け手法で使用される構成要素の概要を提供する。
【図５７】本発明による標準索引付け手法の性能測定結果を示す。
【図５８】本発明による可変精度索引付け手法の第１レベルインデックスの一例を示す。
【図５９】本発明による可変精度索引付け手法の第２レベルインデックスの一例を示す。
【図６０】本発明による可変精度索引付け手法の性能測定結果を示す。
【図６１】本発明による二次元索引付け手法において、インタリーブで格納された２項目キーの部分が、互いと又は範囲トライの部分といかに結合されるかを示す。
【図６２】本発明による二次元索引付け手法の性能測定結果を示す。
【図６３】本発明によるシングルインデックス索引付け手法での３項目キーを格納するインデックスの構造を示す。
【図６４】本発明によるシングルインデックス索引付け手法で使用される構成要素の概要を提供する。
【図６５】本発明によるシングルインデックス索引付け手法の性能測定結果を示す。
【図６６】結果サイズの増大に伴ってクエリ性能を測定した実験の結果を示す。
【図６７】対数ｘ軸を有する図で図６６の結果を示す。
【図６８】インデックスサイズの増大に伴って索引付け性能を測定した実験の結果を示す。
【図６９】異なる索引付け手法の空間要件を示す。
【図７０Ａ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｂ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｃ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｄ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｅ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｆ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【発明を実施するための形態】
【０１９２】
発明の好ましい実施形態の詳細な説明
図１は、従来技術によるデータベースで使用されるトライデータ構造の一例を示す。図１は、各子ノード（すなわち、ルートノードを除く全てのノード）にはキー部分が関連付けられ、キー部分の値は、親ノードからのポインタによって示され、英数字｛０，…，９｝から選択され、すなわち、ルートノードを除く各レベルのノードには１桁の数字が関連付けられるトライデータ構造１０１を示す。ルートノードからトライ内の別のノードへのパスは、ノードが関連付けられたキーを定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものである。トライ１０１には値「００７」を有するキーが関連付けられ、トライ１０１のリーフノード１０８には値「０４２」を有するキーが関連付けられているため、トライ１０１は、値「００７」及び「０４２」を有するキーを「格納」する。
【０１９３】
第１レベル１１０に配置されたルートノード１０２は、値「０」のキー部分が関連付けられた１つの子ノード１０４を有する。したがって、ルートノード１０２から、トライ１０１の第２レベル１１１に配置された子ノード１０４へのポインタ１０３があり、子ノード１０４は値「０」を示す。第２レベルの子ノード１０４から、２つの異なるポインタが、第３レベル１１２に配置されたノード１０５、１０６を指し、これらのノード１０５、１０６のそれぞれから、１つの更なるポインタがリーフノード１０７、１０８をそれぞれ指す。したがって、ルートからリーフノードへのパス上のノードのキー部分を連結したものが、値「００７」及び「０４２」を有するキーになる。
【０１９４】
図２は、従来技術で使用されるトライデータ構造の更なる例を示す。この例のトライデータ構造は図１のものと同様であるが、より大きな英字の、ノードに関連付けられたキー部分の可能な値を有する。特に、図２は２５６変数トライデータ構造を示し、キー部分値の表現は８ビット（すなわち、１バイト）のサイズを有する。
【０１９５】
図２のトライデータ構造は、２つの異なるキー「００００ＦＤ」及び「００２Ａ０２」を格納し（リーフノードに関連付けられた２つの異なるキーを有し）、４つのレベル２１０〜２１４を有する。第１レベル２１０に配置されたルートノード２０２は、キー部分値「００」が関連付けられた子ノード２０４へのポインタを有する。子ノード２０４は、キー部分値「００」及び「２Ａ」がそれぞれ関連付けられた子ノード２０５、２０６への２つのポインタを含む。第３レベル２１２に配置された各子ノード２０５、２０６は、リーフノード２０７、２０８への１つのポインタをそれぞれ含む。リーフノード２０７、２０８は第４レベル２１３に配置される。リーフノード２０７にはキー部分値「ＦＤ」が関連付けられ、リーフノード２０８にはキー部分値「０２」が関連付けられている。
【０１９６】
図３は、図２のトライデータ構造の従来技術による実施を示す。ポインタが関連付けられたノードは全体的に、メモリにおいて割り振られる。したがって、この状況では、空（無）ポインタであってもメモリ空間を占有する。例えば、ルートノード３０２は、配列３０６に割り振られた２５６個のポインタを有し、キー部分値「００」が関連付けられ、子ノード３０４を指す１つのポインタ３０３のみが空ではない。子ノードは同じように実施される。
【０１９７】
図４は、メモリ空間をより効率的に使用する既知の解決策を提供する、図２のトライデータ構造の例示的な実施を示し、空（ヌル）ポインタの格納を回避する。解決策の本質は、可能な全てのポインタを含む配列の代わりに、各キー部分値と共に非空ポインタのみのリストを格納することにある。例えば、キー部分値「００」が関連付けられた１つの子ノードを有するルートノード４０２は、１つのエントリを有するリストを含む。リストのエントリは、キー部分値４０３と、子ノード４０５を指す、関連付けられたポインタ４０４とを含む。他の子ノードもそれに従って実施される。
【０１９８】
図５は、親ノードの全ての非空ポインタを記すのに使用されるビットマップに基づいて割り振り問題への既知の解決策を提供する、図２のトライデータ構造の別の例示的な実施を示す。換言すれば、ビットマップ内の設定ビットは有効（非空）分岐を記す。各親ノードは１つ又は複数のポインタも含み、各ポインタにはビットマップ内の設定ビットが関連付けられ、各ポインタは親ノードの子ノードを指す。
【０１９９】
子ノードのポインタを決定するためには、先行する子ポインタの量を計算する必要がある。ポインタを見つけるためのオフセットは、図６に示されるように、標的位置前にビットマップ内で設定された最下位ビットの量である。このコンパクトなトライノード構造は、無ポインタを格納する必要性をなくし、それと同時に、非常に高速なアクセスを可能にする。
【０２００】
図５の例のトライデータ構造は英字基数２５６を有し、その結果、ビットマップサイズは２５６ビットになる。換言すれば、各ビットマップは、２５６個の異なるキー部分値（又は子ノード）の２５６個のポインタを識別することができる。２５６個の異なる値を用いて、８ビット（２８）すなわち１バイトを符号化することができる。
【０２０１】
ルートノード５０２は、ビットマップに設定された、キー部分値「００」を表す１ビットを有する。したがって、ルートノード５０２は、子ノード５０４への１つのみのポインタ５０３を含み、子ノードには値「００」を有するキー部分が関連付けられる。子ノード５０４は、ビットマップにおいて設定された２つのビット５０５、５０７、すなわち、キー部分値「２Ａ」及び「００」を表すビットを有する。したがって、子ノード５０４は、各子ノード５０９、５１０をそれぞれ指す２つのポインタ５０７及び５０８を含む。
【０２０２】
値「２Ａ」を有するビットマップ内のビットに関連付けられたポインタ５０６は、キー部分値「２Ａ」を表すビット５０５から開始して、幾つの最下位ビットが設定されているかを計算することによりアドレス指定される。この場合、１つの最下位ビット、すなわち、ビット５０６しか設定されておらず、したがって、１ポインタのオフセットがあり、探しているポインタが、子ノード５０４に含まれる２番目のポインタであると判断することができる。
【０２０３】
本発明によるトライの好ましい実施形態の一般特徴
全てのトライのように、本発明によるトライ又はトライデータ構造は、１つ又は複数のノードを含む。図１〜図６を参照して上述した従来技術によるトライと同様に、好ましい実施形態のトライのノード、好ましくは各子ノードにはキー部分が関連付けられ、ルートノードからトライ内の別のノード、特にリーフノードへのパスは、キーを定義し、キーは、パス内のノードに関連付けられたキー部分を連結したものである。ルートノードにはキー部分が関連付けられず、トライが、他の目的を果たすため、キー部分が関連付けられない更なるノードを含み得ることが理解されよう。例えば、サブツリー内のエントリの数は、通常は全ツリーをトラバースする必要があるカウント動作を回避又は加速させるために、そのようなノードに格納することができる。
【０２０４】
本発明によるトライの好ましい実施形態では、２つ以上の子ノードを有するノード、好ましくは少なくとも各親ノードは、ビットマップ及び幾つかのポインタを含む。各ポインタには、ビットマップにおいて設定されたビットが関連付けられ、各ポインタはノードの子ノードを指す。通常、ビットは、値が「１」である場合、ビットマップにおいて「設定」されている。しかしながら、特定の実施形態では、ビットは、値が「０」である場合、「設定」されているものとしてカウントし得る。本明細書では、ビットマップ内のビットは、その値が、図５に示される従来技術によるトライを参照して先に説明したように、ビットマップ内のビットが有効分岐を記すという考えが関連付けられた値に対応する場合、「設定」されているものとしてカウントされる。
【０２０５】
好ましくは、ビットマップは、予め定義されたサイズの整数としてメモリに格納される。更に、ビットマップのサイズは、好ましくは、３２ビット、６４ビット、１２８ビット、又は２５６ビットである。トライを格納し処理する標的コンピュータシステムの動作性能は、標的コンピュータシステムのＣＰＵのレジスタ、システムバス、データバス、及び／又はアドレスバスのビット幅に等しいようにビットマップのサイズを選ぶことにより上げることができる。
【０２０６】
例えば、上述したように、ビットマップにおいて設定されたビットに関連付けられたポインタのメモリアドレスは、ビットマップにおいて設定された最下位ビットの数に基づいて計算することができる。この特定は、単純なビット演算と、設定ビットの数を特定するＣＴＰＯＰ（ポピュレーションカウント）演算とを使用して非常に効率的に行うことができる。多くの近代のＣＰＵは実に、固有命令としてＣＴＰＯＰを提供している。しかしながら、近代のＣＰＵでは長整数は６４ビット幅であるため、ＣＴＰＯＰは６４ビットでしか機能しない。これは、２５６ビットのビットマップを使用する従来技術によるトライにとっては、演算が最高で４回（４×６４＝２５６）実行されることを意味する。代替的には、従来技術によるトライは、最初の３つのビットマップを有する先行ビットマップの合計ビットカウントを格納する。次に、最下位ビットの数は、ビットの最後の群のＣＴＰＯＰ＋ビットの先行群のビットカウントとして計算することができる。
【０２０７】
現在、大半のコンピュータシステムでは、システムビット幅は６４ビットであり、６４ビットというビットマップサイズは現在、最も好ましいサイズであり、本発明の実施例で本発明者により使用された。この結果、６４変数トライが生成され、これは、あらゆるノードが６４シンボルの英字シンボルを格納することができ、すなわち、６ビット（２６＝６４）を符号化することができることを意味する。以下に説明するように、本発明の実施形態によるトライは、幾つかのノード及びそれに関連付けられたキー部分を使用して、プリミティブデータ型に含まれる情報を格納し得る。例えば、６４ビット長整数によって表されるキーを格納するには、１１レベルを有する６４変数トライが必要である（１１＊６ビット＞＝６４）。
【０２０８】
ビットマップ及び／又はポインタは、例えば、配列、リスト、又は連続した物理若しくは仮想メモリロケーションに格納し得る。なお、「メモリ」という用語が本明細書で使用される場合は常に、物理的又は仮想的なメモリを指し得、好ましくは連続メモリを指し得る。好ましい実施形態では、長整数（６４ビット）は、ビットマップを表すために使用されるとともに、子ポインタのそれぞれを表すのにも使用される。メモリにおいてノードを別個に割り振る代わりに、ノードは長整数の配列に格納され、ノードのメモリポインタを有する代わりに、現在のノードはこの配列へのインデックスにより指定される。子ポインタは、配列内のノード位置のインデックスであり得る。その場合、トライをトラバースするとき、現在のノードインデックスに基づいて子ノードのインデックスを見つけるためのオフセットは、ビットマップの標的位置前にビットマップにおいて設定された最下位ビットの量に１を加算したものである。
【０２０９】
好ましい実施形態は幾つかのそのような配列を用いて機能する。ポインタの一部分、例えば下部は、配列内のインデックスであり、ポインタの別の部分、例えば上部は配列への参照である。任意の大きなサイズの配列を割り振ることは常に可能であるわけではないため、これはメモリ管理目的で行われる。例えば、Javaでは、配列のサイズは３２ビット整数に制限され、これにより、２３１（正の値のみ）＝２，１４７，４８３，６４８の配列サイズになる。しかしながら、多くの現実世界用途では、１６ＭＢ以上を含む配列が必要とされ、これは６４ビット長整数配列では２００万個のエントリに対応する。
【０２１０】
図５及び図６の従来技術によるトライのように、２つ以上の子ノードを有する親ノード、好ましくは少なくとも各親ノードは通常、前記親ノードに含まれるビットマップにおいて設定されたビット量に等しいポインタ量を含む。例えば、図５のノード５０４は、設定された２ビット５０５、５０６を有するビットマップを有し、２つのポインタ５０７、５０８を含む。親ノードの全ポインタ内でのポインタのランクは、好ましくは、親ノードのビットマップ内の全ての設定ビット内の、ポインタに関連付けられた設定ビットのランクに対応する。例えば、図５の親ノード５０４では、第１のポインタ５０７はビットマップの第１の設定ビット５０５に対応し、第２のポインタ５０８は第２の設定ビット５０６に対応する。ポインタは通常、ビットがビットマップにおいて設定された順と同順又は逆順に格納される。各ポインタは、好ましくは、例えば図９及び図１２において以下に示されるように、子ノードに含まれるビットマップ（のアドレス）、例えば、このビットマップの開始アドレスを指す。
【０２１１】
図５及び図６の従来技術によるトライでのように、親が２つ以上の子ノードを有する好ましい実施形態のトライの子ノード、好ましくは少なくとも各子ノードのキー部分の値は、ビットが子ノードに関連付けられた親ノードに含まれるビットマップにおける（設定）ビットの値によって決まる。したがって、キー部分に利用可能な異なる値の最大量は通常、ビットマップのサイズによって定義され、及び／又はビットマップのサイズは、キー部分に可能な英字を定義する。
【０２１２】
本発明の好ましい実施形態では、トライ内の各キー部分は、同じ予め定義されるサイズの値、例えば５ビット値（ビットマップのサイズが３２ビットである場合）、６ビット値（ビットマップのサイズが６４ビットである場合）、７ビット値（ビットマップのサイズが１２８ビットである場合）、又は８ビット値（ビットマップのサイズが２５６ビットである場合）を格納することが可能である。ノード又はキー部分によって表される文字の英字は、そのサイズを有する可能な全てのビット群の集合である。例えば、キー部分が６ビット値を格納可能な場合、英字は、６ビットを含む全てのビット群の集合である。
【０２１３】
本発明によるトライデータ構造は、キー値マップ（「連想配列」とも呼ばれる）の実施に使用することができ、値はリーフノード及びキー集合（「動的集合」とも呼ばれる）に格納され、データはリーフノードに格納されない。所与のキーの値を調べるために、あらゆるキーが１つのみの値を有する場合、マップが使用され、一方、所与の集合が所与のキーを含むか否かを判断するためには、集合が使用される。両方の場合で同様に、キーへの集合演算（論理和、論理積、又は差分等）は頻繁に必要とされる演算である。
【０２１４】
図７Ａ〜図７Ｃは、コンパクトに、全ての値に一定時間内でアクセスすることができるように、リーフノードがマップにいかに格納されるか及び「最後」のビットマップがいかに集合に格納されるかを示す。図７Ａは、より長い文字列又はテキスト等のより大きな及び／又は可変サイズ値のデータ型を有するキー値マップの場合、リーフノードがいかに格納されるかを示す。図７Ａに示されるように、値は別個に格納される。値への追加のポインタｉｄｘに必要な空間は、ポインタのサイズと比較して値のサイズが大きい場合、ごくわずかである。
【０２１５】
値データ型が、日付け又は整数等の固定サイズである場合、値を「直列」に格納する、例えば、図７Ｂに示されるように、親ノードのビットマップの直後に格納することがより効率的である。例えば、長−長マップ、すなわち、キーが長整数型であり、値も長整数型であるマップは、直列化を用いる本発明の好ましい実施形態によりトライデータ構造により効率的に実施することができる。直列化は、固定サイズ値データ型である場合、位置は、例えば、ＣＴＰＯＰ（ビットマップ＋（ビット位置−１））＊サイズとして計算することができるため、固定サイズ値データ型でのみ機能する。逆に、可変サイズ値データ型の場合、位置を特定するために、全ての値のエントリを経る必要がある。
【０２１６】
図７Ｃは、「最後」のビットマップを記憶する直列を集合にいかに使用することができるかを示す。値がないため、最後のビットマップはそれ自体、ポインタの必要なく直列化される。なお、本明細書で使用される用語では、物理レベルでのこれらの「最後」のビットマップは、リーフノードの親ノードの部分であるが、これらのビットマップにおいて設定されたビットは、論理レベルでのリーフノードのキー部分の値を示す。
【０２１７】
トライデータ構造は、キーを順序付きで格納し、したがって、キーを順にトラバースすることができる。例えば、６４ビット長整数キーは、最上位６ビット（又は６４＝４＋１０＊６であるため、４ビット）から始まって最下位６ビットまで格納し得る。この方法では、整数は符号なし長整数として扱われる。通常、２の補数を使用して符号化される符号付き整数の場合、正確な順序を有するために、例えば、６４ビット長整数の場合２６４−１を追加することによりオフセット二進表現に変換しなければならない。浮動小数点数も同様に扱われる。したがって、浮動小数点数又は２の補数の符号付き整数等のキーのデータ項目の値の符号化は、データ項目のデータ型を、符号なし整数、例えば、符号なし長整数で構成されるオフセット二進表現に変換することを含み得る。
【０２１８】
空間効率的トライデータ構造
多くの用途状況では、メモリ空間の使用は非効率的である。これは、トライが疎に存在し、及び／又は各ノードが１つのみの子ポインタを有するノード連鎖に劣化する場合、特に当てはまる。
【０２１９】
連鎖ノード最適化
本発明者は、経験的研究において、任意のキーについて、典型的な用途状況でのトライが、１つのみの子を有する多くのノードを有することを発見した。これは、多くのキーが共通のプレフィックス、インフィックス、又はポストフィックスを共有するためである。そのような状況では、従来技術によるトライは、１つの子ポインタを有するノードの連鎖に劣化し、従来技術によるトライデータ構造の空間効率は低い。
【０２２０】
本発明の第１の空間最適化は、ノードが１つのみの子を有する場合、すなわち、親ノードに含まれるビットマップにおいて、１つのみのビットが設定される場合、子ポインタをなくす。本明細書ではこの手法を「連鎖ノード最適化（chained node optimization）」と呼ぶ。連鎖ノード最適化が効率的なトライの一例を図８に示す。トライのレベル４にあるリーフノード８４１、８４２、８４３は、レベル０におけるルートノード８００、ルートノード８００の唯一の子ノードであるレベル１におけるノード８１０、ノード８１０の唯一の子ノードであるレベル２におけるノード８２０、及びノード８２０の唯一の子ノードであるレベル３におけるノード８３０を含む共通のプレフィックスを共有する。
【０２２１】
本発明の第１の空間最適化は、１つ又は複数のノードを含むトライであって、２つ以上の子ノードを有する、トライに含まれる親ノード、好ましくは各親ノードは、ビットマップ及び１つ又は複数のポインタを含み、各ポインタにビットマップにおいて設定されたビットが関連付けられ、各ポインタは親ノードの子ノードを指す、トライに適用される。最適化は、１つのみの子ノードを有する、トライに含まれる親ノード、好ましくは各親ノードが、子ノードへのポインタを含まず、及び／又は子ノードがメモリにおいて、親ノードに相対して予め定義された位置に格納されることによって達成される。好ましくは、１つのみの子ノードを有する親ノードの子ノードは、メモリにおいて親ノードの直後に格納される。
【０２２２】
本発明による第１の空間最適化を図９に示し、図９は、連鎖ノード最適化前のトライ９１０の部分と、連鎖ノード最適化が適用された後のトライ９１０に対応するトライ９２０の部分とを示す。上述した好ましい実施形態と同様に、トライ９１０、９２０におけるノードは、長整数の配列内に格納され、これは、トライ９１０、９２０の部分の図の左側にある表現「ｌｏｎｇ［］」によって示される。
【０２２３】
トライ９１０は、１ビットのみが設定され（１）、他の全てのビットは設定されない（０）ノード９１１の（６４ビット幅）ビットマップにより示されるように、１つのみの子を有する第１のノード９１１を含む。従来技術によるトライのように、ノード９１１は結果として、ノード９１１の子ノードであるノード９１２を指す長整数である１つのポインタ９１４を含む。ノード９１２は、ノード９１２の（６４ビット幅）ビットマップにおいて設定された２ビット及びノード９１２に含まれる２つのポインタ９１５、９１６によって示されるように、図９に示されていない２つの子ノードを有する。ノード９１１とノード９１２との間の３つのドット（「．．．」）によって示されるように、ノード９１２は通常、ノード９１１の直後のメモリロケーションに格納されず、長整数の配列内の任意の場所に格納することができる。
【０２２４】
トライ９２０もまた、１ビットのみが設定され（１）、他の全てのビットは設定されない（０）ノード９２１の（６４ビット幅）ビットマップにより示されるように、１つのみの子を有する第１のノード９２１を含む。しかしながら、トライ９１０におけるノード９１１とは対照的に、トライ９２０におけるノード９２１は、ノード９２１の子ノードであるノード９２２を指すポインタを含まない。その代わり、ノード９２２は、好ましい場合、ノード９２１の直後のメモリロケーションに格納されるが、代替的には、親ノード９２１に相対するメモリ内の位置が予め定義される限り、長整数の配列内の任意の場所に格納することができる。例えば、子ノード９２２は、親ノード９２１の直前に格納することができ、又は親ノード９２１と子ノード９２２との間に固定長の別のデータオブジェクトが存在することができる。トライ９１０のノード９１２のように、トライ９２０のノード９１２は、メモリ（長整数の配列）内のロケーションがノード９２２に含まれる２つのポインタ９２５及び９２６によって示される、図９に示されていない２つの子ノードを有する。
【０２２５】
ノードに含まれるビットマップ及び各ポインタの両方が長整数により、すなわち、同じデータ型又は同じ長さのデータ型により表される図９の実施形態例では、本発明による連鎖ノード最適化は、１つのみの子ノードを有するノードの格納に必要なメモリ空間を５０％低減する。
【０２２６】
末端最適化
本発明の第２の空間最適化は、トライの「端部」が１ノードの連鎖又は列、すなわち、共通のポストフィックスを有さない多くのキーを含むトライのメモリでのよりコンパクトな表現を提供する。第２の空間最適化が効率的なトライの一例を図１０に示す。図１０におけるトライのリーフノード１０４１、１０４２、１０４３、１０４４、１０４５はそれぞれ、独立した（非共通）ポストフィックスの部分である。各ポストフィックスは、トライのレベル３において１つのノード１０２１、１０２２、１０２３、１０２４、１０２５、トライのレベル４において１つのノード１０３１、１０３２、１０３３、１０３４、１０３５、及びレベル５において１つのリーフノードを含む。レベル３におけるノード１０２１、１０２２、１０２３、１０２４、１０２５及びレベル４におけるノード１０３１、１０３２、１０３３、１０３４、１０３５はそれぞれ、１つのみの子を有する。
【０２２７】
第２の空間最適化によれば、１ノードの列の開始におけるノードは、「末端分岐ノード」と記される。図１０では、末端分岐ノードは、トライのレベル３におけるノード１０２１、１０２２、１０２３、１０２４、１０２５である。列内の残りのノードのキー部分の値は単に、それらの親ノードに含まれるビットマップ内の（設定）ビットの値によって決まるのではなく、「ネイティブ」又は文字通りの符号化で連続して格納される。本明細書では、この手法を「末端最適化」と呼ぶ。
【０２２８】
したがって、本発明の第２の空間最適化は、１つ又は複数のノードを含むトライであって、２つ以上の子ノードを有する、トライに含まれる親ノード、好ましくは少なくとも各親ノードは、ビットマップを含み、ノード、好ましくは各子ノードにはキー部分が関連付けられ、親が２つ以上の子ノードを有する子ノード、好ましくは少なくとも各子ノードのキー部分の値は、ビットが子ノードに関連付けられた親ノードに含まれるビットマップ内の（設定）ビットの値によって決まる、トライに適用される。
【０２２９】
ノードがメモリにおいて独立して割り振られるPh. Bagwell,“Fast And Space Efficient Trie Searches”, Technical Report, EPFL, Switzerland (2000)では、「ツリーテール圧縮」と呼ばれる手法が、文字列ノードへのポインタを参照し、又は末端分岐ノードに直接、末端列の数値を格納する。しかしながら、この手法は空間効率的ではなく、その理由は、オフセット及びノードタイプ（ビットマップを有するノード又は文字／ポインタリストを有するノード）をノードに格納する必要があるためである。
【０２３０】
本発明による末端最適化は、ビットが設定されていないビットマップにより、トライ内の１つのみの子ノードを有し、全ての子孫ノードが多くとも１つの子ノードを有するノード、好ましくは各ノードを末端分岐ノードと記すことにより、この問題を解決する。本発明は、常に少なくとも１ビットが設定された好ましい実施形態の標準ノードに含まれるビットマップの特別な品質を使用する。これは、全てゼロのビットマップを有するノードが、子ノードを有さないノードであるが、子ノードを有さないノードは、メモリにおいて表す必要がないためである。したがって、特別な意味は、ビットが設定されていないビットマップに起因することができ、末端分岐ノードのビットマップは、２つ以上の子ノードを有する親ノードに含まれるビットマップと同じ長さ又はフォーマットを有することができる。
【０２３１】
末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは各子孫ノードに関連付けられたキー部分の値は、子孫ノードの親ノードに含まれるビットマップにおける（設定）ビットの値によって決まらない。むしろ、キー部分の値は、表現に必要なメモリ空間が、２つ以上の子ノードを有する親ノードに含まれるビットマップよりも少ないように符号化される。通常、キー部分の値は、整数値等の二進数（数）として符号化される。例えば、標準ノードに含まれるビットマップが３２ビット、６４ビット、１２８ビット、又は２５６ビットをそれぞれ有する場合、末端分岐ノードの子孫ノードに関連付けられたキー部分は５ビット、６ビット、７ビット、又は８ビットによりそれぞれ符号化される。
【０２３２】
本発明の好ましい実施形態による末端最適化の一般格納構成を図１１に示す。ビットが設定されていない６４ビット幅ビットマップの後、二進数として符号化される幾つかの（通常、少なくとも２つの）６ビットキー部分が続く。しかしながら、好ましい実施形態では、各６ビットキー部分は８ビットブロック（１バイト）に格納される。利用可能な８ビットのうち６ビットしか使用しないため、これはいくらかの空間を無駄にするが、８ビット内の６から８ビットのうちの８への変換及びこの逆の変換は、実施の複雑性を上げ、性能を低下させる。本発明者によって行われた測定では、空間の無駄が許容できるものであり、８ビットのうちの８を格納することによる空間改善はごくわずかであることが示された。
【０２３３】
末端分岐ノード及び／又はその子孫ノードは、それらの１つの子ノード（もしあれば）へのポインタを含む必要がなく、その理由は、図１２に示されるように、子ノードがメモリにおいて親ノードに相対して予め定義された位置に、好ましくは親ノードの直後に格納することができるためである。更に、末端分岐ノード、好ましくは各末端分岐ノードの子孫ノード、好ましくは全ての子孫ノードに関連付けられたキー部分の値は、末端分岐ノード後、連続して格納される。最後に、図１２において観察することができるように、１ノード列では、末端分岐ノードの場合のみ、ノードを末端分岐ノードと記すためにビットマップを有する必要があり、一方、末端分岐ノードの子孫ノードはいずれも、ビットマップ、特に設定ビットが子ノードに関連付けられたキー部分の値を決めるビットマップを含む必要がない。
【０２３４】
図１４Ｃに示され、後述される例から明らかになるように、最も好ましい実施形態による末端最適化は、末端分岐ノードが２つ以上の子孫ノードを有する場合のみ、連鎖ノード最適化よりも空間効率的である。更に、１ノード列内の最初のノードが既に末端分岐ノードと記されており、したがって、末端分岐ノードの親が２つ以上の子ノードを有する場合、最大の空間節約を達成することができる。
【０２３５】
本発明による第２の空間最適化を図１２に示し、図１２は、末端最適化前のトライ１２１０の部分と、末端最適化が適用された後のトライ１２１０に対応するトライ１２２０の部分とを示す。トライ１２１０、１２２０のノードはここでも、長整数の配列に格納される。
【０２３６】
トライ１２１０は、１ビットのみが設定され（１）、他の全てのビットは設定されない（０）ノード１１１１のビットマップにより示されるように、１つのみの子を有する第１のノード１２１１を含む。一番右側のビットが値「０」を有し、一番左側のビットが値「６３」を有する６４ビット幅ビットマップ内の左から４番目のビットであることから分かるように、設定されている１ビットは値「６０」を有する。ノード１２１１は、ノード１２１１の子ノードであるノード１２１２を指す長整数である１つのポインタ１２１３を含む。ノード１２１１とノード１２１２との間の３つのドット（「．．．」）によって示されるように、ノード１１１２は通常、ノード１１１１の直後のメモリロケーションに格納されず、長整数の配列内の任意の場所に格納することができる。値「０１」を有するビットである、ノード１２１２の６４ビット幅ビットマップにおいて設定された右から２番目のビットによって示されるように、ノード１２１２も１つの子ノードを有する。しかしながら、ノード１２１２の子ノードはリーフノードであるため、ノード１２１２は子ノードへのポインタを含まず、リーフ部１２１４を含み、リーフ部１２１４は、ポインタ、マップの値（図７Ａ及び図７Ｂ参照）、又は集合の場合、空（図７Ｃ参照）であり得る。リーフノードはメモリにおいて表現されない。なお、好ましい実施形態では、トライの深さ又はトライに格納されるキーの長さは既知であるため、特定の「リーフインジケータ」は必要ない。
【０２３７】
観察することができるように、ノード１２１１は末端分岐ノードであり、その理由は、１つのみの子ノード１２１２を有し、全ての子孫ノード（１２１２及び１２１２の子ノード）が多くとも１つの子ノードを有する（ノード１２１２は１つの子ノードを有し、ノード１２１２の子ノードは子ノードを有さない）ためである。トライ１２２０は、末端最適化を適用した結果として、トライ１２１０から得られる。トライ１２１０のノード１２１１に対応するトライ１２２０のノード１２２１は、ビットが設定されていない６４ビット幅ビットマップを提供することにより末端分岐ノードとして記されている。トライ１２１１の子ノード１２１２に対応する子ノード１２２２に関連付けられたキー部分の値は、ノード１２２１のビットマップにおける（設定）ビットの値によって決まらない。むしろ、キー部分の値は、図１２において数字「６０」によって示されるように、ノード１２２１に含まれる、整数等の二進数として符号化される。キー部分の値のそのような表現は、たった６ビット（６４＝２６）しか必要とせず、したがって、必要とするメモリ空間は、２つ以上の子ノードを有する親ノードに含まれる６４ビット幅ビットマップよりもはるかに少ない。例えば、値６０は二進数「１１１１００」として符号化し得る。
【０２３８】
末端分岐ノード１２２１は、子ノード１２２２へのポインタを含まない。むしろ、子ノード１２２２は、親ノード１２２１に相対したメモリ内の予め定義された位置、すなわち、親ノードの直後に格納される。ノード１２２２は、末端分岐ノード１２２１の子孫ノードであり、ビットマップを含まず、子ノードへのポインタを含まず、図１２において数字「０１」によって示されるように、ノード１２２２の子ノードに関連付けられたキー部分の値を符号化する二進数のみを含む。例えば、値０１は二進数「０００００１」として符号化し得る。ノード１２２２の表現の後、メモリではリーフ部１２２４が続く。ここでも、リーフ部１２２４は、ポインタ、マップの値（図７Ａ及び図７Ｂ参照）、又は集合の場合、空（図７Ｃ参照）であり得る。
【０２３９】
ビットマップ及びノードに含まれる各ポインタの両方が長整数によって表される図１２の実施形態例では、末端最適化されたトライ１２２０は、ノード１２２１及び１２２２の格納に６４＋６＋６＝７６ビットを必要とする。これと比較して、最適化されていないトライ１２１０は、同じ情報（ノード１２１１及び１２１２、トライ１２１０及び１２２０の両方に存在するリーフ部１２１４はカウントに含めない）の格納に６４＋６４＋６４＝１９２ビットを必要とする。
【０２４０】
好ましい実施形態でのように、長整数の配列がトライの格納に使用される場合、本発明による末端最適化は、位置合わせ損失を被る。最悪の場合、１つの６ビットキー部分が６４ビット長整数に格納される。しかしながら、実験では、平均で、末端分岐ノードの子孫ノードの格納に使用される空間の５０％が占有されることが示された。更に、末端最適化はそれでもなお、必要とする空間は、ポインタ又は連鎖ノード最適化を用いて幾つかのシングル子ノードを格納するよりもはるかに少ない。
【０２４１】
標準ノード、連鎖ノード最適化によって最適化されたノード、及び末端最適化によって最適化されたデータに均一にアクセスする方法について、図１３を参照してこれより概説する。実施例においてクエリ実行モデルで使用されるノードアクセスの主な方法は、トライノードの全ての非空子ポインタでビットが設定されたビットマップを返すｇｅｔＢｉｔＳｅｔ（）及びビット数によって指定される所与のノード分岐の子ノードを返すｇｅｔＣｈｉｌｄＮｏｄｅ（ｂｉｔＮｕｍ）である。これらの方法は両方とも、インターフェースＣＤＢＩＮｏｄｅによって提供され、ここで、ＣＤＢＩは「コンフルエンスデータベースインデックス」を表す。別のインターフェースＣＤＢＩＮｏｄｅＭｅｍは、ＣＤＢＩＮｏｄｅインターフェースを通してのオブジェクト指向アクセスをデータモデルに提供する。
【０２４２】
解決する必要がある問題は、統一された中央場所で、コードの多くの場所で別個に対処する必要なく３つの事例をいかに扱うかであった。本発明者によって発見された解決策によれば、図１３に示すように、ノードは、ノードポインタ（インデックス）を介するのみならず、ベースノードインデックス（「ｎｏｄｅＲｅｆ」）及びノード内のインデックス（「ｉｄｘＩｎＮｏｄｅ」）も介して参照され、ポインタのない連鎖及び末端を、末端ノードの連鎖の冒頭を指すベースノードインデックスを有する１つのノードとして扱う。このようにして、メモリ空間最適化は、「ｇｅｔ」演算に大きな複雑性を追加せず、したがって、性能は低下しない。
【０２４３】
ｎｏｄｅＲｅｆは常に最初のビットマップを指すため、ｇｅｔＢｉｔＳｅｔ（）及びｇｅｔＣｈｉｌｄＮｏｄｅ（ｂｉｔＮｕｍ）の実装において３つの事例を検出するのに使用される：
−ビットマップは、２つ以上の設定ビットを有する場合、通常ノードに属する。ｇｅｔＢｉｔＳｅｔ（）はそのビットマップを返し、ｇｅｔＣｈｉｌｄＮｏｄｅ（ｂｉｔＮｕｍ）は、ｉｄｘ（子ノードへのポインタ）を決定し、ｎｏｄｅＲｅｆがそれに設定された（且つｉｄｘＩｎＮｏｄｅが０に設定された）新しいＣＤＢＩＮｏｄｅＭｅｍを返す。
−ビットマップは、０である（ビットが設定されていない）場合、末端分岐ノードに属する。ｇｅｔＢｉｔＳｅｔ（）は、ｉｄｘＩｎＮｏｄｅ位置に文字通り格納された６ビット値をビットマップに変換して返し、ｇｅｔＣｈｉｌｄＮｏｄｅ（ｂｉｔＮｕｍ）は、同じｎｏｄｅＲｅｆ及びｉｄｘＩｎＮｏｄｅ＋１を有する新しいＣＤＢＩＮｏｄｅＭｅｍを返す。
−ビットマップは、１ビットが設定されている場合、連鎖ノードに属する。ｇｅｔＢｉｔＳｅｔ（）はｉｄｘＩｎＮｏｄｅ位置におけるビットマップを返し、ｇｅｔＣｈｉｌｄＮｏｄｅ（ｂｉｔＮｕｍ）はここでも、同じｎｏｄｅＲｅｆ及びｉｄｘＩｎＮｏｄｅ＋１を有する新しいＣＤＢＩＮｏｄｅＭｅｍを返す。ＣＤＢＩＮｏｄｅＭｅｍは、時間がかかる新しい子ノードを作成せず、ただｎｏｄｅＲｅｆ及びｉｄｘＩｎＮｏｄｅ（ｇｏｔｏＣｈｉｌｄＮｏｄｅメソッド）を更新するだけで、すなわち、プロキシとして機能する既存のオブジェクトを変更することにより、フライウェイトパターンとして使用することもできる。
【０２４４】
図１４Ａ〜図１４Ｃは、第１のキーはキー部分値［００，０２，０２］を有し、第２のキーはキー部分値［００，０３，００，０１］を有する２つのキーを空のトライに挿入する場合のトライの成長を示す。図１４Ａは、値０を有するルートインデックスポインタによって示される空トライを示す。図１４Ｂは、キー部分値［００，０２，０２］を有する第１のキーを追加した後のトライを示す。前のエントリがないため、第１のキーは末端最適化を使用して格納される。図１４Ｃは、キー部分値［００，０３，００，０１］を有する第２のキーを追加した後のトライを示す。既存の末端ノードは分割される。１つのみの子を有するため、一致するプレフィックス（「００」）は連鎖ノードとして格納され、その後、２つの子ノード（「０２」及び「０３」）を有する通常ノードが続く。第１のキーの残り（「０２」）は、リーフ部を有するノードとして格納される（末端最適化を用いての格納はより多くの空間を必要とする）。第２のキーの残り（「００」及び「０１」）はここでも、末端最適化を使用して格納される。
【０２４５】
本発明の様々な実施形態によるデータ構造の空間要件を測定するために、完全長整数値範囲を有する長整数の無作為集合が格納される実験を行った。図１５は測定結果を示し、ｘ軸は、トライインデックスにロードされたエントリ数を対数尺度で示し、ｙ軸は、１エントリの格納に必要とされた平均バイト数を示す。
【０２４６】
連鎖ノード最適化単独で、空間要件は約４０％低下し、末端最適化単独で約６０％〜約７０％低下したことを観察することができる。連鎖ノード最適化と末端最適化との組合せは、末端最適化単独と比較して目に見える空間改善を提供しなかった（グラフは末端最適化の場合と重なる）。しかしながら、本発明者により実行された経験的測定は、両最適化を一緒に適用することに価値がまだあること示した。連鎖ノード最適化が末端最適化に加えて適用される場合、辿る必要があるポインタ数が少なく、データ局所性がより高く、メモリ階層（ＣＰＵキャッシュ）を守るため、性能は高まる。
【０２４７】
ビットマップ圧縮
本発明の第３の空間最適化は、メモリにおいて、トライが疎に存在するトライのよりコンパクトな表現を提供する。これは、同じ値のセクション（例えば、疎に存在するノードの場合、値０を有するセクション又は密に存在するノードの場合、値１を有するセクション）を群化し効率的に格納することにより、ビットマップ（例えば、子ノードのキー部分値を示すビットマップ）のメモリ空間を低減することができる。本明細書ではこの第３の空間最適化を「ビットマップ圧縮」と呼ぶ。
【０２４８】
本発明の第３の空間最適化は、１つ又は複数のノードを含むトライに適用され、ここで、２つ以上の子ノードを有するノード、好ましくは少なくとも各親ノードは、論理ビットマップの形態のビットマップと、幾つかのポインタとを含み、各ポインタには論理ビットマップにおいて設定されたビットが関連付けられ、各ポインタはノードの子ノードを指す。論理ビットマップは、本発明の他の態様に関して述べたように、キー部分値を含むビットマップに対応する。最適化は、論理ビットマップが複数のセクションに分割され、ヘッダビットマップ及び幾つかのコンテンツビットマップによって符号化されることにより達成され、ここで、各セクションにはヘッダビットマップ内のビットが関連付けられ、１つ又は複数のビットが設定された論理ビットマップの各セクションについて、ヘッダビットマップ内のセクションに関連付けられたビットは設定され、セクションはコンテンツビットマップとして格納される。
【０２４９】
ヘッダビットマップ及び幾つかのコンテンツビットマップを使用して、論理ビットマップを格納することは、ビットが設定されていない論理ビットマップのセクションのコンテンツビットマップを省くことによって必要とされるメモリ空間を大幅に低減することができる。換言すれば、少なくとも１つの設定ビットを有するコンテンツビットマップ（すなわち、論理ビットマップのセクション）のみがメモリに格納される。論理ビットマップの各セクションが少なくとも１つの設定ビットを有する最悪の状況では、追加のヘッダビットマップを格納する必要があるため、メモリ使用はわずかに増大する。しかしながら、ノードは一般に疎に存在し、したがって通常、ビットマップ圧縮を使用する場合、必要なメモリは少なくなる。
【０２５０】
本発明のビットマップ圧縮の一実施形態を図１６に示し、図１６は、ビットマップ圧縮なしの論理ビットマップ１６０２を含む親ノードを有するトライ１６０１のセクションを上部に示す。図１６の下部において、ビットマップ圧縮がトライ１６０１の親ノードに適用された後に得られた親ノードを有するトライ１６１１のセクションを示す。トライ１６１１の親ノードは、ビットマップ圧縮から生じたヘッダビットマップ１６１２及び２つのコンテンツビットマップ１６１３、１６１４を含む。
【０２５１】
両トライ１６０１、１６１１内の親ノードはポインタ１６０３〜１６０５を更に含む。トライ１６０１において、各ポインタには、論理ビットマップ１６０２において設定されたビット１６０６〜１６０８が関連付けられる。トライ１６１１では、ポインタ１６０３〜１６０５には、コンテンツビットマップにおいて設定されたビット１６１６〜１６１８が関連付けられる。
【０２５２】
トライ１６０１内の論理ビットマップは、下部１６１１において、論理ビットマップ１６０２をセクション１６２１（例えば、８ビットの）に分割し、少なくとも１つの設定ビットを有するセクション１６２２、１６２３をコンテンツビットマップ１６１３、１６１４に格納することにより、ヘッダビットマップ１６１２及びコンテンツビットマップ１６１３、１６１４に変換される。設定されたビットがないセクションは、コンテンツビットマップとして格納されない。ヘッダビットマップ１６１２内の各ビットは、論理ビットマップの異なるセクションを表す。コンテンツビットマップ１６１３、１６１４は、ヘッダビットマップ１６１２において設定された各ビット１６１９、１６２０によって参照される。コンテンツビットマップ１６１３、１６１４は、セクションに関連付けられた設定ビット１６１９、１６２０がヘッダビットマップ１６１２に配置されるのと同順（図示せず）又は逆順で格納し得る。換言すれば、論理ビットマップの全てのコンテンツビットマップ内のあるコンテンツビットマップのランクは、ヘッダビットマップ内の全ての設定ビット内のそのコンテンツビットマップのセクションに関連付けられた設定ビットのランクに対応し得る。このようにして、トライを処理しながらコンテンツビットマップを容易にアドレス指定することができる。また、論理ビットマップのセクションは、好ましくは、メモリ内で全てコヒーレントである。したがって、論理ビットマップ全体は、ヘッダビットマップに続く幾つかのコンテンツビットマップにより、メモリにおいてコヒーレントに表すことができる。
【０２５３】
好ましい実施形態では、全てのセクションは同じサイズを有する。同じサイズのセクションは、セクションの構造についての更なる情報が必要ないため、論理ビットマップの圧縮及び圧縮解除の効率的な処理を可能にする。また、ヘッダビットマップもセクションと同じサイズであり得る。
【０２５４】
ヘッダビットマップ及びコンテンツビットマップの格納に異なる構造を使用することもできる。論理ビットマップのヘッダビットマップ及びコンテンツビットマップは、配列、リスト、又は連続した物理若しくは仮想メモリロケーションに格納し得る。図１６に示すように、ヘッダビットマップ及びコンテンツビットマップが１バイトのサイズを有する場合、ビットマップは、トライ１６０１又は図９及び図１２〜図１４のトライで行われるように、長整数の配列の代わりにバイトの配列に格納し得、これにより位置合わせ損失が低減する。コンテンツビットマップは、好ましくは、ヘッダビットマップに相対して予め定義されたメモリ位置に格納される。コンテンツビットマップ及びヘッダビットマップを互いの近くに格納することにより、処理効率を改善し得る。図１６では、コンテンツビットマップは、メモリにおいてヘッダビットマップの直後に格納される。
【０２５５】
上述したビットマップ圧縮は、子ノードの参照に使用されるポインタのようなポインタに適用することもでき、直列化リーフビットマップに適用することもできる。これは通常、空間効率を更に改善するが、性能を損ない、その理由は、特定のポインタのオフセットを計算する際、可変サイズ符号化により、ポインタを通して反復する必要があるためである。
【０２５６】
ビットマップ圧縮は、本発明の他の態様と組み合わせ得る。例えば、ポインタ低減と組み合わせて、ビットが設定されていない（論理）ビットマップにより記される本発明による末端分岐ノードは、いかなるコンテンツビットマップもなく、ヘッダビットマップのみとして符号化し得る。
【０２５７】
図１７は、図１５を参照して上述した実験の結果を示す。しかしながら、連鎖ノード最適化及び末端最適化に加えて、ビットマップ圧縮が適用された。図１５との比較において観察することができるように、ビットマップ圧縮により達成された空間節約は、連鎖ノード又は末端最適化が適用されない場合、約４０％であり、連鎖ノードのみが加えて適用された場合、約５０％〜約７０％であり、末端最適化のみ又は連鎖ノード及び末端最適化の両方が加えて適用された場合、約３０％〜約６０％である。
【０２５８】
キー符号化
本発明は、固定サイズ又は可変サイズのキー（例えば、文字列）を有する異なるプリミティブデータ型のキー及びトライ内のプリミティブデータ型の２つ以上の項目を含む複合キーを格納する方法を提供する。
【０２５９】
制御情報を含むキー
本発明の好ましい実施形態では、キーは、キーに格納された構成要素の数、データ型、又は長さについての事前知識なしであっても、例えば、カーソルにより反復することができるような柔軟な方法で符号化することができる。
【０２６０】
これらの実施形態は、データベースアプリケーション又は情報検索システムで使用されるトライ、例えば、上述したトライ及びトライデータ構造の実施形態の１つによるトライ又はトライデータ構造に適用される。トライは１つ又は複数のノードを含み、ノード、好ましくは各子ノードにはキー部分が関連付けられ、ルートノードからトライ内の別のノード、特にリーフノードへのパスは、ノードに関連付けられたキーを定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものである。上述した柔軟性は、キーが、コンテンツ情報に加えて制御情報を含むことにより達成される。
【０２６１】
キーは通常、１つ又は複数のキー部を含み、各キー部はコンテンツ情報を含み、コンテンツ情報は、キーに含まれる全体コンテンツ情報の一部である。キー部のそれぞれについて、制御情報は好ましくは、キー部に含まれるコンテンツ情報のデータ型を指定するデータ型情報要素を含む。
【０２６２】
原理上、キー部に関連付けられた制御情報及びコンテンツ情報を配置する２つの方法がある。第１の方法を図１８に示し、図１８では、キー部又は好ましくは各キー部１０、２０、３０は、データ型情報要素（図１８における陰影付き要素）及びコンテンツ情報要素を含む。データ型情報要素は、コンテンツ情報要素のデータ型を指定する。これは、制御情報及びコンテンツ情報が両方とも異なるキー部１０、２０、３０にわたり分散していることを意味する。この場合、キーのデータ型情報要素又は各データ型情報要素は通常、好ましくはデータ型情報要素の（直）前に、キー内のデータ型情報要素に関連付けられたコンテンツ情報要素によって配置される。したがって、データ型情報要素は、キー部１０、２０、３０のプレフィックス又はヘッダ要素のようである。
【０２６３】
キー部に関連付けられた制御情報及びコンテンツ情報を配置する第２の方法を図１９に示し、図１９は、データ型情報要素（図１９における陰影付き要素）は、一緒に配置され、好ましくは、データ型を指定するコンテンツ情報要素と同順又は逆順で配置される。データ型情報要素のような制御情報は、好ましくは、キーのプレフィックス又はヘッダ要素として、キーにおいてコンテンツ情報の前に配置される。本発明者によって行われた研究では、同じデータ型を有するキーが同じプレフィックス（トライ内の開始ノード）を有し、したがって、トライ内で必要とされるノード数が低減し、空間節約に繋がるため、データ型情報要素を格納するこの第２の方法が好ましいことが分かった。
【０２６４】
キー部に関連付けられたコンテンツ情報のデータ型は整数、長整数、倍精度浮動小数点、若しくは時間／日付けプリミティブの場合等の固定サイズであってもよく、又は文字列、例えば、ユニコード文字列若しくは可変精度整数の場合等の可変サイズであってもよい。本発明の幾つかの実施形態では、キーは、異なる（プリミティブ）データ型のコンテンツ情報を含む２つ以上のキー部を含む。
【０２６５】
図２０及び図２１を参照して以下に説明するように、制御情報は、例えば、データ型情報要素の高位ビットのステータスによって最後のキー部を識別する情報を含み得る。代替的には、キー部カウントは別個に格納することができる。更に、制御情報は、トライが動的集合の格納に使用されるか、それとも連想配列の格納に使用されるかについての情報を含み得る。
【０２６６】
キー部のコンテンツ情報は、１つのキー部分に含まれ得るが、通常、２つ以上のキー部分に含まれる。固定サイズのキー部の場合、キー部に含まれるコンテンツ情報を含むために必要なキー部分の数は通常、既知である。キー部に含まれるコンテンツ情報のデータ型が可変サイズのデータ型である場合、コンテンツ情報要素の終わりは、特定のシンボル、例えば、文字列の最後の文字としてヌル文字（「
【表１】
2020098583.tif 000003
」、ＡＳＣＩＩではＮＵＬと呼ばれる）を有するヌル終端文字列により記し得る。代替的又は好ましくは、図２１を参照してユニコード文字列について以下に説明するように、キー部を含むキー部分の特定の１つ内の特定のビットによって記し得る。
【０２６７】
上述したように、キー部のコンテンツ情報は多くの場合、２つ以上のキー部分に含まれるが、キー部分は、好ましくは、２つ以上のキー部のコンテンツ情報を含まない。換言すれば、キー部のコンテンツ情報は、キー部分の境界と位置合わせされる。同様に、キー部分は、好ましくは、データ型情報要素、キー部カウント、又はトライが動的集合の格納に使用されるか、それとも連想配列の格納に使用されるかについての情報のような２つ以上の制御情報要素の情報を含まない。この手法は通常、大きな位置合わせ損失なしで、実装をより容易且つ効率的にする。更に、これにより、以下に説明するように、異なるキー部のコンテンツ情報をインタリーブ様式で格納できるようになる。
【０２６８】
本発明によるキー符号化の一例を図２０に示す。トライに格納するキーは、制御情報２０１０及びコンテンツ情報２０２０を含む。キーは、コンテンツ情報を含む幾つかのキー部を含み、キー部のそれぞれについて、制御情報２０１０は、キー部に含まれるコンテンツ情報のデータ型を指定するデータ型情報要素２０１２、２０１３を含む。更に、制御情報２０１０は、トライが動的集合の格納に使用されるか、それとも連想配列の格納に使用されるかについての情報２０１１を含む。トライが連想配列の格納に使用される場合、キーに関連付けられたトライのリーフノードは通常、リーフ値２０３０又はそのようなリーフ値へのポインタを含む。
【０２６９】
上述したように、本発明の好ましい実施形態では、トライ内の各親ノードは６４ビット幅ビットマップを含み、したがって、トライ内の各キー部分は６ビット値を格納することが可能である。トライが動的集合の格納に使用されるか、それとも連想配列の格納に使用されるかについての情報２０１１は、第１のキー部分によって格納され、したがって、６ビットがこの情報に使用される。実際には、このイエス／ノー情報に対して１ビットで十分であるが、上述した位置合わせの理由で、６ビット値を格納可能なキー部分全体が使用される。情報は、各ビットが設定された６４ビット幅ビットマップ及びノード２０４１の各子ノードへのポインタ（ｉｄｘ）を含む情報がノード２０４１に符号化される。
【０２７０】
データ型情報要素２０１２、２０１３のそれぞれも、１つのキー部分によって格納され、その値はノード２０４２、２０４３のビットマップに符号化される。５ビットがデータ型情報に使用され、それにより、３２個の異なるタイプの識別子が可能である。各キー部分によって格納することができる６番目のビット、例えば、キー部分の高位ビットは、データ型情報要素に関連付けられたキー部がキー内の最後のキー部であるか否かを示すのに使用される。図２０の例では、データ型情報要素２０１３の高位ビットは、データ型情報要素２０１３に関連付けられたキー部がキー内の最後のキー部であることを示すように設定される。
【０２７１】
各キー部に含まれるコンテンツ情報も、一般に６ビットの値２０２１、２０２２に分解され、各値は１つのキー部分によって格納される。ビットマップが（６ビット）値２０２１、２０２２の符号化に使用されるノードは、スペースの理由で図２０に示されていない。例えば、キー部が３２ビット整数値を含む場合、この３２ビット値は６つのキー部分によって格納され、そのうちの最初のキー部分は２ビット値を格納し、最後の５つはそれぞれ６ビット値を格納する（３２＝２＋６＋６＋６＋６＋６）。
【０２７２】
図２１は、本発明により符号化されたキーを格納するトライを示す。トライの各親ノードは、６４ビット幅ビットマップを含む。キーは、値「１００」を有する３２ビット整数を含む第１のキー部と、値「ａｂ」を有する文字列を含む第２のキー部とを含む。キーの制御情報は、（１）動的集合識別子、（２）整数識別子、及び（３）最後のタイプのマーカを有する文字列型識別子を含む。キーのコンテンツ情報は、（１）３２ビット整数値「１００」及び（２）ユニコードで符号化された文字列値「ａｂ」を含む。
【０２７３】
動的集合識別子は値０の６ビット数（０ｘ００）である。したがって、図２１のトライのルートノード２１００のビットマップは、値「０」が設定されたビットを有し、このビットに関連付けられた第２レベルのノードには、値「０」のキー部分が関連付けられる。整数識別子は値５の６ビット数（０ｘ０５）である。したがって、第２レベルのノードのビットマップは、値「５」が設定されたビットを有し、このビットに関連付けられた第３レベルのノードには、値「５」のキー部分が関連付けられる。最後のキー部のマーカを有する文字列型識別子は、値３９の６ビット数（０ｘ２７）である。したがって、第３レベルのビットマップは値「３９」が設定されたビットを有し、このビットに関連付けられた第４レベルのノードには、値「３９」のキー部分が関連付けられる。
【０２７４】
整数値「１００」は、「００  ００００００  ００００００  ００００００  ０００００１  １００１００」として３２ビット二進数で符号化される。したがって、整数値「１００」の格納に使用されるレベル５〜レベル１０のノードに関連付けられたキー部分には、値０（０ｘ００）、０（０ｘ００）、０（０ｘ００）、０（０ｘ００）、１（０ｘ０１）、及び３６（０ｘ２４）がそれぞれ関連付けられる。
【０２７５】
文字列値「ａｂ」は、文字「ａ」のユニコード値の後に、文字「ｂ」のユニコード値が続くものとして符号化される。各ユニコード文字は、ユニコード値に応じて２〜４個のキー部分を使用して格納され、これは１０ビット、１５ビット、又は２１ビットを必要とし得る。本発明の好ましい実施形態で使用されるユニコード文字の符号化方式は以下である：
１０ビットユニコード文字：００ｘｘｘｘ  ｘｘｘｘｘｘ
１５ビットユニコード文字：０１０ｘｘｘ  ｘｘｘｘｘｘ  ｘｘｘｘｘｘ
２１ビットユニコード文字：０１１ｘｘｘ  ｘｘｘｘｘｘ  ｘｘｘｘｘｘ  ｘｘｘｘｘｘ
【０２７６】
文字列内の最後の文字は、高位ビットを設定することによって記され、これにより、最後の文字の符号化方式は以下になる：
１０ビットユニコード文字：１０ｘｘｘｘ  ｘｘｘｘｘｘ
１５ビットユニコード文字：１１０ｘｘｘ  ｘｘｘｘｘｘ  ｘｘｘｘｘｘ
２１ビットユニコード文字：１１１ｘｘｘ  ｘｘｘｘｘｘ  ｘｘｘｘｘｘ  ｘｘｘｘｘｘ
【０２７７】
ユニコード文字「ａ」は値９７（０ｘ６１）を有し、「０００１  １００００１」として１０ビットを用いてユニコードで符号化される。好ましい実施形態で使用される符号化方式によれば、ユニコード文字「ａ」は「０００００１  １００００１」として符号化される。ユニコード文字「ｂ」は値９８（０ｘ６２）を有し、「０００１  １０００１０」として１０ビットを用いてユニコードで符号化される。好ましい実施形態で使用される符号化方式によれば、ユニコード文字「ｂ」は「１００００１  １０００１０」として符号化され、「ｂ」は値「ａｂ」を有する文字列内の最後の文字であるため、高位ビットが設定される。したがって、文字列値「ａｂ」の格納に使用されるレベル１１〜１４のノードに関連付けられたキー部分には、値１（０ｘ０１）、３３（０ｘ２１）、３３（０ｘ２１）、及び３４（０ｘ２２）がそれぞれ関連付けられる。
【０２７８】
インタリーブされた多項目キー
本発明の実施形態は、２つ以上のデータ項目を含むクエリをより効率的に実行することができるようにデータを格納する方法を提供する。本発明による手法は特に、より効率的に問い合わせることができるように、キー若しくはキー及び値をデータベース又は情報検索システムに格納し、データベース又は情報検索システムクエリの結果キー若しくは結果キー及び結果値を格納し、又はクエリをより効率的に実行することができるように、データベースクエリの入力キー若しくは入力キー及び入力値を格納するのに有用である。
【０２７９】
本発明のデータを格納する方法は上述したデータ構造を有するトライ等のトライを使用し、トライはノードを含み、ノード、好ましくは各子ノードにはキー部分が関連付けられ、ルートノードからトライ内の別のノードへのパスは、ノードに関連付けられたキーを定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものである。複数のデータ項目を含むクエリにおいて性能利得を達成するために、２つ以上のデータ項目がキーに符号化され、少なくとも１つ又は２つのデータ項目、好ましくは各データ項目は２つ以上の構成要素からなる。キーは、２つ以上の連続セクションを含み、少なくとも１つ又は２つのセクション、好ましくは各セクションは、キーに符号化されたデータ項目の２つ以上の構成要素を含む。「項目」は、本明細書では「次元」と呼ばれることもあり、上記の「キー部」又は「キー部のコンテンツ情報」と呼ばれるものに対応し得る。
【０２８０】
図２２は、値（Ｘ＝１２，Ｙ＝４５）を有する二次元キー、すなわち、２つのデータ項目Ｘ及びＹを符号化するキーの一例を示す。これらのデータ項目は両方とも、項目Ｘの場合、２つの構成要素、すなわち、「１」及び「２」からなり、項目Ｙの場合、「４」及び「５」からなる。キーは、２つの連続セクションＳ１及びＳ２を含む。両セクションは、キーに符号化されたデータ項目ｘ及びｙのそれぞれの１つの構成要素を含み、セクションＳ１は、データ項目Ｘの１番目の構成要素「１」及びデータ項目ｙの１番目の構成要素「４」を含み、セクションＳ２は、データ項目Ｘの２番目の構成要素「２」及びデータ項目Ｙの２番目の構成要素「５」を含む。好ましい実施形態では、キーが、Ｘ１Ｙ１Ｘ２Ｙ２等のインタリーブ様式で複数のデータ項目を符号化すると言える。
【０２８１】
好ましい実施形態によれば、キーの符号化は、キーのセクション、好ましくは各セクションが、キーにおいて符号化された各データ項目から少なくとも及び／又は多くとも１つの構成要素を含むようなものである。例えば、図２２に示されるキーの両セクションＳ１及びＳ２は、キーに符号化されるデータ項目Ｘ＝１２及びＹ＝４５のそれぞれの厳密に１つの構成要素を含む。
【０２８２】
更に、キーの２つ以上、好ましくは全てのセクションについて、異なるデータ項目に属する構成要素は、セクション内で同じシーケンスで並べられる。例えば、図２２に示されるキーの両セクションにおいて、構成要素は、データ項目Ｘの構成要素が最初に来て、データ項目Ｙの構成要素が次に来るようなシーケンスで並べられる。
【０２８３】
更に、データ項目の構成要素を含むセクションの順序は、好ましくは、データ項目内の構成要素の順序に対応する。例えば、図２２に示されるキーでは、セクションＳ１の後にセクションＳ２が続き、これは各項目内でキーが構成要素を含む順序に対応し、Ｓ１は項目Ｘの構成要素「１」を含み、これは、項目Ｘ内で、セクションＳ２に含まれる構成要素「２」の前に来る。Ｓ１は項目Ｙの構成要素「４」も含み、これは、項目Ｙ内で、セクションＳ２に含まれる構成要素「５」の前に来る。
【０２８４】
キーの２つ以上、好ましくは全てのデータ項目は、同数の構成要素を有する。例えば、図２２に示されるキーに符号化される項目Ｘ及びＹは両方とも２つの構成要素を有する。しかしながら、キーのデータ項目は、異なる数の構成要素を有することもできる。これは、例えば、１つの項目が６４ビット整数であり、別の項目が３２ビット整数である場合であり得る。キーがＸ１Ｙ１Ｘ２Ｙ２等の厳密に規則正しいインタリーブ様式でデータ項目を符号化する場合、少数の構成要素を有するデータ項目を充填し得、結果として、例えば、Ｘ１Ｙ１Ｘ２Ｙ２Ｘ３＊Ｘ４＊等になる。代替的には、例えば、Ｘ１Ｙ１Ｘ２Ｙ２Ｘ３Ｘ４になるようにインタリーブ手法を変更する必要があり得る。
【０２８５】
図２３は、図２２に示されるキーをトライにいかに格納することができるかの一例を与える。好ましい実施形態では、子ノード、好ましくは各子ノードに関連付けられたキー部分は、データ項目の一構成要素に対応する。換言すれば、データ項目、好ましくは各データ項目の構成要素、好ましくは各構成要素は、トライの１つの子ノードに関連付けられたキー部分に対応する。図２３の例では、第２レベルのノード２３０２には、項目Ｘの最初の構成要素に対応するキー部分１が関連付けられ、第３レベルのノード２３０３には、項目Ｙの最初の構成要素に対応するキー部分４が関連付けられ、第４レベルのノード２３０４には、項目Ｘの２番目の構成要素に対応するキー部分２が関連付けられ、第５レベルのノード２３０５には、項目Ｙの２番目の構成要素に対応するキー部分５が関連付けられる。これは好ましくないが、子ノードに関連付けられたキー部分は、データ項目の構成要素の一部のみ又はデータ項目の２つ以上の構成要素に対応することもできる。
【０２８６】
図２２及び図２３の例では、データ項目Ｘ及びＹは２桁の十進数であり、構成要素は十進数である。本発明によるトライに格納されるキーに符号化されるデータ項目の他の例は、経度又は緯度等のジオロケーションデータ、インデックス、整数、長整数若しくは倍長整数、３２ビット整数、若しくは６４ビット整数等の任意の種類若しくはデータ型の数、文字列、バイト配列、又はこれらの２つ以上の組合せである。
【０２８７】
データ項目が数である場合、データ項目の構成要素は数字（図２２及び図２３の例のように）であり得る。データ項目が文字列の場合、データ項目の構成要素は一文字であり得る。データ項目がバイト配列の場合、データ項目の構成要素は１バイトであり得る。
【０２８８】
しかしながら、好ましい実施形態では、データ項目の構成要素は、データ項目の二進数符号化のビット群であり、ビット群は好ましくは６ビットを含む。これは、先に説明したように、好ましい実施形態では、子ノードのキー部分の値が、ビットが子ノードに関連付けられた親ノードに含まれるビットマップ内の（設定）ビットの値によって決まるためである。その結果、ビットマップのサイズは、キー部分に可能な英字を定義する。例えば、各ビットマップが６４ビットサイズを有する場合、ノードのキー部分に利用可能な異なる値の数は２６である。これは、データ項目の二進数符号化の６ビットを含むビット群を、ノードに関連付けられたキー部分で表すことができることを意味する。３２ビットビットマップが使用される場合、５ビットを含む群を表すことができる等である。
【０２８９】
例えば、データ項目が６４ビット長整数であり、各構成要素が、整数の二寸数符号化の６ビット群である場合、データ項目は６４／６＝１１個の構成要素を有する。データ項目がユニコードで符号化される文字である場合、先に説明したように、２ビット〜６４ビットの構成要素を有し得る。データ項目が、幾つかの文字で構成される文字列である場合、好ましい実施形態における構成要素はなお６ビット群であり、すなわち、文字列は、任意の他のデータ項目のように、同じタイプの構成要素（６ビット群）を有する。文字列の数構成要素は、１文字の構成要素の数を文字列内の文字数で乗算したものに対応する。
【０２９０】
ビット群、例えば、６ビット群として好ましい実施形態の構成要素を見なす代わりに、予め定義された基数又は底、例えば６４を有する数字として見なすこともできる。
【０２９１】
複数のデータ項目を有するキーを格納するインタリーブ方法は、図４５及び図４６並びに図６１〜図６５を参照した範囲クエリの以下の説明から容易に明らかになるように、複数のデータ項目を含む範囲クエリの性能を大きく改善することができる。更に、インタリーブ格納が、双方向サーチ及び複数のデータ項目を含む「ＮＯＴ」演算を含むサーチで性能を改善することができることを当業者は理解しよう。
【０２９２】
集合演算
本発明の実施形態は、データベース若しくは情報検索システムに格納された２以上のキーの集合又はデータベースクエリ若しくは情報検索システムクエリの結果キーの集合に対する論理積（ブールＡＮＤ）、論理和（ブールＯＲ）、差分（ブールＡＮＤ  ＮＯＴ）、及び排他的論理和（ブールＸＯＲ）等の演算を含むデータベース又は情報検索システムにおいてクエリを実行する時間効率的な方法を提供する。本明細書では、これらの演算は「集合演算」又は「論理演算」と呼ばれる。
【０２９３】
なお大半のデータベースはＶｏｌｃａｎｏ処理モデルを使用しており、これは「一度に１タプル」を意味する。しかしながら、これは、複数レベルのキャッシュ及びインメモリデータベースを考慮すると、近代のＣＰＵアーキテクチャには効率的ではない。物理的実行プラン内の全ての演算は密にインタリーブされて実行されるため、演算子の結合命令フットプリントは、大きすぎて命令キャッシュに収まらないことがあり、演算子の結合状態は、大きすぎてデータキャッシュに収まらないことがある。したがって、幾つかのデータベースは一度に１演算子モデル又は両方の組合せであるベクトル化実行モデルを適用する。本発明によるインデックスデータ構造及び統一されたレベル単位処理モデルは、インデックストライへのアクセス及び演算子実装に関して非常にリーンな命令フットプリントを生じさせる。
【０２９４】
図２４は、従来技術によるデータベースクエリ処理の様々なフェーズの例示的な流れ図を示す。クエリは解析され（２４０１）、書き換えられ（２４０２）、最適化され（２４０３）、クエリ実行エンジン（ＱＥＥ２４０５）がデータベース２４０６への先行ステップにより生成されたＱＥＰを実行することができるようにクエリ実行プランＱＥＰが準備され改善される（２４０４）。
【０２９５】
図２５は、従来技術によるデータベースで使用される例示的なＱＥＰを示す。ＱＥＰはツリーで表され、ツリーでは、親ノード２５０１、２５０２は演算子であり、リーフ２５０３、２５０４はデータソースである。最初の演算では、テーブルスキャン２５０４からの結果はソート演算子２５０２によってソートされる。２番目の演算では、ソートの結果はインデックススキャン２５０３の結果と併合結合される。
【０２９６】
図２６は、従来技術によるデータベースの反復子ベースの実行モデルにおける演算子制御及びデータフローを示し、ここでは、演算子は以下のメソッドを実施する：Ｏｐｅｎ（データの生成に向けて演算子を準備する）、Ｎｅｘｔ（演算子消費者の需要下で新しいデータユニットを生成する）、及びＣｌｏｓｅ（実行を終了させ、リソースを解放する）。Ｎｅｘｔメソッドへの各呼び出しは新しいタプルを生成する。
【０２９７】
反復子ベースの実行モデルは、演算子の統一モデルを提供し、この統一モデルは、データソース（データベーステーブル又はデータベースインデックス）のデータモデルから独立し、演算子ノードの中間結果を統一する。しかしながら、データの１つのみのユニット、例えば、レコードのみが演算子呼び出し毎に送られる。この手法は、それら実施形態が小さな結果集合を返す大きなサブ結果集合を結合する演算子にとっては非効率的である。
【０２９８】
図２７に示されるように、タプルを他の演算子に渡してもよく、図２７は、従来技術によるデータベースのクエリ実行モデルによる一度の１タプル処理を示す。ルート演算子２７０１から始まり、ｎｅｘｔ（）への呼び出しは演算子の子２７０２、２７０３に伝搬され、データソース（及びツリー表現のリーフ）に達するまで以下同様である。このようにして、制御は消費者から生産者まで下に流れ、データはクエリ実行プラン演算子ツリー内で生産者から消費者に上に流れる。
【０２９９】
１度に１タプル処理モデルは、小さな中間結果、ひいては低メモリ要件を有する。実行プラン内の演算子は密にインタリーブされて実行され、かなり複雑であり得る。しかしながら、膨大な量の関数呼び出し及び全演算子の結合状態は、大きな関数呼び出しオーバーヘッド並びに命令及びデータキャッシュミスを生じさせ、その理由は、フットプリントが往々にして大きすぎ、ＣＰＵキャッシュに収まらないためである。
【０３００】
反復子ベースの実行モデル及び１度に１タプル処理モデルは両方とも、効率的であるには、高度なクエリオプティマイザを必要とする。
【０３０１】
図２８は、リストのような、適したデータ構造で、演算子の結果として全てのタプルを即座に返す、従来技術によるデータベースのクエリ実行モデルによる１度に１演算子処理を示す。１度に１演算子手法は、低関数呼び出しオーバーヘッドを有する密なループを有してキャッシュ効率的であるが、データキャッシュに収まらず、更にはメインメモリにも収まらないことがある大きな中間結果を演算子毎に生み出し、この手法を無用なものにし得る。
【０３０２】
本発明は、全てのデータソースがトライである新規の実行モデルにより従来技術の問題を解決する。２つ以上の入力トライが各論理演算（集合演算）に従って組み合わせられて、各結果トライのノードに関連付けられたキーの集合を取得する。
【０３０３】
次に、データベースクエリは、出力として、結果トライのノードに関連付けられたキーの集合又は結果トライのノードに関連付けられたキーのサブセット、特に結果トライのリーフに関連付けられたキー、又は結果トライのノードに関連付けられたキーから導出されたキー若しくは値の集合を提供する。代替的には、データベースクエリは、ドキュメント識別子等の結果トライのノードに関連付けられた他のデータ項目を提供し得る。出力として提供されたキーの集合は、トライで提供し得る。本明細書では、「結果トライ」の概念が、論理演算を使用して入力トライを組み合わせる際に取得する必要があるキーの集合を定義するために使用されることに留意されたい。しかしながら、結果トライは必ずしも、入力トライの組み合わせ中、物理的トライデータ構造において形成する必要はなく、例えば、カーソル又は反復子によりキーの出力集合を提供することもできる。
【０３０４】
論理演算が差分（ＡＮＤ  ＮＯＴ）である場合、結果トライ内の親ノードは、第１の入力トライ内の親ノードであり、結果トライの親ノードのリーフは、第１の入力トライ内の対応する親ノードの子ノードの集合と、他の入力トライがある場合、他の入力トライ内の対応する親ノードの子ノードの集合とのＡＮＤ  ＮＯＴ結合である。論理演算が差分ではない場合、例えば、論理演算が論理積（ＡＮＤ）、論理和（ＯＲ）、又は排他的論理和（ＸＯＲ）である場合、結果トライ内の各ノードの子ノードの集合は、入力トライ内の対応するノードの子ノードの集合の論理演算（例えば、ＡＮＤ、ＯＲ、又はＸＯＲ）を使用した結合である。この状況では、各子ノードにキー部分に関連付けられ、ルートノードからトライ内の別のノードへのパスが、ノードに関連付けられたキーを定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものであり、異なるトライの２つ以上のノードは、異なるトライのノードに関連付けられたキーが同一である場合、互いに「対応」する。
【０３０５】
好ましい実施態様では、あらゆる演算子はそれ自体、例えば、各トライ（ノード）インターフェースを実施することにより、クエリ実行プランツリー内のルート演算子ノードまで、消費者にとってトライとして再び見える。したがって、反復子インターフェースを使用する代わりに、ノードインターフェースを使用することができる。これにより、機能合成及びより簡易且つクリアなソフトウェアアーキテクチャが可能になり、データベースエンジンの性能を更に改善し、その理由は、より低い実施複雑性が、関数呼び出しオーバーヘッドの低下並びにデータ及び命令キャッシュミスの低下に直接繋がるためである。
【０３０６】
好ましくは、トライを実施するデータ構造は上述したようなものである。特に、入力トライ内のノード、好ましくは入力トライ内の少なくとも全ての親ノードがビットマップを含み、トライ内の子ノードのキー部分の値が、子ノードに関連付けられたビットを有する親ノードに含まれるビットマップ内の（設定）ビットの値によって決まる場合、有利である。そのような実施態様では、入力トライの子ノードの結合は、ビット単位ＡＮＤ、ビット単位ＯＲ、ビット単位ＡＮＤ  ＮＯＴ、又はビット単位ＸＯＲ等の論理演算を使用して、入力トライの各子ノードのビットマップを結合することによって容易に実行することができる。結合されたビットマップが取得され、結合の結果は、結合されたビットマップに基づいて実行される。
【０３０７】
したがって、トライの実施態様における物理代数は、集合演算の論理代数に直接対応する。従来技術では、ビットマップはトライにおいて、ポインタに必要なメモリ空間を低減するためだけに使用されるが、本発明は、トライに対して集合演算を実行するためにビットマップを利用する。
【０３０８】
上述したように、「ＣＤＢＩＮｏｄｅ」と呼ばれるトライノードインターフェースの例示的な実施態様は以下の主要メソッドを有する：ｇｅｔＢｉｔＳｅｔ（）−トライノードの全ての非空子ポインタの設定ビットを有するビットマップを返す−及びｇｅｔＣｈｉｌｄＮｏｄｅ（ｂｉｔＮｕｍ）−ビット数によって指定される所与のノード分岐の子ノードを返す。
【０３０９】
図２９は、本発明のクエリ実行モデルによるトライ制御及びデータフローを示す。演算子２９０３は、集合演算、例えば、論理積、論理和、差分、又は排他的論理和を入力ベースデータの２つの集合２９０１、２９０２に対して実行する。ベースデータの２つの集合はそれぞれ、入力トライ内で提供され、２つの入力トライは、各集合演算子に従って演算子２９０１によって結合される。演算子２９０３はそれ自体、入力トライと同じトライ（ノード）インターフェースを実施することにより、その消費者にとってトライとして見える。エグゼキュータ２９０４は、上述したトライノードメソッドｇｅｔＢｉｔＳｅｔ及びｇｅｔＣｈｉｌｄＮｏｄｅを呼び出して、エグゼキュータと演算子との間の破線矢印で示されるように、演算子２９０３によって提供される結果をトラバースする。演算子と入力トライとの間の破線矢印によって示されるように、集合演算子を実行する際、同じメソッドｇｅｔＢｉｔＳｅｔ及びｇｅｔＣｈｉｌｄＮｏｄｅは、演算子２９０３によって呼び出されて、入力トライ２９０１、２９０２をトラバースする。実線矢印で示されるデータフロー方向において、ビットマップ及び子トライノードは入力トライ２９０１、２９０２から演算子２９０３に、そして演算子２９０３からエグゼキュータ２９０４に渡される。理解されるように、集合演算の入力トライの１つ又は複数は、同じ又は異なる論理演算子を使用したトライへの別の集合演算の出力であり得る。
【０３１０】
図３０は、論理積（ブールＡＮＤ）演算子３００３を２つの入力トライ３００１、３００２に適用する一例を示す。入力トライは、読みやすさのために８変数であるが、好ましい実施態様では、上述したようなトライデータ構造が使用される。入力トライ３００１は、キー「１３」、「１４」、及び「５５」が関連付けられた３つのリーフノードを含む。入力トライ３００２も、キー「１３」、「１５」、及び「６４」に関連付けられた３つのリーフノードを含む。トライ３００５は、入力トライ３００１、３００２のＡＮＤ結合によって得られた結果トライの表現である。
【０３１１】
観察することができるように、結果トライ内の各ノードの子ノードの集合は、入力トライ内の対応するノードの子ノードの集合のＡＮＤ結合である。例えば、結果トライ３００５のルートノードは、キー「１」が関連付けられた１つの子ノードを有する。この１つの子ノードは、入力トライ３００１のルートノードの子ノードの集合（「１」，「５」）と、入力トライ３００２のルートノードの子ノードの集合（「１」，「６」）との論理積を形成する場合、得られる。更に、キー「１」が関連付けられたノードも１つの子ノードを有し、これにはキー「１３」が関連付けられる。実際に、ノード「１３」は、入力トライ３００１のノード「１」の子ノードの集合（「１３」，「１４」）と、入力トライ３００２の対応するノード「１」の子ノードの集合（「１３」，「１５」）との論理積を形成する場合、得られる。
【０３１２】
したがって、論理積演算の結果トライ、ここでは結果トライ３００５は、全てのノード及び各入力トライ、ここでは入力トライ３００１、３００２に含まれるノードのみを含む。特に、ここではキー「１３」に関連付けられたノードである結果トライのリーフノードの集合は、全てのリーフノード及び入力トライのそれぞれ全てに含まれるリーフノードのみを含む。
【０３１３】
論理積演算子３００３の好ましい実施形態によって実行されるアルゴリズムは、以下のように擬似コードで記載することができる：
１．ｎｏｄｅＡ＝トライＡのルートノード
２．ｎｏｄｅＢ＝トライＢのルートノード
３．ｎｏｄｅＡのｇｅｔＢｉｔＳｅｔ−＞００１０００１０
４．ｎｏｄｅＢのｇｅｔＢｉｔＳｅｔ−＞０１００００１０
５．ビット単位ａｎｄ−＞００１０００１０
６．ｆｏｒ全ての設定ビット
ｎｏｄｅＡ＝ｎｏｄｅＡのｇｅｔＣｈｉｌｄＮｏｄｅ
ｎｏｄｅＢ＝ｎｏｄｅＢのｇｅｔＣｈｉｌｄＮｏｄｅ
ｉｆリーフノードが
ビット単位ａｎｄを実行する
ｅｌｓｅ
反復（ステップ３）
【０３１４】
この好ましい実施形態では、全てのトライノードは上述したようにビットマップを含む。更に、トライは、上述したようにｇｅｔＢｉｔＳｅｔメソッド及びｇｅｔＣｈｉｌｄＮｏｄｅメソッドを含むインターフェースを実施するノードによって形成される。ビット単位ＡＮＤ演算が２つの入力トライの対応するノードのビットマップ間で実行されて、２つの対応するノードが共通に有する子ノードの集合を求める。
【０３１５】
図３１〜図３４を参照して以下に示すように、本発明の解決策は、階層トライ構造を利用する。階層トライ構造では、トライはレベル毎に処理されるため、遅延評価が可能である。したがって、集合演算の性能を大幅に改善することができる。
【０３１６】
図３１は、論理積演算が実行される、例としての２つの入力トライ３１１０、３１２０を示す。全てのトライのように、入力トライ３１１０及び３１２０は、レベル１に１つの（ルート）ノードを有する。入力トライ３１１０は、入力トライ３１１０のルートノードに含まれるビットマップ３１１１内で４番目及び７番目のビットが設定されていることにより示されるように、レベル２に２つのノードを有する。入力トライ３１２０は、入力トライ３１２０のルートノードに含まれるビットマップ３１２１内で７番目のビットが設定されていることにより示されるように、レベル２に１つのノードを有する。両入力トライは、レベル２のノードの各ビットマップ内で設定されているビットに従属する三角形で示されるように、レベル３又はそれ以降のレベルに更なるサブトライを有する。
【０３１７】
図３２は、レベル１及び２における入力トライ３１１０及び３１２０の対応するノードのビットマップに対して実行されたビット単位ＡＮＤ演算を示す。入力トライのレベル１におけるルートノードは常に、互いに対応し、したがって、それらのビットマップは、第１のビット単位ＡＮＤ演算を用いて結合される。入力トライ３１１０のルートノードのビットマップ３１１１において４番目及び７番目のビットが設定されており、入力トライ３１２０のルートノードのビットマップ３１２１において７番目のビット（のみ）が設定されているため、結合ビットマップ３２０１において、７番目のビット（のみ）が設定される。レベル２において、入力トライ３１１０のルートのビットマップ３１１１の７番目のビットに従属するノードは、入力トライ３１２０のルートのビットマップ３１２１の７番目のビットに従属するノードに対応し、一方、入力トライ３１１０のルートのビットマップ３１１１の２番目のビットに従属するノードは、入力トライ３１２０内に対応するノードを有さない。したがって、ビットマップ３１１３及び３１２２（のみ）が、レベル２においてビット単位ＡＮＤ演算を用いて結合され、３番目及び６番目のビットが、結合ビットマップ３２０２において設定される。
【０３１８】
図３３は、入力トライ３１１０及び３１２０に対する論理積演算中の分岐スキップを示す。２つの入力トライのルートノードのビットマップ３１１１及び３１２１へのビット単位ＡＮＤ演算は、７番目のビットのみが設定された結合ビットマップ３２０１を生成するため、論理積演算は、入力トライ３１１０のルートノードのビットマップ３１１１の４番目のビットに従属する入力トライ３１１０の分岐をトラバースする必要がない。これは図３３において、ビットマップ３１１１の４番目の位置における「Ｘ」及びスキップされた分岐の描画に使用される破線によって示される。同様に、レベル２において、入力トライ３１１０内のノードのビットマップ３１１３において７番目のビットのみが設定されているが、入力トライ３１２０内の対応するノードのビットマップ３１２２においては設定されていない。したがって、論理積演算は、ビットマップ３１１３の７番目のビットに従属する分岐をトラバースする必要はない。
【０３１９】
最後に、図３４は、トライ３１１０及び３１２０への論理積演算の結果トライを示す。レベル１及びレベル２での結果トライのノードに関連付けられたビットマップ３２０１及び３２０２はそれぞれ、図３２に示されるビット単位ＡＮＤ演算によって計算された結合ビットマップに対応する。
【０３２０】
図３１〜図３４の例は、一般に、入力トライを結合する集合演算の過程で、入力トライの分岐の幾つかをトラバースする必要がないことを示し、これは性能を劇的に増大させることができる。結合ビットマップを使用して、いずれの分岐を更にトラバースする必要があり、いずれの分岐をスキップできるかを判断し得る。この手法は、「結果予測」又は「ツリー刈込み」と呼ぶことができる。
【０３２１】
図３５は、論理和（ブールＯＲ）演算子３５０３を図３０の２つの入力トライ３００１、３００２に適用する一例を示す。入力トライ３００１、３００２のＯＲ結合によって得られた結果トライ３６０５の表現を図３６に示す。
【０３２２】
観察することができるように、結果トライ内の各ノードの子ノードの集合は、入力トライ内の対応するノードの子ノードの集合のＯＲ結合である。例えば、結果トライ３６０５のルートノードは、キー「１」、「５」、及び「６」が関連付けられた３つの子ノードを有する。これらの３つの子ノードは、入力トライ３００１のルートノードの子ノードの集合（「１」，「５」）と、入力トライ３００２のルートノードの子ノードの集合（「１」，「６」）との論理和を形成する場合、得られる。キー「１」が関連付けられたノードも、キー「１３」、「１４」、及び「１５」が関連付けられた３つの子ノードを有する。実際に、これらのノードは、入力トライ３００１のノード「１」の子ノードの集合（「１３」，「１４」）と、入力トライ３００２の対応するノード「１」の子ノードの集合（「１３」，「１５」）との論理和を形成する場合、得られる。最後に、キー「５」及び「６」がそれぞれ関連付けられた結果トライ内のノードはそれぞれ、キー「５５」及び「６４」がそれぞれ関連付けられた１つの子ノードを有し、これらは入力トライ３００１及び３００２のそれぞれの対応するノードの子ノードである。
【０３２３】
したがって、論理和演算の結果トライ、ここでは結果トライ３６０５は、入力トライ、ここでは入力トライ３００１、３００２のいずれかに含まれるノードを全て含む。特に、結果トライのリーフノードの集合、ここでは「１３」、「１４」、「１５」、「５５」、及び「６４」に関連付けられたノードは、いずれかの入力トライに含まれるリーフノードを全て含む。
【０３２４】
論理和演算子３５０３の好ましい実施形態によって実行されるアルゴリズムは、以下のように疑似コードで記載することができる。
１．ｎｏｄｅＡ＝トライＡのルートノード
２．ｎｏｄｅＢ＝トライＢのルートノード
３．ｎｏｄｅＡのｇｅｔＢｉｔＳｅｔ−＞００１０００１０
４．ｎｏｄｅＢのｇｅｔＢｉｔＳｅｔ−＞０１００００１０
５．ビット単位ｏｒ−＞０１１０００１０
６．ｆｏｒ全ての設定ビット
ｉｆビットがｎｏｄｅＡ及びｎｏｄｅＢで設定されている
ｎｏｄｅＡ＝ｎｏｄｅＡのｇｅｔＣｈｉｌｄＮｏｄｅ
ｎｏｄｅＢ＝ｎｏｄｅＢのｇｅｔＣｈｉｌｄＮｏｄｅ
ｉｆリーフノードが
ビット単位ｏｒを実行する
ｅｌｓｅ
再帰（ステップ３）
ｉｆビットがｎｏｄｅＡのみで設定されている
ｎｏｄｅＡ＝ｎｏｄｅＡのｇｅｔＣｈｉｌｄＮｏｄｅ
ＴｒｉｅＡのみ再帰（ビット単位ｏｒをスキップ）
ｉｆビットがｎｏｄｅＢのみで設定されている
ｎｏｄｅＢ＝ｎｏｄｅＢのｇｅｔＣｈｉｌｄＮｏｄｅ
ＴｒｉｅＢのみ再帰（ビット単位ｏｒをスキップ）
【０３２５】
ここでも、上述したように、全てのトライノードはビットマップを含み、トライは、上述したように、ｇｅｔＢｉｔＳｅｔメソッド及びｇｅｔＣｈｉｌｄＮｏｄｅメソッドを含むインターフェースを実施するノードにより形成される。ビット単位ＯＲ演算は、２つの入力トライの対応するノードのビットマップ間で実行されて、２つの対応するノードのいずれかに含まれる子ノードの集合を求める。ビットが２つの対応するノードの一方のみのビットマップにおいて設定されている場合、その一方のノードに従属するサブトライは結果トライに追加され、これは、上記疑似コードでは、「ＴｒｉｅＡのみ再帰」／「ＴｒｉｅＢのみ再帰」によって示されている。
【０３２６】
図３７は、差分（ブールＡＮＤ  ＮＯＴ）演算子３７０３を図３０の２つの入力トライ３００１、３００２に適用する一例を示す。トライ３７０５は、入力トライ３００１、３００２のＡＮＤ  ＮＯＴ結合によって得られた結果トライの表現である。
【０３２７】
観察することができるように、結果トライ３７０５の全ての親ノードは、第１の入力トライ３００１の親ノードに対応する。結果トライ３７０５の親ノードに従属するリーフノードは、第１の入力トライ３００１内の対応する親ノードの子ノードの集合と、入力トライ３００２内の任意の対応する親ノードの子ノードの集合とのＡＮＤ  ＮＯＴ結合である。
【０３２８】
例えば、結果トライ３７０５のルートノードは、それら自体が親ノードである、キー「１」及び「５」が関連付けられた２つの子ノードを有する。これらの２つのノードは、それら自体が親ノードである、入力トライ３００２のルートノードの２つの子ノードに対応する。キー「１」が関連付けられたノードは１つの子ノードを有し、この子ノードはリーフノードであり、キー「１４」が関連付けられる。このリーフノードは、第１の入力トライ３００１のノード「１」の子ノードの集合（「１３」，「１４」）と、入力トライ３００２の対応するノード「１」の子ノードの集合（「１３」，「１５」）との差分を形成する場合、得られる。最後に、キー「５」が関連付けられた結果トライ内のノードは１つの子ノードを有し、この子ノードにはキー「５５」が関連付けられ、第１の入力トライ３００１のキー「５」を有するノードの子に対応する。キー「５」を有するこのノードは、入力トライ３００２内に対応するノードを有さない。
【０３２９】
したがって、差分演算の結果トライ、ここでは結果トライ３６０５は、第１の入力トライ、ここでは入力トライ３００１に含まれる全ての親ノードを含む。結果トライのリーフノードの集合、ここではキー「１４」及び「５５」が関連付けられたノードは、第１の入力トライ、ここではトライ３００１の全てのリーフノードから、第２の入力トライ、ここではトライ３００２のリーフノードを差し引いたものを含む。
【０３３０】
差分演算子３７０３の好ましい実施形態によって実行されるアルゴリズムは、以下のように擬似コードで記載することができる：
１．ｎｏｄｅＡ＝トライＡのルートノード
２．ｎｏｄｅＢ＝トライＢのルートノード
３．ｎｏｄｅＡのｇｅｔＢｉｔＳｅｔ−＞００１０００１０
４．ｎｏｄｅＢのｇｅｔＢｉｔＳｅｔ−＞０１００００１０
５．ｎｏｄｅＡのビット集合−＞００１０００１０
６．ｆｏｒ全ての設定ビット
ｉｆ  ｎｏｄｅＡ及びｎｏｄｅＢにおいてビットが設定されている
ｎｏｄｅＡ＝ｎｏｄｅＡのｇｅｔＣｈｉｌｄＮｏｄｅ
ｎｏｄｅＢ＝ｎｏｄｅＢのｇｅｔＣｈｉｌｄＮｏｄｅ
ｉｆリーフノードが
ビット単位ａｎｄ−ｎｏｔを実行する
ｅｌｓｅ
再帰（ステップ３）
ｉｆビットがｎｏｄｅＡのみで設定されている
ｎｏｄｅＡ＝ｎｏｄｅＡのｇｅｔＣｈｉｌｄＮｏｄｅ
ＴｒｉｅＡのみ再帰（ビット単位ａｎｄ−ｎｏｔをスキップ）
【０３３１】
ここでも、上述したように全てのトライノードは形成され、インターフェースを実施する。ビットが、入力トライ３００１及び３００２の両方の対応するノードのビットマップにおいて設定される場合、両トライでの再帰がある。ビットが、第１の入力トライ３００１のノードのビットマップにおいてのみ設定されている場合、そのノードに従属するサブトライが結果トライに追加され、これは、上記擬似コードにおいて「ＴｒｉｅＡのみ再帰」によって示されている。トライ３００２のノードのビットマップにおいてのみ設定されているビットは無視される。ビット単位ＡＮＤ  ＮＯＴ演算は、２つの入力トライの対応するノードの子ノードがリーフノードである場合のみ、２つの入力トライの対応するノードのビットマップ間で実行される。
【０３３２】
演算子の実行は、トライレベル（好ましい実施態様では、各レベルは基数／底６４の１桁である）にわたる再帰降下である。各レベルにおいて、各ノードのビットマップは、予測ビットを通しての再帰が続く結果予測として使用される。したがって、入力トライの結合は、結果トライのルートノードに対して結合関数を実行することを含む。結果トライの入力ノードに対して結合関数を実行することは、論理演算を使用して結果トライの入力ノードに対応する入力トライのノードの子ノードの集合を結合し、結果トライの入力ノードに特定された各子ノードの結合関数を実行することにより、結果トライ（空であることもある）の入力ノードの子ノードの集合を特定することを含む。既に上述したように、結果トライのルートノード及び／又は入力ノードを物理的に生成する必要はない。
【０３３３】
入力トライを結合するステップは、縦型トラバーサル、横型トラバーサル、又はそれらの組合せを使用して実行し得る。縦型トラバーサルにおける入力トライの結合は、入力ノードの子ノードの１つに対して結合関数を実行し、その子ノードによって形成されたサブトライをトラバースしてから、その子ノードの次の兄弟ノードに対して結合関数を実行することを含む。横型トラバーサルにおける入力トライの結合は、結果トライの入力ノードに対して特定された各子ノードに対する結合関数を実行し、結果トライの入力ノードに対して特定された各子ノードの子ノードの集合を特定してから、結果トライの入力ノードの任意の孫ノードに対して結合関数を実行することを含む。
【０３３４】
集合演算の入力トライの１つ又は複数は、仮想トライ、すなわち、結果トライの結合演算中、需要に応じて動的に生成されるトライであり得る。通常、仮想トライの、論理演算を使用して入力トライを結合するのに必要な部分のみが動的に生成される。仮想入力トライの適用例の幾つかの状況があり、そのうちの１つは、以下に説明するデータベース範囲クエリの実施である。
【０３３５】
範囲クエリ
論理積演算（ブールＡＮＤ）による２つ以上のトライの結合は、有利なことに、範囲クエリを効率的に実行するのに使用することができる。「範囲」は、特定のデータ型の第１の値と第２の値との間の全ての値を含む順序付き離散値の集合として説明することができ、ここで、第１及び／又は第２の値は、範囲内に含まれることもあれば、又は含まれないこともある。範囲クエリは、値が、１つ又は複数の指定された値の範囲に対応する（一致する）、キーの集合内のキーを返す。
【０３３６】
本発明による範囲クエリは、１つ又は複数の範囲についてサーチすべきキーの集合を格納したトライ（以下、「入力集合トライ」）と、１つ又は複数の範囲に含まれる全ての値を格納するトライ（以下、「範囲トライ」）との論理積演算によって実行される。トライは、好ましくは、上述したように実施される。サーチすべきキーの集合には通常、入力集合トライのノードが関連付けられ、一致する値の範囲を示す値（キー）には通常、範囲トライのノード、特に範囲トライのリーフノードが関連付けられる。サーチすべきキーの集合は通常、データベースに格納されたキーの集合、又はデータベースクエリの結果キー若しくは入力キーの集合、又は情報検索システムに格納されたキーの集合、又は情報検索システムクエリの結果キー若しくは入力キーの集合である。
【０３３７】
クエリを実行する１つ又は複数の範囲の定義は、ユーザ入力又は他の方法によって得られる。定義は範囲トライの生成に使用され、範囲トライのノード（通常、リーフノード）に関連付けられた値は、１つ又は複数の範囲に含まれる値に対応する。次のステップにおいて、入力集合トライは、上述したように、論理積演算により使用して範囲トライと結合されて、結果トライのノードに関連付けられたキーの集合を取得する。最後に、結果トライのノードに関連付けられたキーの集合又は結果トライのノードに関連付けられたキー、特に結果トライのリーフノードに関連付けられたキーのサブセット、又は結果トライのノードに関連付けられたキーから導出されたキー若しくは値の集合が、出力として得られる。
【０３３８】
図３８は、１つ又は複数の範囲についてサーチすべきキーの集合を格納する入力集合トライ３８０１及び１つ又は複数の範囲に含まれる全ての値を格納するように生成された範囲トライ３８０２を示す。トライ３８０１及び３８０２は両方とも、論理積演算子３８０３によって結合されて、範囲トライ３８０２に格納された１つ又は複数の範囲内に値がある入力集合トライ３８０１内のキーの集合を取得する。上述したように、入力集合トライ及び範囲トライのみならず、論理積演算子それ自体も、図３８において３つの三角形によって示されるように、各トライ（ノード）インターフェースを実施し得る。トライノードインターフェースが、上述したｇｅｔＢｉｔＳｅｔ（）メソッド及びｇｅｔＣｈｉｌｄＮｏｄｅ（ｂｉｔＮｕｍ）メソッドを有する場合、論理積演算子３８０３はこれらの演算を呼び出して、図３８おいて破線矢印で示されるように、入力集合トライ３８０１及び範囲トライ３８０２をトラバースし得る。実線矢印で示されるデータフロー方向において、ビットマップ及び子トライノードは、集合トライ３８０１及び範囲トライ３８０２から論理積演算子３８０３に渡される。
【０３３９】
図３９は、本発明による範囲クエリを実行する方法の一例を示す。入力集合トライ３９０１のリーフノードには、値「１３」、「１４」、及び「５５」を有する３つのキーが関連付けられる。範囲トライ３９０２は、値が範囲すなわち［１４，…，５６］内にあるキーが関連付けられた全てのリーフノードを含むように生成される。範囲トライの各レベルにおいて、範囲の終わりにあるノード（範囲トライ３９０２の例では、ノード１及び５）は、結果に部分的に寄与する。範囲の終わりの間のノード（範囲トライ３９０２の例では、ノード２、３、及び４）及びそれらに従属するサブトライは、結果に完全に寄与する。論理積演算子３９０３による入力トライ３９０１と範囲トライ３９０２とのＡＮＤ結合は、結果トライ３９０５のノードに関連付けられたキーの集合を取得する。エグゼキュータ３９０４は、例えば、結果トライ３９０５に関連付けられたキーの値、すなわち、「１４」及び「５５」を出力し得る。この出力は、範囲［１４，…，５６］内にある入力集合トライ３９０１のリーフノードが関連付けられた全てのキーの値に対応する。
【０３４０】
論理積演算子３９０３によって実行されるアルゴリズムは、以下のように疑似コードで記載することができる：
１．ｎｏｄｅＡ＝トライＡのルートノード（入力集合トライ）
２．ｎｏｄｅＢ＝トライＢのルートノード（範囲トライ）
３．ｎｏｄｅＡのｇｅｔＢｉｔＳｅｔ−＞００１０００１０
４．ｎｏｄｅＢのｇｅｔＢｉｔＳｅｔ−＞０１１１１１１０
５．ビット単位ａｎｄ−＞００１０００１０
６．ｆｏｒ全ての設定ビット
ｎｏｄｅＡ＝ｎｏｄｅＡのｇｅｔＣｈｉｌｄＮｏｄｅ
ｎｏｄｅＢ＝ｎｏｄｅＢのｇｅｔＣｈｉｌｄＮｏｄｅ
ｉｆリーフノードが
ビット単位ａｎｄを実行する
ｅｌｓｅ
再帰（ステップ３）
【０３４１】
範囲トライ３９０２は、範囲トライが非常に多くのノードを含み得ることを示す一例である。したがって、全てのノードを有する範囲トライ３９０２の実現は、時間及びメモリ空間に関してコストがかかる。このため、範囲トライは、仮想トライ、すなわち、論理積演算中、需要に応じて動的に生成されるトライとして実施し得る。これは、図３９において、破線で描かれた範囲トライ３９０２の三角形の中味によって示されている。
【０３４２】
論理積演算中、アプリケーションプログラミングインターフェース（ＡＰＩ）を通して、演算子はアクセスし、仮想範囲トライは「オンザフライ」でトライのトラバースに必要な構成要素を送る。例えば、先に紹介したｇｅｔＢｉｔＳｅｔ（）メソッドを通して現在ノードのビットマップにアクセスし得、ｇｅｔＣｈｉｌｄＮｏｄｅ（）メソッドを通して子ノードにアクセスし得る。ＡＰＩは、一方では各ビットマップを返し、他方では−実際のトライの子ノードの代わりに−各ビットマップを次の再帰に提供するオブジェクトを返す。演算子にとっては、仮想トライはまるで実際の物理的に実施されるトライのように見える。
【０３４３】
通常、論理積演算による入力集合トライと範囲トライとの結合に必要な仮想範囲トライの部分のみ、動的に生成される。図３９の例では、先に説明した分岐スキップに起因して、範囲トライのルートノードのビットマップにおいて設定されたビット２、３、４、及び５に関連付けられた仮想サブトライは、論理積演算中、アクセスされず、このため、それらのノードのいずれも生成されない。
【０３４４】
本発明による範囲クエリの幾つかの実施形態では、図３９に示される実施形態のように、入力集合トライのリーフに関連付けられたキーは、特定のデータ型の１つのデータ項目を符号化する。これらの実施形態は、「一次元」範囲クエリと呼ぶこともできる。一次元範囲クエリでは、１つ又は複数の範囲の定義は、その１つのデータ項目の１つ又は複数の範囲の定義を含む。
【０３４５】
多次元範囲クエリ処理
本発明による範囲クエリの他の実施形態では、入力集合トライのリーフノードに関連付けられたキーは、特定のデータ型の２つ以上のデータ項目を符号化する。この場合、１つ又は複数の範囲の定義は、データ項目のうちの１つ又は複数のデータ項目の１つ又は複数の範囲の定義を含む。そのような実施形態は「多次元」範囲クエリと呼ぶこともできる。原理上、各次元の範囲クエリを実行し、結果の論理積を実行することが可能であるが、関わるトライ及び演算子が多すぎるため、効率的ではない。
【０３４６】
本発明による効率的な多項目又は多次元範囲クエリ処理の一例を図４０に示す。入力集合トライ４００１は二次元又は２項目トライであり、そのリーフノードのそれぞれには、値対（ｘ，ｙ）を指定するキーが関連付けられる。図５４〜図５７を参照して以下に説明するように、そのような値対を使用して、例えば、ジオロケーションデータの経度及び緯度又は（経度，ＩＤ）又は（緯度，ＩＤ）のような複合キーを指定することができる。この例での次元ｘ及びｙのそれぞれは、読みやすさのために８変数系での２つの数字を含むが、好ましい実施形態では、上述したようなトライデータ構造が使用される。以下の説明から明らかになるように、ｘ次元及びｙ次元は、１キー内の複数のデータ項目の上述したインタリーブ符号化に従って、入力集合トライ４００１にインタリーブ様式で格納される。
【０３４７】
入力集合トライ４００１は、レベル１においてルートノードを有する。ルートノードに関連付けられたビットマップは、ｘ次元の第１の数字の値を示す。ビット「１」及び「５」が、ルートノードに関連付けられたビットマップにおいて設定され、これは、入力集合トライに格納されたキーのｘ次元の第１の数字が「１」又は「５」のいずれかであることを示す。レベル２におけるノードに関連付けられたビットマップは、ｙ次元の第１の数字の値を示す。ビット「３」及び「４」が、ルートノードのビット「１」に従属するレベル２におけるノードに関連付けられたビットマップにおいて設定され、ビット「６」が、ルートノードのビット「５」に従属するレベル２におけるノードに関連付けられたビットマップにおいて設定される。これは、ｘ次元が「１」で開始するキーのｙ次元の第１の数字が「３」又は「４」のいずれかであり、ｘ次元が「５」で開始するキーのｙ次元の第１の数字が「６」であることを示す。レベル３においてノードに関連付けられたビットマップは、ｘ次元の第２の数字の値を示す。これらのビットマップにおいて設定されたビットは、ｙ次元が「３」で開始されるｘ次元「１２」及び「１６」を有するキーがあり、ｙ次元が「４」で開始されるｘ次元「１２」及び「１５」を有するキーがあり、ｙ次元が「６」で開始されるｘ次元「５６」を有するキーがあることを示す。レベル４におけるノード及びレベル５におけるノードのビットマップは図４０に示されておらず、レベル４におけるノードに従属する小さな三角形によってのみ示されている。
【０３４８】
多項目の範囲トライ又は多次元範囲クエリは、１項目又は入力集合トライのリーフに関連付けられたキーによって符号化された各データ項目の一次元範囲トライを結合することによって得られる多項目範囲トライであり得、データ項目の１項目範囲トライは、データ項目の１つ又は複数の範囲に含まれる全ての値を格納する。１項目範囲トライは、上述したような仮想範囲トライであり得る。これは、１項目範囲トライを結合して多項目範囲トライを得るため、又は論理積演算によって入力集合トライと１項目トライとを結合するために必要な仮想１項目トライの部分のみが動的に生成されることを意味する。
【０３４９】
図４０の例では、二次元範囲クエリについて２つの一次元入力範囲が得られる：ｘ次元の範囲［１５，…，５５］及びｙ次元の範囲［３０，３１］。ｘ次元の範囲［１５，…，１５］を格納する（仮想）範囲トライ４００２が作成され、ｙ次元の範囲［３０，…，３１］を格納する（仮想）範囲トライ４００３が作成される。
【０３５０】
幾つかの多次元範囲クエリでは、データ項目（次元）の幾つかについて、範囲の定義が取得されないことがある。例えば、ユーザは、図４０の二次元入力集合トライ４００１に対して範囲クエリ処理を実行するためのｘ次元の範囲［１５，…，５５］のみを指定し、ｙ次元の範囲の定義を指定しないことがある。これは、ユーザが、ｙ次元の値に関係なく、ｘ次元の値が１５と５５との間にある入力集合トライ４００１内に格納された全てのキーに関心があることを意味する。範囲が指定されない次元はスキップ又は無視すべきである。これは、範囲の定義が得られないデータ項目にであっても、データ項目の可能な全範囲の値を格納する（仮想）１項目範囲トライを作成することによって達成することができる。そのようなトライは「ワイルドカードトライ」と呼ぶこともできる。例えば、一実施態様では、ＭａｔｃｈＡｌｌトライは、上記トライ（ノード）インターフェース（「ＣＤＢＩＮｏｄｅ」）を実施するトライである。その任意のノードでｇｅｔＢｉｔＳｅｔ（）メソッドを呼び出すと、全てのビットが設定されたビットマップが常に返される。
【０３５１】
１項目又は一次元範囲トライの結合から得られる多項目又は多次元範囲トライは通常、１項目（一次元）範囲トライに格納されたデータ項目の値の全ての組合せを格納する。例えば、ｘ次元の範囲が［１１，…，１３］であり、ｙ次元の範囲が［７，…，８］である場合、結合された二次元範囲トライは、（ｘ，ｙ）値対（１１，７）、（１１，８）、（１２，７）、（１２，８）、（１３，７）、及び（１３，８）のキーを格納する。
【０３５２】
図４１は、図４０の一次元範囲トライ４００２及び４００３の異なる部分がいかに結合されて、図４２に示されているインタリーブされた二次元範囲トライを得るかを示す。図４２において観察することができるように、結合された二次元範囲トライ内のｘ次元及びｙ次元は、図４０の入力集合トライ４００１と同じインタリーブされた様式で格納される。比較として、図４３は、図４０の一次元範囲トライ４００２及び４００３がいかに結合されて、図４４に示される非インタリーブ二次元範囲トライを得るかを示す。抽象的な視点から、これは、全てのＸ値キーを含むトライを生成し、各リーフノードは、全てのＹ値キーを含むトライのルートである。
【０３５３】
本発明の好ましい実施形態では、これは、一次元及び多次元範囲クエリの両方に当てはまり、範囲トライは、入力集合トライと同じ構造又はフォーマットを有する。したがって、多次元入力集合トライがデータ項目をインタリーブ様式で格納する場合、多次元範囲トライは好ましくは、インタリーブ格納を使用し、入力集合トライが非インタリーブ様式でデータ項目を格納する場合、多次元範囲トライも好ましくは、インタリーブ格納を使用しない。更に、範囲トライのリーフに関連付けられたキーは、好ましくは、入力集合トライのリーフに関連付けられたキーと同じデータ型のデータ項目を符号化する。最後に、範囲トライにおいて、特定のデータ型のデータ項目又はそのようなデータ項目の構成要素は好ましくは、入力集合トライ内の対応するデータ項目又はデータ項目の構成要素と同じレベルのノードにおいて符号化される。
【０３５４】
多項目又は多次元範囲クエリ処理の幾つかの実施形態では、多項目又は多次元範囲を得るための１項目又は一次元範囲トライの結合は、多項目範囲トライとの入力集合トライの結合を実施する関数（例えば、論理積演算子）への入力として多項目範囲トライを提供する関数によって実行される。これは、結合がインタリーブ演算子６４０４によって実行される図６４の例に示される。
【０３５５】
他の実施形態では、多項目又は多次元範囲トライを得るための１項目又は一次元範囲トライの結合は、範囲トライとの入力集合トライの論理積を実施する関数又は演算子内で実行される。この場合、多次元範囲トライは概念的にのみ存在する。実際には、範囲トライとの入力集合トライの結合を実施する関数又は演算子は、複数の（仮想）一次元範囲トライが一緒に（仮想）多次元範囲トライを形成した場合等、（仮想）一次元範囲トライにアクセスする。範囲が指定されていない次元がある場合、これらの次元は、例えば、上述したようにワイルドカードトライを作成することにより、範囲トライとの入力集合トライの論理積を実施する関数又は演算子によってスキップ又は無視される。
【０３５６】
図４０の例では、結合は二次元論理積（ＡＮＤ）演算子４００４によって実行される。論理積演算子４００４によって実行されるアルゴリズムは、以下のように疑似コードで記載することができる：
１．ｎｏｄｅＡ＝トライＡのルートノード（入力集合トライ）
２．ｎｏｄｅＢ＝トライＢのルートノード（ｘ次元の範囲）
３．ｎｏｄｅＣ＝トライＣのルートノード（ｙ次元の範囲）
４．ｎｏｄｅＡのｇｅｔＢｉｔＳｅｔ−＞００１０００１０
５．ｎｏｄｅＢのｇｅｔＢｉｔＳｅｔ−＞００１１１１１０
６．ビット単位ａｎｄ−＞００１０００１０
７．ｆｏｒ全ての設定ビット
ｎｏｄｅＡ＝ｎｏｄｅＡのｇｅｔＣｈｉｌｄＮｏｄｅ，
８．ｎｏｄｅＡのｇｅｔＢｉｔＳｅｔ−＞０００１１０００
９．ｎｏｄｅＣのｇｅｔＢｉｔＳｅｔ−＞００００１０００
１０．ビット単位ａｎｄ−＞００００１０００
１１．ｆｏｒ全ての設定ビット
子ｎｏｄｅＡの子ノードを取得，
ｎｏｄｅＢ＝ｎｏｄｅＢのｇｅｔＣｈｉｌｄＮｏｄｅ
ｎｏｄｅＣ＝ｎｏｄｅＣのｇｅｔＣｈｉｌｄＮｏｄｅ
ｉｆリーフノードが
ビット単位ａｎｄを実行する
ｅｌｓｅ
再帰（ステップ４）
【０３５７】
（仮想）多次元範囲トライは、一次元範囲トライが実際に結合されて（仮想）多次元範囲トライを取得した場合、少なくとも、多次元範囲トライが入力集合トライと同じ構造又はフォーマットを有するとき、結果トライ内の各ノードの子ノードの集合が、入力集合トライ内の対応するノードの子ノードの集合と、多次元範囲トライとのＡＮＤ結合の結果であるという意味で、概念的に作成される。
【０３５８】
例えば、図４０は、入力集合トライ４００１のように、ｘ次元及びｙ次元をインタリーブ様式で格納する結果トライ４００６を示す。結果トライ４００６は、値（ｘ＝１，ｙ＝３）を有するキーが関連付けられたノード４００７を有する。このノードは、値ｘ＝１を有するキーが関連付けられたノード４１０８の子ノードの集合全体を表す。結果トライ４００６のノード４００７に対応する入力集合トライ４００１のノードはノード４００９であり、ノード４００９は、値ｘ＝１を有するキーが関連付けられたノードである。図４０の一次元範囲トライ４００２及び４００３が実際に結合される場合に得られ、入力集合トライ４００１と同じ構造及びフォーマットを有する多次元範囲トライ４１００を図４１に示す。結果トライ４００６のノード４００７に対応する多次元範囲トライ４１００のノードはノード４１０１であり、ノード４１０１は、値ｘ＝１を有するキーが関連付けられたノードである。入力集合トライ４００１のノード４００９の子ノードの集合（ノード４０１０及び４０１１）と、多次元範囲トライ４１００のノード４１０１の子ノードの集合（ノード４１０２）とのＡＮＤ結合は、結果トライ４００６のノード４００７を生成する。
【０３５９】
多次元又は多項目入力集合トライの異なる次元又は項目をインタリーブ様式で格納することは、多くの場合、図４５及び図４６を参照してこれより説明するように、より効率的な範囲クエリに繋がる。
【０３６０】
図４５は、図４０の入力集合トライ４００１と同じ値であるが、非インタリーブ様式で格納する入力集合トライ４５０１を示す。入力集合トライ４００１と全く同じように、入力集合トライ４５０１は、レベル１においてルートノードを有し、ルートノードに関連付けられたビットマップは、ｘ次元の第１の数字の値を示す。しかしながら、入力集合トライ４５０１のレベル２におけるノードに関連付けられたビットマップは、インタリーブ入力集合トライ４００１におけるｙ次元の第１の数字ではなく、ｘ次元の第２の数字の値を示す。レベル３におけるノードに関連付けられたビットマップは、ｙ次元の第１の数字の値を示し、レベル４におけるノードのビットマップ（図４５に示されず）は、ｙ次元の第２の数字の値を示す。
【０３６１】
本発明により、各（非インタリーブと同様に）二次元範囲トライとの入力集合トライ４５０１のＡＮＤ結合を実行する場合、範囲Ｘ＝［１５，…，５５］及びＹ＝［３０，…，３１］を有する二次元範囲クエリについてトラバースされるノードは、図４５において陰影が付されている（レベル５におけるノードは示されない）。レベル４において１つのみのノード（ｘ＝１６，ｙ＝３）が陰影付きノードであるが、３つのより上位のレベルでは、合計で６つのノードをトラバース（訪問）する必要がある：ルートノード、ｘ＝１、ｘ＝５、ｘ＝１５、ｘ＝１６、及びｘ＝５３。
【０３６２】
比較として、図４６は、図４０のインタリーブ入力集合トライ４００１を示し、ここでも、本発明により範囲Ｘ＝［１５，…，５５］及びＹ＝［３０，…，３１］を有する二次元範囲クエリについてトラバースされるノードは、陰影が付されている（レベル５におけるノードは示されない）。図４５と同じレベル４における１つのノード（ｘ＝１６，ｙ＝３）は、陰影付きノードであるが、３つのより上位のレベルでは、合計で４つのノードをトラバースする必要がある：ルートノード、ｘ＝１、ｘ＝５、及び（ｘ＝１，ｙ＝３）。
【０３６３】
この理由は、非インタリーブ入力集合トライ４５０１では、範囲［１５，…，５５］内に入る全てのｘ値が最後の（第２の）数字まで特定されるが、インタリーブ入力集合トライ４００１では、ｙ次元の第１の数字を見ることにより、トラバースする価値がないノードをより素早くなくすことができるためである。別の次元の第１の数字を見ることによってノードをなくす機会は、同じ次元の更なる数字を見ることによりノードをなくす機会よりも多い。理解されるように、異なる次元が有する数字が多いほど、インタリーブ式格納の性能利得は大きくなる。
【０３６４】
上述したように、範囲クエリ処理は、例えば、一次元範囲クエリの場合又はユーザが入力集合トライに格納された多次元キーの全ての次元に興味を有する場合、出力として、入力集合トライのリーフに関連付けられたキーの集合を提供し得る。代替的には、範囲クエリ処理は、出力として、入力集合トライのリーフに関連付けられたキーによって符号化されたデータ項目のサブセットを符号化する縮小項目キーの集合を提供し得る。この一例を図４７及び図４８に示す。
【０３６５】
図４７では、二次元又は二項目トライ入力集合トライ４７０１は、図４０の入力集合トライ４００１と同じであり、各リーフノードには、値対（ｘ，ｙ）を指定するキーが関連付けられる。ユーザは、例において、入力集合トライに格納されている全てのｘ値に興味を有する。したがって、詳細に示されていないが、一次元範囲トライ４７０２は、ｘ次元の可能な全ての範囲全体を格納するワイルドカードトライであり、一次元範囲トライ４７０３は、ｙ次元の可能な値の範囲全体を格納するワイルドカードトライである。
【０３６６】
図４０の一次元範囲トライ４００２及び４００３のように、一次元範囲トライ４７０２及び４７０３は、少なくとも概念的に結合されて、二項目又は二次元範囲トライを取得する。一次元範囲トライは両方ともワイルドカードトライであるため、二次元範囲トライは可能な全ての値対（ｘ，ｙ）を含む。次に、二次元範囲トライは、二次元論理積（ＡＮＤ）演算子４７０４によって二次元入力集合トライ４７０１と結合される。図４０の二次元論理積（ＡＮＤ）演算子４００４のように、論理積演算子４７０４は、論理積演算に従って二次元入力集合トライを二次元範囲トライと結合して、各結果トライのノードに関連付けられたキーの集合を取得する。更に、先に説明したように、結果トライ内の各ノードの子ノードの集合は、二次元入力集合トライ内の対応するノードの子ノードの集合と、二次元範囲トライ内の対応するノードの子ノードの集合とのＡＮＤ結合である。二次元範囲トライは可能な全ての値対（ｘ，ｙ）を格納しているため、結果トライは入力集合トライと同一である。
【０３６７】
図４０の論理積演算子４００４とは対照的に、ユーザは入力集合トライに格納されているｘ値にしか興味がないため、図４７の論理積演算子４７０４は、入力集合トライのリーフに関連付けられた（ｘ，ｙ）キーの集合を出力として提供しない。むしろ、論理積演算子４７０４は、出力として、ｘ次元のみの値の集合、この例では、入力集合トライに格納されている全てのｘ値の集合を提供する。
【０３６８】
範囲クエリ処理が、出力として、縮小項目キーの集合を提供する場合、図４７のように、縮小項目キーに符号化されないデータ項目に関連する入力集合トライの異なる分岐から得られる縮小項目キーの集合は、複製を含まないことができる。例えば、図４７から分かるように、入力集合トライ４７０１内にはｘ値が１２である少なくとも２つのリーフノードがあり、すなわち、ｙ値の第１の数字は３（１２，３，…）である少なくとも１つ及びｙ値の第１の数字が４（１２，４，…）である少なくとも１つがある。特に出力集合が上流演算子で使用される場合、出力を提供する前に複製キーをなくすために、縮小項目キーに符号化されないデータ項目に関連する入力集合トライの異なる分岐から得られる縮小項目キーの集合は、出力を提供する前にマージされる。二次元では、マージは、許容可能に効率的に、入力集合トライのレベル毎に実行することができる。しかしながら、多くの場合、縮小項目キーの集合を新たに作成されたトライに書き込み、それにより、複製が自動的になくなることが最も効率的であろう（例えば、入力集合トライが３つ以上の次元を有する場合）。
【０３６９】
図４７の例では、出力集合内の複製ｘ値をなくすために、論理積演算による二次元範囲トライとの入力集合トライ４７０１の結合の結果として得られたｘ値キーの集合は、ｘ値のみを有するキーがノードに関連付けられた、新たに作成された一次元トライに書き込まれる。この新たに作成された一次元トライを図４８に示す。リーフノードに関連付けられたキーの値は、入力集合トライ４７０１に格納された全てのｘ値の集合に対応する。
【０３７０】
ｘ値のみを出力する二次元論理積演算子４００４によって実行されるアルゴリズムは、以下のように擬似コードで記載することができる：
１．ｎｏｄｅＡ＝トライＡのルートノード（入力集合トライ）
２．ｎｏｄｅＢ＝トライＢのルートノード（ｘ次元のワイルドカードトライ）
３．ｎｏｄｅＣ＝トライＣのルートノード（ｙ次元のワイルドカードトライ）
４．ｎｏｄｅＡのｇｅｔＢｉｔＳｅｔ−＞００１０００１０
５．ｎｏｄｅＢのｇｅｔＢｉｔＳｅｔ−＞１１１１１１１１
６．ビット単位ａｎｄ−＞００１０００１０
７．ｆｏｒ全ての設定ビット
ｎｏｄｅＡ＝ｎｏｄｅＡのｇｅｔＣｈｉｌｄＮｏｄｅ，
８．ｎｏｄｅＡのｇｅｔＢｉｔＳｅｔ−＞０００１１０００
９．ｎｏｄｅＣのｇｅｔＢｉｔＳｅｔ−＞１１１１１１１１
１０．ビット単位ａｎｄ−＞０００１１０００
１１．ｆｏｒ全ての設定ビット
子ｎｏｄｅＡの子ノードを取得，
ｎｏｄｅＢ＝ｎｏｄｅＢのｇｅｔＣｈｉｌｄＮｏｄｅ
ｎｏｄｅＣ＝ｎｏｄｅＣのｇｅｔＣｈｉｌｄＮｏｄｅ
ｉｆリーフノードが
ビット単位ａｎｄを実行する
結果キー（ｘのみ）を出力トライに書き込む
ｅｌｓｅ
再帰（ステップ４）
【０３７１】
図４７の例では、ｘ次元の値のみが出力として提供される。理解されるように、ｙ次元の値のみが出力として提供される場合、同じ原理が適用される。更に、一次元範囲トライ４７０２及び４７０３は両方ともワイルドカードトライであるため、入力集合トライ４７０１に格納された全てのｘ値は、出力として提供される。理解されるように、一次元範囲トライ４７０２及び／又は４７０３が、全ての可能なｘ値及び／又はｙ値のサブセットのみを格納する場合、入力集合トライ４７０１に格納された全てのｘ値のサブセットのみを出力として提供し得る。例えば、仮に一次元範囲トライ４７０２が図４０の範囲トライ４００２と同じであり、範囲［１５，…，５５］内のｘ値のみを格納する場合、論理積演算子４００４によって提供される出力は、ｘ＝１２の値を含まないであろう。別の例として、仮に一次元範囲トライ４７０２及び４７０３が両方とも、図４０の各範囲トライ４００２及び４００３と同じであり、範囲［１５，…，５５］内のｘ値のみを格納し、そしてそれぞれ範囲［３０，…，３１］内のｙ値のみを格納する場合、論理積演算子４００４によって提供される出力は、ｘ＝１６の値のみを含むことになろう。
【０３７２】
ファジーサーチ
テキスト検索用途での往々にしての要件は、近似文字列一致−ファジーサーチ機能とも呼ばれる−を提供することである。これは、パターンに厳密ではなく概ね一致する文字列の発見である。
【０３７３】
この「ファジーさ」（２つの文字列シーケンス間の差）の典型的な尺度は、レーベンシュタイン距離である。２つの文字列間のレーベンシュタイン距離は、ある文字列を別の文字列に変更するのに必要な一文字編集（文字の挿入、削除、又は置換）の最小数である。
【０３７４】
上述した仮想範囲トライと同様に、本発明の一態様は、インデックストライのようなストレージトライとブールＡＮＤを使用して論理積演算されて、一致するキー列又は一致するキー列を含むドキュメントを返す、好ましくは仮想のファジー一致トライに関する。インデックストライは、上述したように、２つのキー部（文字列，長）として、発生した言葉及びドキュメントＩＤをそれぞれ格納し得る。
【０３７５】
本発明のこの態様によれば、データは、近似文字列一致を実行することによって電子データベース又は情報検索システムから検索される。まず、サーチ文字列が取得される。次に、サーチ文字列及び／又はサーチ文字列の変形を含む近似文字列の集合を格納している一致トライが構築される。一致トライは、論理積演算を使用して、電子データベース若しくは情報検索システムに格納された文字列の集合又は電子データベースクエリ若しくは情報検索システムクエリの結果文字列を格納したストレージトライと結合される。ストレージトライは、例えば、（文字列，長）等の２つのキー部として、ドキュメントに含まれる文字列及び各ドキュメント識別子を格納するインデックストライであり得る。
【０３７６】
上述した論理積のように、結果トライが取得される。結果トライ内の各ノードの子ノードの集合は、一致トライ内の対応するノードの子ノードの集合と、ストレージトライ内の対応するノードの子ノードの集合との論理積であり、同じキーが異なるトライのノードに関連付けられている場合、異なるトライのノードは互いに対応する。通常、一致トライ、ストレージトライ、及び結果トライは、同じ構造又はフォーマットを有する。このセクションにおいて別段のことが記される場合を除き、上述したトライへの論理積演算の全ての態様は、ファジーサーチの状況でのトライの論理積にも当てはまる。
【０３７７】
上述したように、トライは１つ又は複数のノードを含み、各子ノードにはキー部分が関連付けられ、ルートノードからトライ内の別のノードへのパスは、ノードに関連付けられたキーを定義し、キーは、パス上のノードに関連付けられたキー部分を連結したものである。トライは、上述したトライデータ構造を使用して実施することができる。しかしながら、上述した例とは異なり、一致トライは通常、無向サイクルである。これは、一致トライ内の子ノードが２つ以上の親ノードを有し得ることを意味する。無向サイクルの例は図４８Ｂ〜図４８Ｅに提供され、詳細に後述する。これとは対照的に、ストレージトライ及び結果トライ内の各子ノードは通常、１つのみの親ノードを有する。
【０３７８】
本発明によるファジーサーチは、一致トライが、ストレージトライとの一致トライの論理積中、動的に生成される仮想トライであるそれ、特に効率的である。「遅延評価」と呼ばれることもある、ストレージトライとの一致トライの論理積に必要な仮想トライの部分のみが（動的に）生成される。このセクションにおいて別段のことが記される場合を除き、上述した仮想トライの全ての態様は、ファジーサーチの状況での仮想一致トライの使用にも当てはまる。
【０３７９】
ファジーサーチの出力として、文字列及び／又は結果トライのノードの結果集合に関連付けられたドキュメント識別子等の他のデータ項目が提供される。通常、一致トライは一致ノードの集合を含み、各一致ノードには、近似文字列の集合からの文字列の１つに対応する１つ又は複数のキーが関連付けられる。この場合、ノードの結果集合は、一致トライ内の一致ノード（結果トライのノードに関連付けられたキーが、一致トライのノードに関連付けられたキーと同一である場合、結果トライのノードは一致トライのノードに対応する）の集合に対応する結果トライのノードの集合であり得る。これは、一致トライの一致ノードに対応する結果トライのノードに関連付けられた、ドキュメント識別子のような文字列データ項目のみが出力として提供されることを意味する。
【０３８０】
図４８Ａ〜図４８Ｅを参照して、サーチ文字列及び／又はサーチ文字列の変形を含む近似文字列の集合を格納する（仮想）一致トライをいかに生成することができるかについてこれより説明する。一致トライは、近似文字列の集合を表す有限オートマトンから導出される。まず、近似文字列の集合を表す非決定性有限オートマトンが構築される。非決定性オートマトンでは、２つの状態間のあらゆる遷移には通常、サーチ文字列に含まれる特定の文字、又はワイルドカード文字、又は空文字列が関連付けられる。非決定性有限オートマトンから、近似文字列の集合を表す決定性有限オートマトンも導出することができ、決定性有限オートマトンの２つの状態間の遷移には通常、サーチ文字列に含まれる特定の文字又はワイルドカード文字が関連付けられる。次に、一致トライが決定性有限オートマトンから導出される。
【０３８１】
図４８Ａは、レーベンシュタインオートマトンとも呼ばれる、最大編集距離２を有するサーチ文字列「ａｂｃ」に一致する非決定性有限オートマトン（ＮＦＡ）を示す。当業者には既知のように、有限オートマトンは、状態と、状態間の遷移とを含む。参照番号０００１で記された状態は開始状態であり、状態０００６は０編集の場合の一致終了状態であり、状態０００７は１編集の場合の状態であり、状態０００８は２編集の場合の状態である。より大きな編集距離では、追加の状態行を上に追加する必要があり、より大きな文字列は右に追加の状態を生成する。
【０３８２】
状態０００２は、一致する最初の文字（「ａ」）の状態遷移である。入力として「ａｂｃ」の場合、最終状態０００６に達する。状態０００３は、例えば、「ｘａｂｃ」がオートマトンに提供される場合、冒頭に挿入された文字の状態遷移である。状態遷移０００４は文字置換を反映し、例えば、「ｙｂｃ」をオートマトンに提供する。最後に、遷移０００５は文字削除を反映し、例えば、「ｂｃ」をオートマトンに提供する。
【０３８３】
見て分かるように、図４８Ａのオートマトンは非決定性である。例えば、最初の入力文字として「ａ」を提供すると、状態０１、１１、１０、１２、２１、２２、及び３２が生じる。「ａｂｃ」は、「ａ」にするために２つの文字を削除する必要があるため、状態のこの集合は一致状態（３２、参照番号０００８）を含む。
【０３８４】
ＮＦＡは、例えば、いわゆる冪集合構築法を使用して決定性有限オートマトン（ＤＦＡ）に変換することができる。レーベンシュタインオートマトンＤＦＡを効率的に作成する他の方法は、Klaus Schulz及びStoyan Mihovによって提案されたものを含む。図４８Ｂは、編集距離１で「ａｂｃ」を照合して、例での状態数を低減するそのようなＤＦＡを示す。参照番号１００１で記された状態は開始状態である。参照番号１００２は、特定の文字（「ｂ」）の遷移を指す。参照番号１００３は、任意の他の文字（ワイルドカード）の遷移を指す。１００５と記された状態のようなグレー状態は一致状態である。
【０３８５】
好ましい実施形態では、一致トライ及びストレージトライ内の親ノードは、ビットマップを含み、トライ内の子ノードのキー部分の値は、ビットが子ノードに関連付けられた子ノードの親ノードに含まれるビットマップ内の（設定）ビットの値によって決まる。そのようなトライデータ構造は、上記例において説明されている。一致トライの子ノードとストレージトライの子ノードとの論理積は、論理積演算を使用して各子ノードのビットマップを結合することによって達成することができるため、特に効率的な論理積演算が可能になる。
【０３８６】
そのようなデータ構造を有する一致トライは、特定の文字又は遷移に関連付けられたワイルドカード文字の符号化により有限オートマトンの状態間の遷移を関連付けることにより、拡張有限オートマトンを得ることによって（決定性）有限オートマトンから導出することができ、符号化は、長さ及び／又はフォーマットが一致トライの親ノードに含まれるビットマップに等しい１つ又は複数のビットマップからなり、又はビットマップを表す。特定の文字の符号化の場合、符号化に含まれるか、又は符号化によって表されるビットマップのそれぞれにおいて、厳密に１ビットが設定される。ワイルドカード文字の符号化の場合、全ての有効文字符号化のビットが、符号化に含まれるか、又は符号化によって表されるビットマップにおいて設定され、それにより、全ての有効文字符号化（又は遷移元の状態に関連付けられた特定の文字の符号化を除く全ての有効文字符号化のビット）を「マスキング」する。換言すれば、ワイルドカードの符号化は、全ての有効文字符号化（又は遷移元の状態に関連付けられた特定の文字の符号化を除く全ての有効文字符号化）のビットマップのＯＲ結合である。
【０３８７】
図４８Ｃは、図４８ＢのＤＦＡの遷移のそのような拡張を示し、図２１を参照に上述したユニコード文字及びユニコード文字の文字列の符号化方式が使用される。読みやすさのために、１０ビットユニコード文字符号化のみが使用される。これらの符号化は、それぞれ６４ビットの２つのビットマップを使用する。上述したように、これらのビットマップのそれぞれにおいて厳密に１ビットが設定されるため、それぞれ６ビット（２６＝６４）を符号化することが可能である。
【０３８８】
符号化２００１は、２つの６ビット値１（「０００００１」）及び３３（「１０００１」）として符号化される「ａ」を表し、ビット位置当たりの符号化は、
【数１】
2020098583.tif 000004
である。
【０３８９】
００００＝０、０００１＝１、００１０＝２、００１１＝３、…、１１１１＝Ｆである十六進数表現では、これは０ｘ０００００００００００００００２及び０ｘ０００００００２００００００００に対応する。
【０３９０】
符号化２００３は、２つの６ビット値１（「０００００１」）及び３４（「１００１０」）として符号化された「ｂ」を表し、ビット位置当たりの符号化は、
【数２】
2020098583.tif 000005
である。
【０３９１】
十六進数表現では、これは０ｘ０００００００００００００００２及び０ｘ０００００００４００００００００に対応する。
【０３９２】
ワイルドカードの場合、許された全ての文字−この場合、完全なユニコード英字−の符号化のビットは設定される。例えば、符号化２００２は、全ての１０ビット符号化ユニコード文字、すなわち、６ビット値「００００００」…「００１１１１」及び「００００００」…「１１１１１１」を表すように設定されたビットを有し、ビット位置当たりの符号化は、
【数３】
2020098583.tif 000006
である。
【０３９３】
十六進数表現では、これは０ｘ００００００００００００ＦＦＦＦ及び０ｘＦＦＦＦＦＦＦＦＦＦＦＦＦＦＦＦに対応する。
【０３９４】
符号化２００４及び２００５は同じ文字「ｂ」を示し、一方は非最終の場合であり、一方は一致状態、すなわち、「ｂ」が入力文字列の最後の文字である場合のものである。符号化２００６及び２００７は、ワイルドカード文字のアナログの場合を示す。２００８及び２００９は、文字「ｃ」及びワイルドカードの最終一致状態の場合を示す。
【０３９５】
非一致状態に繋がる全てのユニコード文字の完全なワイルドカードマスク（図２１を参照して先に説明したように、１０ビット、１５ビット、及び２１ビット符号化）は：
【数４】
2020098583.tif 000007
である。
【０３９６】
一致状態に繋がる全てのユニコード文字の完全なワイルドカードマスクは：
【数５】
2020098583.tif 000008
である。
【０３９７】
図４８Ｄは、２つのキー部分によって表される各１０ビットユニコード文字を有する、結果として生成された一致トライの上部を示す。トライへのブールＡＮＤ演算子はまず、ビットマップを必要とし、後に一致する子に降下するため、特定の文字は１ビットとして符号化され、ワイルドカードは、全ての有効文字符号化で設定されたビットを有するビットマップとして符号化される。
【０３９８】
そのような一致トライは、上述した任意の有限オートマトンから、特に拡張有限オートマトンから直接導出することができる。しかしながら、一致トライ、ストレージトライ、又は結果トライに格納された文字が、各トライのＭ＞１個のキー部分により、すなわち、２つ以上のレベルのノードによって符号化される場合、一致トライは好ましくは、近似文字列の集合を表す完全有限オートマトンから導出される。好ましくは、Ｍは２〜４である。
【０３９９】
有限オートマトンの２つの状態間の遷移、好ましくはあらゆる遷移により、又は有限オートマトンの１つの状態間の遷移、好ましくはあらゆる遷移を、Ｍ−１子の中間状態を介して２つの状態をリンクするＭ個の遷移の１つ又は複数のシーケンスで置換又は関連付けることにより、好ましくは上述した決定性有限オートマトンから、より好ましくは拡張有限オートマトンからの完全有限オートマトン。したがって、完全な文字列に関連付けられていない状態は有限オートマトンに追加される。
【０４００】
例えば、図４８Ｂ及び図４８Ｃの有限オートマトンでは、状態０に発端し、状態１で終わる遷移がある。完全有限オートマトンでは、図４８Ｄから明らかになるように、この遷移は、中間状態１１０と、状態１と状態１１０との間の遷移及び状態１１０と状態１との間の別の遷移を含む一連の遷移とで置換される。別の例として、図４８Ｂ及び図４８Ｃの有限オートマトンでは、状態０に発端し、状態１０で終わる遷移がある。完全有限オートマトンでは、この遷移は、中間状態１１０と、状態１と状態１１０との間の遷移及び状態１１０と状態１０との間の別の遷移を含む一連の遷移とによって置換される。第３の例として、図４８Ｂ及び図４８Ｃの有限オートマトンでは、状態０に発端し、状態１４で終わる遷移がある。完全有限オートマトンでは、この遷移は、中間状態１１０及び１１１と、２つの遷移シーケンスとによって置換される。第１の遷移シーケンスは、状態１と状態１１０との間の遷移及び状態１１０と状態１４との間の別の遷移を含む。第２の遷移シーケンスは、状態１と状態１１１との間の遷移及び状態１１１と状態１４との間の別の遷移を含む。
【０４０１】
シーケンス内のＭ個の遷移のそれぞれには、長さ及び／又はフォーマットが一致トライの親ノードに含まれるビットマップに等しいビットマップからなるか、又はビットマップを表す中間符号化が関連付けられ、一致トライは完全有限オートマトンから導出される。符号化は、全体文字の符号化の一部のみ、図４８Ｄの一致トライを導出することができる完全有限オートマトンの例では、全体文字の符号化の半分を表すため、本明細書では「中間」と呼ばれる。
【０４０２】
例えば、図４８Ｄの一致トライを導出することができる完全有限オートマトンでは、状態０と状態１１０との間の遷移には、以下のビットマップからなるか、又は以下のビットマップを表す符号化が関連付けられる。
【数６】
2020098583.tif 000009
【０４０３】
十六進数表現では、これは０ｘ０００００００００００００００２に対応する。状態０と状態１１０との間の遷移とのこの符号化の関連付けは、符号化２００１その遷移間の上部破線矢印で示される。この矢印が指す「１」は、図４８Ｄの一致トライの親ノード０に含まれるビットマップ内のビット番号１（２番目のビット）を表す。
【０４０４】
別の例として、図４８Ｄの一致トライを導出することができる完全有限オートマトンでは、状態０と状態１１１との間の遷移には、以下のビットマップからなるか、又は以下のビットマップを表す符号化が関連付けられる。
【数７】
2020098583.tif 000010
【０４０５】
十六進数表現では、これは０ｘ００００００００００００ＦＦＦＦに対応する。状態０と状態１１１との間の遷移とのこの符号化の関連付けは、符号化２００２その遷移間の上部破線矢印で示される。この矢印が指す「０，２，…，６３」は、図４８Ｄの一致トライの親ノード０に含まれるビットマップ内のビット番号０、２、…、６３（１番目、３番目、…、６４番目のビット）を表す。
【０４０６】
有限オートマトンの２つの状態間の遷移に特定の文字が関連付けられる場合、シーケンスのＭ個の遷移に関連付けられた中間符号化に含まれるか、又は表されるビットマップを連結したものは、特定の文字の符号化であり、各ビットマップにおいて厳密に１ビットが設定される。
【０４０７】
図４８Ｂ及び図４８Ｃの有限オートマトンの例では、状態０と状態１との間の遷移には文字「ａ」が関連付けられる。したがって、図４８Ｄの一致トライを導出することができる完全有限オートマトンでは、状態０と状態１との間の（状態１１０を介した）２つの遷移に関連付けられた中間符号化に含まれるか、又は表されるビットマップを連結したものは、文字「ａ」の符号化であり、各ビットマップにおいて厳密に１ビットが設定される。この符号化は以下である。
【数８】
2020098583.tif 000011
【０４０８】
十六進数表現では、これは０ｘ０００００００００００００００２及び０ｘ０００００００２００００００００に対応する。
【０４０９】
有限オートマトンの２つの状態間の遷移にワイルドカード文字が関連付けられる場合、シーケンスのＭ個の遷移に関連付けられた中間符号化に含まれるか、又は表されるビットマップを連結したものは、符号化に含まれるか、若しくは表されるビットマップにおいて全ての有効文字符号化のビットが設定されるか、又は遷移元の状態に関連付けられた特定の文字の符号化を除く全ての有効文字符号化のビット  符号化を含む。
【０４１０】
図４８Ｂ及び図４８Ｃの有限オートマトンの例では、状態０と状態１４との間の遷移にはワイルドカード文字が関連付けられる。したがって、図４８Ｄの一致トライを導出することができる完全有限オートマトンでは、状態０と状態１４との間の（状態１１１を介した）２つの遷移に関連付けられた中間符号化のシーケンスの１つに含まれるか、又は表されるビットマップを連結したものは、ワイルドカード文字の符号化である。この符号化は以下である：
【数９】
2020098583.tif 000012
【０４１１】
十六進数表現では、これは０ｘ００００００００００００ＦＦＦＦ及び０ｘＦＦＦＦＦＦＦＦＦＦＦＦＦＦＦＦに対応する。
【０４１２】
更に、有限オートマトンの２つの状態間の遷移にワイルドカード文字が関連付けられる場合、シーケンスのＭ個の遷移に関連付けられた中間符号化に含まれるか、又は表されるビットマップを連結したものは通常、特定の文字の符号化の１つ又は複数の部分と、符号化に含まれるか、若しくは表されるビットマップにおいて全ての有効文字符号化のビットが設定されるか、又は遷移元の状態に関連付けられた特定の文字の符号化を除く全ての有効文字符号化のビット符号化の１つ又は複数の部分とを含む１つ又は複数の符号化を含む。
【０４１３】
例えば、図４８Ｄの一致トライを導出することができる完全有限オートマトンでは、状態０と状態１４との間の（状態１１０を介した）２つの遷移に関連付けられた中間符号化のシーケンスの１つに含まれるか、又は表されるビットマップを連結したものは、文字「ａ」の符号化の第１の部分（これは、文字「ｂ」の符号化の第１の部分でもある）と、ワイルドカード文字の符号化の第２の部分とを含む符号化である。この符号化は以下である：
【数１０】
2020098583.tif 000013
【０４１４】
十六進数表現では、これは０ｘ０００００００００００００００２及び０ｘＦＦＦＦＦＦＦＦＦＦＦＦＦＦＦＦに対応する。
【０４１５】
拡張有限オートマトン又は完全有限オートマトンはそれぞれ、各行が拡張有限オートマトン又は完全有限オートマトンの１つの状態を表す幾つかの行と、それぞれが遷移に関連付けられた符号化及び遷移が終わる状態への参照を含む、状態を発端とする各遷移のタプルとを含むデータ構造により表し、又は格納することができる。図４８Ｅは、特に効率的に図４８Ｄの一致トライを導出することができる完全有限オートマトンの状態を表すのに使用することができる、１つ又は複数の配列としてそのようなデータ構造を示す。そのようなデータ構造は、好ましくは状態への各参照におけるビットとして符号化される、遷移が終わる各状態について、この状態が一致状態であるか否かについての情報を含むことができる。データ構造は通常、遷移元の拡張有限オートマトン又は完全有限オートマトンのそれぞれの各状態に行を含む。
【０４１６】
この（仮想）一致トライ手法に伴う恩恵は、複雑な状態マシン等を使用する必要がないため、効率的な実行に繋がる実装の簡易性に起因するとともに、好ましい実施形態においてＡＮＤ演算子がビットマップに対して機能する方法にも起因した良好な性能である。
【０４１７】
インデックス手法及び性能測定
本発明の様々な実施形態による範囲クエリの性能を測定するために、実験を行い、その結果について図５３〜図７０を参照して以下に考察する。一例として、空間クエリを用いるジオロケーション用途を使用した。サンプルデータは、欧州領域のＯｐｅｎＳｔｒｅｅｔＭａｐデータから導出し、これはｈｔｔｐ：／／ｄｏｗｎｌｏａｄ．ｇｅｏｆａｂｒｉｋ．ｄｅ／ｅｕｒｏｐｅ．ｈｔｍｌから取得することができる。一例のデータベース内の各エントリは、１０桁のＩＤ、各経度及び緯度の少数点以下７桁を有する値、並びに通りの名称及び家屋番号を表す文字列を含んだ。
【０４１８】
【表２】
2020098583.tif 000014
【０４１９】
第１の実験は、インデックスサイズ（索引付けられるレコードの量）が一定結果サイズのクエリ処理性能にいかに影響するかを調べるために行った。データベースに問い合わせて、ミュンヘン地域内の小さな矩形（図４９に示されるように、経度１１．５８１９８１＋／−０．０１及び緯度４８．１３５１２５＋／−０．０１）内の全てのロケーションのＩＤを返した。データベースは合計で約２８５０万のレコードを含み、そのうち３，１４３個が一致した。
【０４２０】
第１の測定シリーズでは、一致レコードがまずデータベースにロードされ、次に、約２８５０万個の他のレコードがデータベースに追加された。これらの他のレコードを図５０において陰影付きエリアとして示す。１００，０００個のレコードが追加される都度、追加後、クエリを行い、その実行時間を測定した。明らかに、あらゆるクエリは３，１４３の一致を返した。
【０４２１】
第２の測定シリーズでも、まず矩形内の一致レコードをデータベースにロードするが、残りのレコードは、一致する経度又は緯度の「帯」内のレコードなしでロードした。第２の測定シリーズでロードした残りのレコードを図５１に示す。
【０４２２】
第１の実験を索引付け及びジオロケーションクエリの５つの異なる手法で実行した。
【０４２３】
本明細書では「従来技術による索引付け」と呼ばれる従来技術による手法では、経度及び緯度を含む空間索引付けをサポートするApache Lucene  ６．０．１データベースエンジンのSpatialPrefixTreeを使用した（https://lucene.apache.org, package org.apache.lucene.spatial.prefix.tree）。SpatialPrefixTreeはトライではなく、空間クエリに最適化された逆インデックスの作成に使用された。したがって、ここでとられる手法の良好なベンチマークを提供した。
【０４２４】
指定された矩形内の全てのロケーションを問い合わせるために、範囲クエリを両次元で実行した。クエリはそれぞれ、カーソルベースの反復子によって収集されて暫定結果集合を作成した、指定された経度帯又は緯度帯に配置されたレコードを表すＩＤの集合を返した。暫定結果集合を論理積演算して、最終結果集合を取得した。これを図５２に示し、図５２では、陰影付きエリアは指定された経度及び緯度の帯（暫定結果集合）を記し、黒色エリアは指定された矩形（最終結果集合）を記す。SpatialPrefixTreeはトライではなく、空間クエリに最適化された逆インデックスの作成に使用される。クエリ性能は、図５８〜図６０を参照して以下に説明するトライの可変精度索引付けと同様に、解像度の幾つかのレベルで幾つかのインデックスを作成することにより改善した。
【０４２５】
図５３は、従来技術による手法の測定結果を示す。ｘ軸はデータベースにロードされたレコード数を示し、ｙ軸は、対数尺度での毎秒当たり実行されたクエリ数を示す。一致した帯をデータベースにロードした場合及びしない場合で、クエリ性能は、データベース内のレコード数の増大に伴って低下することを観察することができる。この性能挙動は、アクセス時間がインデックスの充填レベルに依存する従来技術によるデータベースに典型的である。
【０４２６】
上述したトライの好ましい実施形態を使用してジオロケーションを索引付け問い合わせる第１の手法を行い、これを本明細書では「標準索引付け」と呼ぶ。経度に１つのインデックスが好ましい実施形態の第１の二次元トライによって作成され、緯度に別のインデックスが好ましい実施形態の第２の二次元トライによって作成された。換言すれば、各二次元インデックストライは２つの項目、すなわち、（経度，ＩＤ）又は（緯度，ＩＤ）をそれぞれ格納した。二次元インデックストライは、図４４のトライにおいて先に示したように、非インタリーブ様式で格納され、経度／緯度が第１のキー部を形成し、ＩＤが第２のキー部を形成した。抽象的な視点から、これにより、全ての経度／緯度を含むトライが生成され、各リーフノードは、図５４に示すように、各経度／緯度を有する全てのロケーションのＩＤを含むトライのルートである。
【０４２７】
第１のキー部（経度／緯度）にわたる範囲クエリは、一致した経度／緯度を有するロケーションのＩＤのトライルートを返した。トライインターフェースを用いてこれらの結果を届けるために、図５５に示すように、トライインターフェースを提供するマルチＯＲ演算子を使用してトライルートのリストを結合した。したがって、図５６に示すように、本発明による標準索引付けは２つのインデックストライ５６０１、５６０３を使用し、各インデックストライは２つのキー部（経度，ＩＤ）又は（緯度，ＩＤ）を有した。トライの第１のキー部について、仮想経度／緯度トライ５６０２、５６０４を使用して範囲クエリを実行した。マルチＯＲ演算子５６０５、５６０６を使用して各範囲クエリの結果を結合した。ＡＮＤ演算子５６０７を使用して２つのマルチＯＲ演算子の結果を結合し、最終結果を届けた。
【０４２８】
図５７は、標準索引付けの測定結果を示す。一致レコードをデータベースにロードしない場合、クエリ処理時間は一定であり、これは、トライが一定のアクセス時間を有する、すなわち、充填レベルから独立することによることを観察することができる。クエリ処理時間はまた、従来技術による手法を使用した場合の約１／１０であり、LuceneデータベースエンジンのSpatialPrefixTreeが空間クエリに最適化されることを考慮して、これは注目に値する。
【０４２９】
一致レコードをデータベースにロードする場合、標準索引付けのクエリ性能は低下し、これは、独立した経度クエリ及び緯度クエリのますます多くの結果を結合する必要があったためである。一致レコードを用いての標準索引付けの性能は、ノード（ＩＤ）の長いリストが生じるため、あまりよくない。性能を改善するために、ＯＲ演算によって結合する必要があるノードの量を低減する必要がある。
【０４３０】
本明細書において「可変精度索引付け」と呼ばれる手法では、ＯＲ演算する必要があるノードの量は、可変精度を有する複数のインデックスを維持し、階層を作成することによって劇的に低減することができる。これは、上述した従来技術によるデータベースエンジンにおいて幾つかの解像度レベルの幾つかのインデックスを作成することの概念と同等である。例えば、２桁十進数を格納するトライにおいて範囲を使用することにより、プレフィックスを表す各レベルにインデックスを有することができる。
−０，  １，  ２，  ．．．  ９
−００，  ０１，  ０２，  ．．．，  ０９，  １０，  ．．．  ９９
【０４３１】
例として、第１レベルのＸ値（最初のキー部）のインデックスを図５８に示し、Ｘ値の第２レベルのインデックスを図５９に示し、２番目のキー部（Ｙ項目）はＩＤであることができる。図５８に示される第１レベルのインデックス内のエントリ（最初のキー部又はＸ項目のリーフ）は、各プレフィックス範囲内のＸ値の全てのＩＤ（２番目のキー部のトライ）を含む。１０〜５３のＸ値のクエリは、図５８のインデックスへの範囲１、…、４のクエリの結果（破線矩形で記された２つのヒット）と、図５９のインデックスへの範囲５０、…、５３のクエリの結果（破線矩形で記された１つのヒット）とを結合する。これにより、図５９のインデックストライのみを使用する場合の５つのノードの代わりに、続くマルチＯＲ演算で結合する必要があるノードは３つのみである。
【０４３２】
本発明者が行った実際の実験は、各精度ステップに６ビットを使用した。精度長はキーの最初のバイトに格納された。トライは１１のレベルを有し、トライ内のノードは、ルートレベルで最高で１６個の子ノードを有し、１０の後続レベル（リーフノードを含む）で最高で６４個の子ノードを有した。これは、ルートレベルにおいて最大で１６−２個のノード及びトライの左右の部分での次のレベルで２＊（６４−１）個のノードをＯＲ演算する必要があったことを意味する。これにより、ＯＲ演算する必要がある上限は１６−２＋２＊（６４−１）＊１０＝１２７４個のトライになる。範囲クエリを受けるあらゆるキー値は、１１個の精度レベルで格納した。上述した仮想範囲トライに基づく範囲クエリを使用して、クエリを実行した。必要とされるノードを選択するのに必要な全てのキーのリストを作成した。
【０４３３】
図６０は、可変精度索引付けの測定結果を示す。一致帯がロードされない場合、クエリ実行は非常に高速（標準索引付けを使用する場合よりも約１０倍高速）であり、一定時間を有する。一致レコードがデータベースにロードされる場合であっても、クエリ性能は略一定である。しかしながら、以下に示すように、可変精度索引付けは、メモリ需要及び索引付け性能に関して高価である。
【０４３４】
本明細書では「二次元索引付け」と呼ばれるジオロケーションを索引付け問い合わせる別の手法は、標準索引付けよりも高速であるが、可変精度索引付けの欠点がない解決策あることを示した。図６１に示すこの手法では、データベースエントリの経度／緯度及びＩＤは、例えば、図３２及び図４６を参照して上述した構造を有するインタリーブトライに格納された。標準索引付けと同様に、経度及び緯度は、２つの異なるトライであるトライ６１１０（経度，ＩＤ）及びトライ６１２０（緯度，ＩＤ）で別個に索引付けられた。
【０４３５】
矩形を問い合わせるために、経度範囲を指定する仮想範囲トライ６１３０及び緯度範囲を指定する仮想範囲トライ６１４０を作成した。経度インデックスが経度範囲トライと論理積演算され、同時に、緯度インデックスが緯度範囲トライと論理積演算される場合、論理積の中間結果は、以下に説明するように結合された。
【０４３６】
最初のステップにおいて、図６１において矢印６１５１で示されるように、ビット単位ＡＮＤ演算を経度インデックストライ６１１０のルートノード６１１１のビットマップと、経度範囲トライ６１３０のルートノードとの間で実行する。同様に、図６１において矢印６１５２で示されるように、ビット単位ＡＮＤ演算を緯度インデックストライ６１２０のルートノード６１２１のビットマップと、緯度範囲トライ６１３０のルートノードとの間で実行する。
【０４３７】
図６１におけるノード６１１２及び６１２２は、インデックストライ６１１０及び６１２０のレベル２におけるノードを表す。レベル２におけるこれらのノードのそれぞれは、インデックス内のＩＤキー部のルートノードである。したがって、経度インデックストライ６１１０のルートノード６１１１のビットマップと、経度範囲トライ６１３０のルートノードとの間のビット単位ＡＮＤ演算は、指定された経度範囲を有するロケーションに属するＩＤの第１のキー部分を生成し、緯度インデックストライ６１２０のルートノード６１２１のビットマップと、緯度範囲トライ６１４０のルートノードとの間ビット単位ＡＮＤ演算は、指定された緯度範囲を有するロケーションに属するＩＤの第１のキー部分を生成する。
【０４３８】
２番目のステップにおいて、指定された経度範囲及び緯度範囲の両方に入るロケーションに属さないインデックストライ内のキーは以下のようにフィルタリングされて除外される：最初のステップによって生成された経度／緯度インデックストライ６１１０／６１２０のノードのビットマップは、ビット単位ＯＲ演算によって結合され、図６１において矢印６１５３で示されるように、ビット単位ＯＲ演算の結果間でビット単位ＡＮＤ演算を実行する。
【０４３９】
図６１におけるノード６１１３及び６１２３は、インデックストライ６１１０及び６１２０のレベル３におけるノードを表す。レベル３におけるこれらの各ノードは、インデックストライに格納された経度／緯度キー部の第２のキー部分を格納する。３番目のステップにおける演算は、２番目のステップにおいてフィルタリングされて除外されなかったキーに属するレベル３におけるノードを用いて続く。ビット単位ＡＮＤ演算が、図６１において矢印６１５４、６１５５で示されるように、これらのノードのビットマップと、各範囲トライ６１３０、６１４０の対応するノード（レベル２における）との間で実行される。
【０４４０】
図６１におけるノード６１１４及び６１２４は、インデックストライ６１１０及び６１２０のレベル４におけるノードを表す。レベル４におけるこれらの各ノードは、インデックストライに格納されたＩＤキー部の第２のキー部分を格納する。４番目のステップにおける演算は、３番目のステップにおけるビット単位ＡＮＤ演算の結果として生成されたレベル４におけるノードを用いて続く。２番目のステップと同様に、同じ親ノードを有する最初のステップにより生成された経度／緯度インデックストライ６１１０／６１２０のノードのビットマップは、ビット単位ＯＲ演算によって結合され、図６１において矢印６１５６で示されるように、ビット単位ＡＮＤ演算が、ビット単位ＯＲ演算の対応する結果間で実行される。
【０４４１】
演算は、インデックストライのリーフノードに達するまで、同じように続けられた。まとめると、一次元（ｘ）のみを有するインデックスが交互になった「ビュー」を返すマッチャーを使用して２つのインデックスを結合した。第２の次元は、マッチャーの出力において抑制された。
【０４４２】
図６２は、二次元索引付けの測定結果を示す。ここでも、一致帯がデータベースにロードされない場合、クエリ時間は一定であった。一致帯がデータベースにロードされる場合、クエリ性能は標準索引付けと比較して有意に改善した。
【０４４３】
次元を照合し抑制する戦略は原理上、３つ以上の次元に適用することができる。しかしながら、これは、ノードの大きな連鎖を生じさせる：ｘ次元の各ノードはｙ次元の６４個の子を有し得、ｙ次元の６４個の子はここでも、６４個の子を有し得、合計で既に４０９６個の子を有し得る
【０４４４】
本明細書では「シングルインデックス索引付け」と呼ばれるジオロケーションを索引付け問い合わせる最後の手法では、１つのみの多次元インデックスが作成され、多次元インデックスは、例えば、図３２及び図４６を参照して上述したように、経度及び緯度の両方を１つのインタリーブトライに格納する。このインデックストライの概略を図６３に示す。図６３では、経度及び緯度を表す第１及び第２のキー部Ｘ及びＹはインタリーブ様式で格納され、ロケーションのＩＤを表す第３のキー部は、Ｘ／Ｙトライのリーフに従属するサブトライに格納される。各サブトライに格納されたＩＤは、同じ経度及び緯度を有するロケーションの集合に属する。
【０４４５】
矩形を問い合わせるために、例えば、図４０を参照して上述したように次元範囲クエリを実行した。図６４に示されるように、経度の範囲は、第１の一次元仮想範囲トライ６４０２によって指定され、緯度の範囲は、第２の一次元仮想範囲トライ６４０３によって指定された。両一次元範囲トライは、インタリーブ演算子６４０４によって結合されて、インタリーブ二次元範囲トライを形成する。一致する経度及び緯度に属するＩＤサブトライの集合を得るために、ＡＮＤ演算子６４０５は、二次元範囲トライとインデックストライ６４０１のＸ／Ｙ部分との間で論理積を実行する。
【０４４６】
図６５は、シングルインデックス索引付けの測定結果を示す。シングルインデックス索引付けが完全なスケーラビリティを提供し、一致帯がロードされた場合であっても、クエリ性能がデータベース内のレコード数に著しく依存しないことを観察することができた。なお、性能における急な山は、Java仮想マシンガベージコレクションによって生じた。
【０４４７】
図６６は、結果サイズの増大に伴ってクエリ性能（毎秒当たりのクエリ数）を測定した第２の実験の結果を示す。クエリ矩形は、緯度及び経度で＋／−０．０１度から＋／−０．２０度に増大した。２８５０万レコードをまず、データベースにロードした。可変精度索引付けが、より大きな結果で最良にスケーリングされる（なお、メモリ制約に起因して、可変精度索引付けでは部分データのみをロードすることができた）ことを観察することができた。シングルインデックス索引付けも良好な性能を提供する。これは特に、緯度及び経度に加えて、ＩＤもインタリーブ様式で格納される場合、当てはまる。三重インタリーブインデックス結果の性能利得が、増大した数の共通プレフィックスパスから生じると考えられ、これは、より小さなメモリフットプリント（４６．０１バイト／ポイント対４４．７６バイト／ポイント）によっても証明される。ツリー内の分岐数が少なく、ツリーをトラバースする再帰ステップ数の減少に繋がり得るため、性能はより良好であり得る。
【０４４８】
Luceneデータベースを使用した従来技術による索引付けは、全ての結果サイズで略一定の結果を届けたが、シングルインデックス索引付けよりも低い性能レベルであった。標準索引付け（インタリーブされない２つのインデックス）及び二次元索引付け（インタリーブされた２つのインデックス）の性能は、小さな結果サイズでのLuceneデータベースを使用した従来技術による索引付けよりも良好であったが、大きな結果サイズでは性能が低下した。図６７は、図６６と同じであるが、ｘ軸に対数尺度を有する結果を示す。この表現では、本発明によるインデックスのクエリ性能が、結果サイズが増大する場合、直線で低下することが分かる。これは、特に２つのシングルインデックス手法が線形スケーラビリティを有し、すなわち、結果サイズが２倍になると、クエリ時間も２倍になることを意味する。
【０４４９】
第３の実験では、索引付け性能（毎秒当たり索引付けされるエントリ数）を測定した。２８５０万個のレコードをロードし、１００，０００個の追加レコード毎に時間を測定した。従来技術によるインデックス及び全てのトライベースの手法は、インデックスの増大に伴って実際に一定の性能を提供することを観察することができる。結果を図６８にまとめる。上述したように、可変精度索引付けの性能は、２ｘ１１個のインデックスエントリをレコード毎に作成する必要があるであるため、あまりよくない。可変精度索引付けと同様の手法である従来技術によるインデックス（Lucene）の性能は更に悪かった。トライベースの標準索引付け及び二次元索引付けは両方ともレコード毎に２つのインデックスエントリを作成し、したがって、同様の索引付け性能を有する。シングルインデックス索引付けは、レコード毎に１つのみのインデックスを作成し、性能が最良である。なお、トライベースの手法では、黒色列は非圧縮トライの結果を表し、明るい列はビットマップ圧縮を使用したトライの結果を表す。
【０４５０】
図６９は、索引付けられたロケーション当たりの異なるインデックスによって必要とされるメモリ空間を比較する。従来技術によるLuceneインデックスは、ビットマップ圧縮を用いた（明るい列）トライベースの標準索引付け及び二次元索引付けよりも多くの空間を使用し、ビットマップ圧縮を用いない場合であっても、シングルインデックス索引付けよりも多くの空間を使用した。トライベースの可変精度索引付けは、任意の他の手法よりもはるかに多くの空間を必要とした。
【０４５１】
標準索引付けが、低又は中基数を有する属性で十分に良好に機能すると結論付けることができる。例えば、製品価格は通常、連続値を有さず、３．９９、４．４９、４．８９等の離散値を有する。ミリ秒精度を有するタイムスタンプとして注文日のような何かを格納する代わりに、値空間を「より」離散させるという要件を満たすために、日精度又は時間精度で格納することで十分であり得る。連続値空間を用いて列を索引付けるために、可変精度索引付けは、特に多次元クエリで使用される場合、より良好な性能を提供する。しかしながら、遅い索引付け及び高いメモリ需要に起因して、可変精度索引付けの使用は、静的用途且つ十分なメモリが利用可能な場合でのみ推奨することができる。密に結びついた次元の場合、シングルインデックス索引付けが、予期される結果サイズが中程度である場合、最良の解決策である。
【０４５２】
多次元インデックスは、空間クエリの状況で本明細書に提示されたが、トライベースの範囲クエリは、多くの他の状況、例えば、グラフデータベースに適用することもできる。プロパティグラフデータベースは、エッジで結ばれたノードに基づき、ノード及びエッジは両方ともプロパティを有する。ノード及びエッジがそれぞれ一意のＩＤで表される場合、ノード−エッジ−ノードの三つ組みを表し、これらの３つのＩＤを次元として使用して問い合わせることができる。なお、同じことは、リソース記述フレームワーク（ＲＤＦ）用語で三つ組みと呼ばれる主語−述語−目的語表現を用いるＲＤＦの状況にも当てはまる。
【０４５３】
上述したように、本発明は、生じた各言葉及びドキュメントＩＤを２つのキー部（文字列，長）として格納することにより、フルテキストサーチ用途にも容易に使用することができる。本発明はプレフィックスツリーに基づくため、プレフィックスツリーの文字列サーチ機能を受け継ぐ。例えば、ファジー（類似性）サーチの効率的な実施に使用することができる。
【０４５４】
実際に、本発明者により実行された測定は、情報検索用途での競争力のある性能を示す。本願の優先日の少し前に実行された実験では、５００，０００の英語Ｗｉｋｉｐｅｄｉａ記事を索引付けた。図７０Ａは、文字数／秒単位でのLucene情報検索ソフトウェアライブラリと比較した本発明の実施形態の平均索引付け性能を示す。本発明のシステムが、長整数の配列が使用された場合（黒色列）のみ、わずかに低い索引付け性能を届けたことが分かる。予期されたように、バイトの配列を用いたビットマップ圧縮が使用された場合（明るい列）、索引付け性能はいくらか低かった。
【０４５５】
図７０Ｂはインデックスサイズ（％単位でのインデックスサイズ／テキストサイズ）を比較する。驚くことに、長整数の配列に基づくメモリモデル（黒色列）であってもLuceneと同等であった−位置合わせ損失があったが。バイトの配列を用いたビットマップ圧縮に基づくメモリモデル（明るい列）は、Luceneよりも必要とする空間が少なかった。
【０４５６】
図７０Ｃはクエリ性能（クエリ数／秒）を示す。この実験での用語クエリは、「from」と組み合わせて単語「which」又は「his」を含む全てのドキュメントをサーチして、いくらかの複雑性及び量を提供した。複数の同時スレッドを用いて、本発明のシステムの性能は、Luceneよりも最高で７倍高い。
【０４５７】
この実験でのファジークエリは、「chica」と同様の単語を含むドキュメントをサーチした。類似性は、編集距離１（レーベンシュタイン距離）により、すなわち、最大で１文字の削除、挿入、及び置換を用いて定義される。この規律では、本発明のシステムは、Luceneよりも４倍〜６倍高速であることが証明された。Lucene及び本発明のシステムの両方が厳密に同量の結果ドキュメントを届けたことに留意することに価値がある：用語クエリでは３１９，８０９、ファジークエリでは３０，９９４。
【０４５８】
上述した実験を本願の出願日の少し前、すなわち、約１年後に繰り返した。繰り返した実験の結果は図７０Ｄ〜図７０Ｆに見ることができる。
【０４５９】
図７０Ｄにおいて見て取ることができるように、索引付け性能はここで、先の実験よりも低かった。本発明のシステムでは、メモリ管理がここで、いくらかの性能を犠牲にして完全に実施されたため、低かった。Luceneシステムでは、Lucene索引付けが１スレッド／ＣＰＵコアのみで実行されたため、低かった。これは、本発明によるシステムも１スレッド／ＣＰＵコアのみを用いて実施されたため、よりよい比較性を得るために行われた。なお、本発明のシステムによる索引付けは、並列化することもできるが、これは本発明者によってまだ実施されていない。
【０４６０】
図７０Ｅは、インデックスサイズが先の実験と比較して実際に同じままであることを示す。
【０４６１】
図７０Ｆは、本発明のシステムのクエリ性能が、特にファジーサーチにおいて先の実験と比較して改善したことを示す。先の実験では、図４８Ｃに示すように、完全文字列に関連付けられた状態に対応するノードのみを含むＤＦＡのみが前もって生成された。図４８Ｄに示される中間状態（完全文字列に関連付けられていない有限オートマトンの状態）は、文字の符号化が２つ以上のキー部分を必要とすることに起因して存在し、論理積演算中、オンザフライで動的に特定された。これとは対照的に、後の実験では、状態及び遷移の完全な集合を有する有限オートマトンが前もって生成され、図４８Ｅに示されるように、複数の配列（マトリックス）の配列として格納された。この手法は、約２倍のクエリ性能の改善２もたらした。Luceneシステムは、先の実験と比較して同様の倍数で改善し、この改善は、本願の優先日と出願日との間にLuceneシステムで行われた特定の最適化に起因する。
【図１】
2020098583.tif 000015
【図２】
2020098583.tif 000016
【図３】
2020098583.tif 000017
【図４】
2020098583.tif 000018
【図５】
2020098583.tif 000019
【図６】
2020098583.tif 000020
【図７Ａ】
2020098583.tif 000021
【図７Ｂ】
2020098583.tif 000022
【図７Ｃ】
2020098583.tif 000023
【図８】
2020098583.tif 000024
【図９】
2020098583.tif 000025
【図１０】
2020098583.tif 000026
【図１１】
2020098583.tif 000027
【図１２】
2020098583.tif 000028
【図１３】
2020098583.tif 000029
【図１４Ａ】
2020098583.tif 000030
【図１４Ｂ】
2020098583.tif 000031
【図１４Ｃ】
2020098583.tif 000032
【図１５】
2020098583.tif 000033
【図１６】
2020098583.tif 000034
【図１７】
2020098583.tif 000035
【図１８】
2020098583.tif 000036
【図１９】
2020098583.tif 000037
【図２０】
2020098583.tif 000038
【図２１】
2020098583.tif 000039
【図２２】
2020098583.tif 000040
【図２３】
2020098583.tif 000041
【図２４】
2020098583.tif 000042
【図２５】
2020098583.tif 000043
【図２６】
2020098583.tif 000044
【図２７】
2020098583.tif 000045
【図２８】
2020098583.tif 000046
【図２９】
2020098583.tif 000047
【図３０】
2020098583.tif 000048
【図３１】
2020098583.tif 000049
【図３２】
2020098583.tif 000050
【図３３】
2020098583.tif 000051
【図３４】
2020098583.tif 000052
【図３５】
2020098583.tif 000053
【図３６】
2020098583.tif 000054
【図３７】
2020098583.tif 000055
【図３８】
2020098583.tif 000056
【図３９】
2020098583.tif 000057
【図４０】
2020098583.tif 000058
【図４１】
2020098583.tif 000059
【図４２】
2020098583.tif 000060
【図４３】
2020098583.tif 000061
【図４４】
2020098583.tif 000062
【図４５】
2020098583.tif 000063
【図４６】
2020098583.tif 000064
【図４７】
2020098583.tif 000065
【図４８】
2020098583.tif 000066
【図４８Ａ】
2020098583.tif 000067
【図４８Ｂ】
2020098583.tif 000068
【図４８Ｃ】
2020098583.tif 000069
【図４８Ｄ】
2020098583.tif 000070
【図４８Ｅ】
2020098583.tif 000071
【図４９】
2020098583.tif 000072
【図５０】
2020098583.tif 000073
【図５１】
2020098583.tif 000074
【図５２】
2020098583.tif 000075
【図５３】
2020098583.tif 000076
【図５４】
2020098583.tif 000077
【図５５】
2020098583.tif 000078
【図５６】
2020098583.tif 000079
【図５７】
2020098583.tif 000080
【図５８】
2020098583.tif 000081
【図５９】
2020098583.tif 000082
【図６０】
2020098583.tif 000083
【図６１】
2020098583.tif 000084
【図６２】
2020098583.tif 000085
【図６３】
2020098583.tif 000086
【図６４】
2020098583.tif 000087
【図６５】
2020098583.tif 000088
【図６６】
2020098583.tif 000089
【図６７】
2020098583.tif 000090
【図６８】
2020098583.tif 000091
【図６９】
2020098583.tif 000092
【図７０Ａ】
2020098583.tif 000093
【図７０Ｂ】
2020098583.tif 000094
【図７０Ｃ】
2020098583.tif 000095
【図７０Ｄ】
2020098583.tif 000096
【図７０Ｅ】
2020098583.tif 000097
【図７０Ｆ】
2020098583.tif 000098
【手続補正書】
【提出日】令和1年11月14日(2019.11.14)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
電子データベースアプリケーション又は情報検索システムにおいて使用されるトライであって、前記トライは１つ又は複数のノードを含み、
子ノードである各ノードにはキー部分が関連付けられ、
前記トライ内のノードが関連付けられたキーは、ルートノードからそのノードまでのパス上の前記ノードに関連付けられた前記キー部分を連結したものによって定義され、
前記キーは制御情報及びコンテンツ情報を含む、トライ。
【請求項２】
前記キーは、前記コンテンツ情報を含む１つ又は複数のキー部を含み、前記キー部のそれぞれについて、前記制御情報は、前記キー部に含まれる前記コンテンツ情報のデータ型を指定するデータ型情報要素を含む、請求項１に記載のトライ。
【請求項３】
前記キー部は、前記キー部に含まれる前記コンテンツ情報の前記データ型を指定する前記データ型情報要素を含む、請求項２に記載のトライ。
【請求項４】
前記データ型情報要素は、コンテンツ情報要素の前に配置される、請求項３に記載のトライ。
【請求項５】
データ型情報要素は一緒に配置され、データ型が前記データ型情報要素によって指定されるコンテンツ情報要素と同順又は逆順で配置される、請求項２に記載にトライ。
【請求項６】
前記制御情報は、前記キーにおいて前記コンテンツ情報の前に配置される、請求項５に記載のトライ。
【請求項７】
前記キーは、異なるデータ型のコンテンツ情報を含む２つ以上のキー部を含む、請求項２〜６のいずれか一項に記載のトライ。
【請求項８】
前記データ型の少なくとも１つは、固定サイズのデータ型である、請求項２〜７のいずれか一項に記載のトライ。
【請求項９】
前記固定サイズのデータ型は整数、長整数、又は倍精度浮動小数点、又は時間／日付けプリミティブである、請求項８に記載のトライ。
【請求項１０】
前記データ型の少なくとも１つは、可変サイズのデータ型である、請求項２〜９のいずれか一項に記載のトライ。
【請求項１１】
前記可変サイズのデータ型は、文字列又は可変精度整数である、請求項１０に記載のトライ。
【請求項１２】
前記キー部の情報は、２つ以上のキー部分に含まれる、請求項２〜１１のいずれか一項に記載のトライ。
【請求項１３】
キー部に含まれる前記コンテンツ情報の前記データ型は、可変サイズのデータ型であり、前記コンテンツ情報要素の終わりは、前記キー部を含む前記キー部分の特定の１つ内の特定のシンボルにより又は特定のビットにより記される、請求項２〜１２のいずれか一項に記載のトライ。
【請求項１４】
前記制御情報は、最後のキー部を識別する情報を含む、請求項２〜１３のいずれか一項に記載のトライ。
【請求項１５】
前記制御情報は、トライが動的集合の格納に使用されるか、それとも連想配列の格納に使用されるかについての情報を含む、請求項１〜１４のいずれか一項に記載のトライ。
【請求項１６】
２つ以上の子ノードを有する親ノードは、ビットマップ及び幾つかのポインタを含み、各ポインタには前記ビットマップにおいて設定されたビットが関連付けられ、各ポインタは前記ノードの子ノードを指す、請求項１〜１５のいずれか一項に記載のトライ。
【請求項１７】
特に、キー若しくはキー及び値を格納し、クエリの結果キー若しくはキー及び値を格納し、及び／又はクエリの入力キー若しくはキー及び値を格納する、電子データベースアプリケーション又は情報検索システムにおいて請求項１に記載のトライを使用するコンピュータ実施方法。
【請求項１８】
請求項１〜１６のいずれか一項に記載のトライを生成するコンピュータ実施方法。
【請求項１９】
請求項１〜１６のいずれか一項に記載のトライを格納した非一時的コンピュータ可読媒体。
【手続補正書】
【提出日】令和2年4月23日(2020.4.23)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】０１９１
【補正方法】変更
【補正の内容】
【０１９１】
【図１】従来技術によるデータベースで使用されるトライデータ構造の一例を示す。
【図２】従来技術で使用されるトライデータ構造の別の例を示す。
【図３】図２のトライデータ構造の従来技術による実施を示す。
【図４】図２のトライデータ構造の別の従来技術による実施を示す。
【図５】図２のトライデータ構造の別の従来技術による実施を示す。
【図６】従来技術によるトライにおいて、ノードの子ポインタがいかに決定されるかを示す。
【図７Ａ】本発明によるトライにおいて、リーフノードがマップにいかに格納されるか及び「最後」のビットマップがいかに集合に格納されるかを示す。
【図７Ｂ】本発明によるトライにおいて、リーフノードがマップにいかに格納されるか及び「最後」のビットマップがいかに集合に格納されるかを示す。
【図７Ｃ】本発明によるトライにおいて、リーフノードがマップにいかに格納されるか及び「最後」のビットマップがいかに集合に格納されるかを示す。
【図８】本発明による第１の空間最適化が効率的であるトライの一例を提供する。
【図９】本発明による第１の空間最適化を示す。
【図１０】本発明による第２の空間最適化が効率的なトライの一例を提供する。
【図１１】本発明による第２の空間最適化の汎用格納構成を示す。
【図１２】本発明による第２の空間最適化を示す。
【図１３】本発明により空間最適化されたトライのノードがいかに、汎用的にアクセスされるかを示す。
【図１４Ａ】本発明により空間最適化されたトライへのキーの挿入を示す。
【図１４Ｂ】本発明により空間最適化されたトライへのキーの挿入を示す。
【図１４Ｃ】本発明により空間最適化されたトライへのキーの挿入を示す。
【図１５】本発明による第１及び第２の空間最適化の効率を測定するために行われた実験の結果を示す。
【図１６】本発明による第３の空間最適化を示す。
【図１７】本発明による第３の空間最適化の効率を測定するために行われた実験の結果を示す。
【図１８】本発明によるトライに格納すべき制御情報及びコンテンツ情報をキー内に配置する第１の方法を示す。
【図１９】本発明によるトライに格納すべき制御情報及びコンテンツ情報をキー内に配置する第２の方法を示す。
【図２０】本発明によるキー符号化の一例を示す。
【図２１】本発明により符号化されたキーを格納するトライを示す。
【図２２】値（Ｘ＝１２，Ｙ＝４５）を有する二次元キーの一例を示す。
【図２３】図２１に示されたキーをいかに本発明によるトライに格納することができるかの一例を与える。
【図２４】従来技術でのデータベースクエリ処理フェーズを示す。
【図２５】従来技術によるデータベースで使用される例示的なクエリ実行プランを示す。
【図２６】従来技術によるデータベースにおけるクエリ実行モデルに従った演算子制御及びデータフローを示す。
【図２７】従来技術によるデータベースのクエリ実行プランに従った１度に１タプルの処理を示す。
【図２８】従来技術によるデータベースのクエリ実行モデルに従った１度に１演算子の処理を示す。
【図２９】本発明のクエリ実行モデルに従ったトライ制御及びデータフローを示す。
【図３０】本発明による２つのトライに論理積演算子を適用する一例を示す。
【図３１】本発明による論理積が実行される２つのトライ例を示す。
【図３２】レベル１及びレベル２で図３１の２つのトライ例のビットマップに対して実行されたビット毎のＡＮＤ演算を示す。
【図３３】図３１の２つのトライへの論理積演算中の分岐スキップを示す。
【図３４】図３１の２つのトライへの論理積演算の結果トライを示す。
【図３５】本発明による、２つのトライに論理和演算子を適用する一例を示す。
【図３６】図３５の２つのトライへの論理和演算の結果トライを示す。
【図３７】本発明による、２つのトライに差分演算子を適用する一例を示す。
【図３８】本発明による、範囲クエリにおける論理積演算し、入力集合トライ、及び範囲トライの相互作用を示す。
【図３９】本発明による範囲クエリを実行する方法の一例を示す。
【図４０】本発明による二次元範囲クエリを実行する方法の一例を示す。
【図４１】図４０の一次元範囲トライがインタリーブされていかに結合されるかを示す。
【図４２】図４１の結果として得られたインタリーブ範囲トライを示す。
【図４３】図４０の一次元範囲トライが非インタリーブでいかに結合されるかを示す。
【図４４】図４３の結果として得られた非インタリーブ範囲トライを示す。
【図４５】入力集合トライが非インタリーブで格納される場合、範囲クエリ中、図４０の入力集合トライのどのノードが訪問されるかを示す。
【図４６】入力集合トライがインタリーブで格納される場合、範囲クエリ中、図４０の入力集合トライのどのノードが訪問されるかを示す。
【図４７】一次元出力を有する本発明による二次元範囲クエリを示す。
【図４８】新たに作成された一次元トライを示す。
【図４８Ａ】最大編集距離２を有するサーチ文字列「ａｂｃ」に一致する非決定性有限オートマトンを示す。
【図４８Ｂ】編集距離１の場合の「ａｂｃ」に一致する決定性有限オートマトンを示す。
【図４８Ｃ】図４８Ｂのオートマトンの遷移の拡大を示し、ユニコード文字の符号化方式及び図２１を参照して説明したユニコード文字の文字列が使用される。
【図４８Ｄ】１０ビットの各ユニコード文字が２つのキー部分により表されるマッチトライの結果上部を示す。
【図４８Ｅ】図４８Ｄのマッチトライを導出することができる完全有限オートマトンの状態を表すのに使用することができる、複数の配列の１配列としてのデータ構造を示す。
【図４９】ミュンヘンのエリア内の小さな矩形内の全ロケーションの実験的ジオデータサーチクエリの仕様を示す。
【図５０】第１の一連の実験的ジオデータサーチクエリを実行するデータベースにロードされた残りのレコードを示す。
【図５１】第２の一連の実験的ジオデータサーチクエリを実行するデータベースにロードされた残りのレコードを示す。
【図５２】実験的ジオデータサーチクエリにより決定された暫定結果集合及び最終結果集合を示す。
【図５３】従来技術による手法の性能測定結果を示す。
【図５４】本発明による標準索引付け手法で使用される非インタリーブ二次元インデックストライでの抽象ビューを示す。
【図５５】本発明による標準索引付け手法でのマルチＯＲ演算子の使用を示す。
【図５６】本発明による標準索引付け手法で使用される構成要素の概要を提供する。
【図５７】本発明による標準索引付け手法の性能測定結果を示す。
【図５８】本発明による可変精度索引付け手法の第１レベルインデックスの一例を示す。
【図５９】本発明による可変精度索引付け手法の第２レベルインデックスの一例を示す。
【図６０】本発明による可変精度索引付け手法の性能測定結果を示す。
【図６１】本発明による二次元索引付け手法において、インタリーブで格納された２項目キーの部分が、互いと又は範囲トライの部分といかに結合されるかを示す。
【図６２】本発明による二次元索引付け手法の性能測定結果を示す。
【図６３】本発明によるシングルインデックス索引付け手法での３項目キーを格納するインデックスの構造を示す。
【図６４】本発明によるシングルインデックス索引付け手法で使用される構成要素の概要を提供する。
【図６５】本発明によるシングルインデックス索引付け手法の性能測定結果を示す。
【図６６】結果サイズの増大に伴ってクエリ性能を測定した実験の結果を示す。
【図６７】対数ｘ軸を有する図で図６６の結果を示す。
【図６８】インデックスサイズの増大に伴って索引付け性能を測定した実験の結果を示す。
【図６９】異なる索引付け手法の空間要件を示す。
【図７０Ａ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｂ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｃ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｄ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｅ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【図７０Ｆ】情報検索アプリケーションにおいて、従来技術のインデックスを使用したデータベースと本発明によるインデックスを使用したデータベースとを索引付け性能、インダックスサイズ、及びクエリ性能に関して比較する。
【外国語明細書】
2020098583000001.pdf