(57)【要約】【課題】効率的な問合せ処理を可能にするデータベース管理システムを編成する代替方法を提供すること。【解決手段】参照テーブルは、データ属性に関連付けた列、およびデータの集まりでその属性に割り当てられた関連ワードを含む行を有し、このワードは、独立した数のレコードを有する異なるデータ・テーブルに由来する。記憶されているデータは、属性に関連付けたワード・シソーラス、およびそれぞれシソーラス項目に関連付けた参照テーブル行識別子を含む。属性に関連付けた各ワード・シソーラスは、データ集合体の中のこのデータ属性に割り当てられたワードごとに個々の項目を有する。参照テーブルは、仮想テーブルでもよいが、全シソーラスの項目用に統一された代数的枠組を定義する。【選択図】図１８
2008269643.tif 000002
【特許請求の範囲】
【請求項１】
データベース・システムで問合せを処理する方法であって、
−  データ集合体を表す情報をメモリ手段に記憶するステップを含み、データ集合体は、データ属性に個々に関連付けられた列を有する参照テーブルの個々の行を指定する複数の行識別子を用いて編成され、前記行が、データ集合体内で前記属性に指定された関連ワードのグループを含み、記憶された情報は、それぞれが個々の属性に関連付けられた複数のシソーラス、およびそれぞれが前記シソーラスの項目に関連付けられた参照テーブル行識別子リストを表すデータを含み、１つの属性に関連付けられた各シソーラスが、前記１つの属性に指定できるワード・セットのサブセットへの区分に関して定義され、データ集合体で前記１つの属性に指定された少なくとも１つのワードを含むサブセットごとに個々の項目を有し、前記シソーラス項目に関連付けられた参照テーブル行識別子リストが、前記１つの属性に指定された前記サブセットのワードを有する参照テーブルの行に割り当てられた任意の識別子を含み、
−  問合せに関連するシソーラス項目の組合せ、および前記関連シソーラス項目に関連付けられた参照テーブル行識別子リストを表す記憶データに基づいて、マッチング参照テーブル行識別子リストを決定するために、メモリ手段と協働するプロセッサ手段に問合せをするステップと、
−  応答を出力するため、プロセッサ手段によって、前記マッチング行識別子リストを処理するステップとを含み、
前記マッチング行識別子を処理するステップが、問合せで指定された少なくとも１つの属性について、前記属性に関連付けられたシソーラスを選択することと、マッチング行識別子リストとの非空白交差を有する識別子リストが関連付けられた選択シソーラスの項目を検出することとを含む方法。
【請求項２】
問合せで指定された前記属性が、異なる接頭語長に関連付けられ、記憶されたＱ＋１個のシソーラスを有し、Ｑは少なくとも０に等しい整数であり、前記Ｑ＋１個のシソーラスがそれぞれ、０≦ｑ≦Ｑになるようなシソーラス・レベル・パラメータｑを有し、それにより接頭語長が、レベル・パラメータｑの減少関数であって、ｑ＝０の場合は、前記属性のワード長に対応し、前記Ｑ＋１個のシソーラスがそれぞれ、前記シソーラスに関連付けられた接頭語長を有する共通の接頭語で開始するワードでそれぞれ構成されたサブセットへの個々の区分に関して定義され、前記シソーラスの項目が、前記接頭語長に基づき記憶される、請求項１に記載の方法。
【請求項３】
レベル・パラメータＱＡ≧０を有する選択されたシソーラスで、メモリ手段と協働するプロセッサ手段による選択されたシソーラスの項目の検出が、
／ａ／  ＱＡ≦ｑ≦Ｑの場合に、個々のレベルｑ目標リストおよびレベルｑシソーラスの連続項目を含む個々のレベルｑシソーラス範囲を設けるステップと、
／ｂ／  レベルＱ目標リストをマッチング行識別子リストで初期化し、レベル・パラメータｑを値Ｑで初期化し、レベルＱシソーラス範囲の第１の項目を選択するステップと、
／ｃ／  レベルｑ目標リストとレベルｑシソーラス範囲の選択項目に関連付けられた識別子リストとの間の交差リストを決定するステップと、
／ｄ／  先行ステップ／ｃ／で決定した交差リストが空白である場合に、レベルｑシソーラス範囲の別の項目を選択して、ステップ／ｃ／を繰り返すステップと、
／ｅ／  ｑがＱＡより大きい場合、
／ｅ１／  レベルｑ−１目標リストを先行ステップ／ｃ／で決定した交差リストと等しく設定し、
／ｅ２／  レベルｑ−１シソーラス範囲を、選択されたレベルｑシソーラス項目のレベルｑ接頭語で開始するレベルｑ−１接頭語に関するレベルｑ−１シソーラスの項目で構成するものと設定し、
／ｅ３／  ｑを１ユニットだけ減少させて、ステップ／ｃ／に戻るステップと、
／ｆ／  ｑがＱＡと等しい場合、
／ｆ１／  検出した項目に選択したレベルＱＡシソーラス項目を含み、
／ｆ２／  レベルＱ目標リストが、先行ステップ／ｃ／で決定された交差リストと等しい場合は、選択されたシソーラスでの項目の検出を終了し、
／ｆ３／  前記交差リストにない少なくとも１つの整数を含む任意の目標リストから、先行ステップ／ｃ／で決定された交差リストの整数を除去し、
／ｆ４／  ｑを、目標リストが前記交差リストにない少なくとも１つの整数を含む最小レベル・パラメータと設定し、
／ｆ５／  レベルｑシソーラス範囲の別の項目を選択し、ステップ／ｃ／に戻るステップとを含む、請求項２に記載の方法。
【請求項４】
ｎ個の連続コード化層を含むコード化方式を使用して、０≦ｑ≦Ｑの場合に、レベルｑシソーラス項目に関連付けられた識別子リストを表すコード化データを提供し、ｎが少なくとも１に等しい数字であり、各層が、前記層の入力リストの整数を含む範囲をサブセットに分割するための所定のパターンを有し、前記識別子リストが、前記シソーラス項目の第１の層の入力リストであり、最終層以外の任意の層について、前記入力リストの少なくとも１つの整数を含む各サブセットの位置を前記層のパターンで表す整数リストが、次層の入力リストを形成し、
コード化データが、層ごとに、および前記入力リストの少なくとも１つの整数を含むサブセットごとに、前記サブセットにおける前記入力リストの各整数の位置を表すデータを備え、少なくとも前記層が最終層である場合には、前記サブセットの位置を前記層のパターンで表すデータを備え
各レベルｑ目標リストが層１およびレベルｑフィルタリング・リストを形成し、ＱＡ≦ｑ≦Ｑの場合に、コード化方式の層１入力リストとして提出されて、ｎ＞１の場合は、１＜ｋ≦ｎについて個々の層ｋおよびレベルｑフィルタリング・リストを提供し、レベルｑ目標リストから提供された前記層ｋおよびレベルｑフィルタリング・リストが、コード化方式で前記レベルｑ目標リストから獲得された層ｋ入力リストである、請求項３に記載の方法。
【請求項５】
メモリ手段と協働するプロセッサ手段によってレベルｑ目標リストと識別子リストとの間の交差リストを決定するステップ／ｃ／が、ｋ＝ｎから、
／ｃ１／  コード化方式で前記識別子リストから獲得された層ｋ入力リストと、前記レベルｑ目標リストに対応する層ｋおよびレベルｑフィルタリング・リストとの間の層ｋ交差リストを計算することと、
／ｃ２／  計算した層ｋ交差リストが空白である場合は、レベルｑ目標リストと識別子リストとの間の前記交差リストを空白であると判断することと、
／ｃ３／  ｋ＝１の場合は、レベルｑ目標リストと識別子リストとの間の前記交差リストを、計算された層１交差リストであると判断することと、
／ｃ４／  ｋ＞１の場合は、ｋを１ユニット減少させて、ステップ／ｃ１／から繰り返すこととを含む、請求項４に記載の方法。
【請求項６】
メモリ手段と協働するプロセッサ手段によってマッチング行識別子リストを処理するステップが、さらに、選択されたシソーラスの任意の検出項目に関連付けられた出力データを出力テーブルに書き込むことを含み、出力テーブルが、マッチング行識別子リストの各識別子に対応する個々の行を含み、選択シソーラスの検出された項目に関連付けられた出力データが、マッチング行識別子リストと、前記検出シソーラス項目に関連付けられた識別子リストとの両方に属する参照テーブル行識別子に対応する出力テーブルの任意の行に書き込まれる、請求項１から請求項５のいずれか１項に記載の方法。
【請求項７】
各参照テーブル行識別子が、自身に対応する出力テーブルの個々の行を有し、出力テーブルの行が、出力データを書き込む前にデフォルト値で初期化され、デフォルト値を含まない出力テーブルの行が、出力データの書き込み後に読み出される、請求項６に記載の方法。
【請求項８】
出力テーブルが、参照テーブル行識別子ごとに個々のレコードを有する索引ファイルに関連付けられ、参照テーブル行識別子は、デフォルト値、または前記参照テーブル行識別子に対応する出力テーブルの個々の行を指定するポインタを含み、索引ファイルのレコードが、出力データの書き込み前にデフォルト値で初期化され、マッチング行識別子リストと、第１の選択シソーラスの前記検出項目に関連付けられた識別子リストとの両方に属する参照テーブル行識別子ごとに、メモリ手段と協働するプロセッサ手段によって、前記第１の選択シソーラスの検出項目に関連付けられた出力データを書き込むステップが、
−  前記参照テーブル行識別子に対応して、出力テーブルの使用可能な行を割り当てることと、
−  出力データを割り当てた行に書き込むことと、
−  割り当てた行を指すポインタを、前記参照テーブル行識別子のために設けた索引ファイルのレコードに書き込むこととを含む、請求項６に記載の方法。
【請求項９】
出力テーブルが、シソーラスが選択された個々の属性にそれぞれ関連付けられた複数の列を有し、出力テーブルの列に関連付けられた属性について選択されたシソーラスの検出項目に関連付けられた出力データが、前記列に書き込まれる、請求項６から請求項８のいずれか１項に記載の方法。
【請求項１０】
メモリ手段と協働するプロセッサ手段によって、少なくとも１つの第２の選択シソーラスの検出項目に関連付けられた出力データを書き込むステップが、マッチングデータ・グラフ識別子リストと、第２の選択シソーラスの前記検出項目に関連付けられた識別子リストとの両方に属するデータ・グラフ識別子ごとに、
−  前記データ・グラフ識別子のために設けた索引ファイルのレコードに含まれたポインタを読み出すことと、
−  出力データを、前記ポインタによって指定された出力テーブルの行に書き込むこととを含む、請求項８および請求項９の両方に記載の方法。
【請求項１１】
選択シソーラスの検出項目に関連付けられた出力データが、前記シソーラス項目から導出された数値を備える、請求項６から請求項１０のいずれか１項に記載の方法。
【請求項１２】
少なくとも１つの選択シソーラスの検出項目について、前記数値が、前記項目に記憶されたシソーラス値、および出力テーブルに既に存在する少なくとも１つの値を含む複数の値に、数学的関数を適用することによって計算される、請求項１１に記載の方法。
【請求項１３】
出力テーブルが、マッチング行識別子リストの各識別子に対応する個々の行を含み、検出されたシソーラス項目から導出された数値が、マッチング行識別子リストと、前記検出シソーラス項目に関連付けられた識別子リストとの両方に属する参照テーブル行識別子に対応する出力テーブルの任意の行に書き込まれる、請求項１１または請求項１２のいずれか１項に記載の方法。
【請求項１４】
第１の選択シソーラスの検出項目から導出され、マッチング行識別子リストと、前記第１の選択シソーラスの前記項目に関連付けられた識別子リストとの両方に属する参照テーブル行識別子に対応する出力テーブルの任意の行に書き込まれた数値が、前記項目に記憶されたシソーラス値から獲得され、
少なくとも１つの第２の選択シソーラスの検出項目から導出され、マッチング行識別子リストと、第２の選択シソーラスの前記項目に関連付けられた識別子リストとの両方に属する参照テーブル行識別子に対応する出力テーブルの行に書き込まれた数値が、前記項目に記憶されたシソーラス値、および出力テーブルの前記行に既に存在する少なくとも１つの値を含む複数の値に、数学的関数を適用することによって計算される、請求項１３に記載の方法。
【請求項１５】
それぞれ出力テーブルの行に書き込まれた数値のセットから出力値を計算することをさらに含む、請求項１３または請求項１４のいずれか１項に記載の方法。
【請求項１６】
参照テーブルの行を指定する識別子を含む整数範囲が、複数の所定の部分に区分され、識別子リストを表すデータの少なくとも一部が、それぞれ前記部分に関連付けられたメモリ手段の複数の記憶セクションに分散し、前記部分の１つに関連付けられた記憶セクションが、前記部分の識別子で構成された識別子サブリストを表すデータを含み、
マッチング行識別子リストを決定するステップが、個々の記憶セクションによって、参照テーブル行識別子範囲の異なる部分ごとに、プロセッサ手段によって、別個に実行される、請求項１から請求項１５のいずれか１項に記載の方法。
【請求項１７】
マッチング行識別子を処理するステップが、個々の記憶セクションによって、参照テーブル行識別子範囲の異なる部分ごとに、プロセッサ手段によって、少なくとも一部は別個に実行される、請求項１６に記載の方法。
【請求項１８】
前記参照テーブルが、記憶されていない仮想テーブルである、請求項１から請求項１７のいずれか１項に記載の方法。
【請求項１９】
請求項１から請求項１８のいずれか１項に記載の方法を実行するため構成され、かつプログラムされたメモリ手段およびプロセッサ手段を備える、データ集合体からの情報を管理するデータベース・システム。
【請求項２０】
コンピュータ・プログラム製品であって、前記製品をコンピュータのプロセッサ手段上で実行する場合に、請求項１から請求項１８のいずれか１項に記載の方法を実行するためのソフトウェア・コード部分を備える、ディジタル・コンピュータの内部メモリにロード可能なコンピュータ・プログラム製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、リレーショナル・データベース管理システム（ＲＤＢＭＳ）に関し、特に、大量のデータを記憶し、これにアクセスするためのコンピュータ化されたシステムに関する。
【背景技術】
【０００２】
非制限的な方法で、本発明は、「データ・ウェアハウス」に適用することができる。銀行の出納取引や航空座席予約などのオンライン取引処理（ＯＬＴＰ）システムは、例えば、従業員１２３１２４に関する情報を検索するような特定のキーに関連したレコードを検索するよう最適化されている。これに対して、データ・ウェアハウスは、１組のレコードを非常に迅速に検索するよう最適化されている。これは、典型的な問合せが、「地域および地区ごとに全売上げを検索する」または「１カ月ごとに最大量のスポーツウェアを販売している店を検索する」または「昨年の各製品カテゴリについて、上位５店舗を選択する」という理由によるものである。このような問合せは、通常、データ・テーブル内の大きい行セットにアクセスしなければならない。問合せ処理の課題は、全てまたは大部分のデータベースを線走査せずにこれらの問合せを処理することである。
【０００３】
この問題に取り組むため、主に５つの方法が提案されている。（ｉ）多次元アレイ、（ｉｉ）特殊索引、（ｉｉｉ）テーブル・キャッシング、（ｉｖ）最適化した外部キー結合、および（ｖ）近似法である。
【０００４】
（ｉ）多次元アレイ（即ち、マトリクス）
この戦略は、多次元アレイまたはマトリクスとしてデータ・ウェアハウスを実装することで構成される。その例は、米国特許第５，３５９，７２４号および第５，８６４，８５７号で見ることができる。各次元がデータの属性に対応する。例えば、売上げテーブルは、店舗の場所、製品のタイプ、顧客ＩＤなどの座標もマトリクスとして見ることができる。特定の売上げは、これらの属性を全て指定することにより識別することができる。この戦略は、小さいデータベースまたは非常に密なデータベースでうまく働く。密とは、可能な値のデカルト積に全て意味がある、例えば、各顧客が全店舗から全製品を購入する可能性が高いということを意味する。これが真であることは稀なので、この方式は、希薄な（ｓｐａｒｓｅ）値を扱うよう修正しなければならない。これは、希薄な属性と密な属性の概念を定義することによって実行することができる。したがって、例えば、全ての店舗が全ての製品を置いているかもしれない（マトリクスに記憶できる密な関係）が、任意の顧客にとっては、その組合せの一部しか有効でない。したがって、従来の索引は、顧客の売上げに関わっているが、店舗全体または全製品の売上げに関する問合せの密な関係に常に使用される。
【０００５】
（ｉｉ）特殊索引
ビットマップ検索は、データ・ウェアハウスに合わせて調整された索引構造である（例えば、米国特許第５，９０３，８８８号参照）。これらの索引は、既に、問合せの処理を加速するため一部の市販製品で使用されている。属性のビットマップ索引は、その最も簡単な形式では、属性値当たり１つのビット・ベクトル（すなわち、ビットマップ）で構成され、各ビットマップのサイズは、索引が付いた関係にあるレコードの数と等しい。例えば、属性が曜日の場合、その属性には曜日ごとに１つずつ、７個のビットマップ・ベクトルがある。月曜日に対応するビットマップ・ベクトルは、レコードｉが曜日属性に「月曜日」を含む場合、位置ｉに１を有する。このような１つの値に基づく方法は、値リスト索引と呼ばれる。他の技術（例えば、米国特許第５，７６１，６５２号）は、ビット・ベクトルをある値の範囲に関連付け、したがって給料の属性は、０から２０，０００ユーロ、２０，０００．０１から３５，０００ユーロなどの範囲のベクトルになる。さらに、各ビット・ベクトルを任意の位置にあるビット値（１または０）に関連付ける技術もある。したがって、属性にｎビット番号がある場合は、２ｎ個のビット・ベクトルがある（位置１、ビット値１；位置１、ビット値０；位置２、ビット１；・・・）。
【０００６】
ビット・ベクトルの利点は、１つの問合せに応答するのに、複数のビット・ベクトルを容易に使用できることである。それぞれが検索付けられている幾つかの述語に関する問合せを考察してみる。従来の大部分のデータベース管理システムは、索引を１つ（最も「選択的」な索引であり、したがって返す行が最も少ない）しか使用しないが、複数の索引のレコード識別子と交差するよう試みるシステムもある。
【０００７】
ビットマップの方が働きが優れているのは、この方がコンパクトであり、レコード識別子の幾つかの集まりと交差するより幾つかのビットマップと交差する方が、はるかに高速だからである。最善のケースでは、改良点が機械のワード・サイズに比例する。例えば、ワード・サイズが３２ビットとする。この場合、一度に２つのビット・ベクトルが３２ビットと交差することができる。３２ビットの各セットが、交差する３２のレコード識別子に対応する。このような最善のケースは、各述語が選択不可能である（すなわち、多くのレコードが各述語値に一致する）が、述語全体をまとめると非常に選択的である場合に生じる。例えば、「ブラウンの髪で、眼鏡をかけ、３０歳と４０歳の間で、青い目、コンピュータ産業で働き、カリフォルニア在住・・・の人を検索せよ」という問合せを考察されたい。
【０００８】
したがって、マトリクスが最善になるのは、述語のセットが密である（デカルト積の全ての値、またはほとんど全ての値が可能である）場合であり、ビットマップが最善になるのは、述語が密でもなく、個々に選択的でもない場合である。中間の方法（マトリクスに十分な密度があるが、デカルト積の多くの値が存在する場合）は、多次元索引を使用する。４分木、Ｒ木およびその後継者などの多次元索引は、多次元スペースの可変サイズ・グリッドとして実装される。グリッドが可変サイズであるのは、ハイパースペースでは、場所によってポイントの人口が異なるからである。直感的に、フランスの等人口長方形の地図を考察されたい。この長方形は、アルプスよりパリが密になる。このような索引は、空間データ（緯度・経度カドラントに含まれるポイントの検索に使用する場合）にうまく働く。しかし、この代替法は、地理的問合せを除いて商業領域ではそれほど研究されていない。この方式は、次元数の増加とともに規模拡大せず、商用システムは、通常、３次元よりはるかに多いからである。
【０００９】
（ｉｉｉ）テーブル・キャッシング
（そのシステムの作成者ではないので）データベース・システムの頂部に新しい索引を設計するだけの贅沢がない場合、予想される多数の集合問合せを予め計算し、これをテーブルに入れることができる。例えば、大型小売店が複数の店舗または複数の製品にわたる総売上げの合計を問い合わせることが多い場合、このような情報を特殊テーブルに記憶させることができる。このような方式の主要コストは、そのテーブルを更新の面に維持することである。（ディスクのスペースはもはや主要要素ではない。）その例では、店舗Ｓで品目Ｉを売り上げるごとに、Ｉの全製品売上げテーブルおよびＳの全店舗売り上げテーブルを更新しなければならない。したがって、この方式は、問合せと問合せの間に更新が少ない場合は、価値がある。多い場合は価値がない。
【００１０】
（ｉｖ）最適化した外部キー結合
多次元テーブルの問合せは大部分が、中心の「事実テーブル」（例えば、売上げの詳細）と次元テーブルのセット（例えば、店舗の記述、製品の記述、顧客の記述）との間の結合を含む。これは、例えば、売上げテーブルの顧客識別子が、顧客記述テーブルのキーであるので、「外部キー結合」として知られる。（キーは、ある属性に属する値であり、したがってその属性にその属性を有するレコードは１つしかない。）この結合を加速する１つの方法は、事実テーブル・レコードと次元レコードとの間にリンケージを生成する。これは、以下のように３つの基本的方法で実行することができる。
（ａ）事実テーブル・レコードの識別子と次元テーブル・レコードの識別子を保持する索引を作成する。
（ｂ）事実テーブル・レコードと次元テーブル行との間に双方向ポインタを作成する−これは「オブジェクト指向」のデータベースが実行することである。
（ｃ）事実テーブルの顧客レコード識別子を次元テーブルへのオフセットで置換する。
【００１１】
選択肢（ａ）は、テーブルの物理編成の変化から最も影響を受けず、したがって更新が頻繁なシステムには最善である。何故なら、次元テーブルの変更を、そのテーブルの索引のみに反映できるからである。選択肢（ｂ）は、物理編成に対して最も融通性が低い。次元テーブルの再編成が、事実テーブルの更新を含むからである。選択肢（ｃ）は、事実テーブルを変更せずに、次元テーブルに対してその特定の物理的再編成を実行できる（例えば、ディスク上の位置を変更する）という点で、その２つの折衷である。結合最適化の例は、米国特許第５，５４８，７５４号、第５，６７１，４０３号、第５，７２４，５６８号、第５，７５２，０１７号、第５，７６１，６５７号および第５，８２２，７４７号で見ることができる。
【００１２】
（ｖ）近似法
大抵の人は、戦略的な集合情報を取得するためにデータ・ウェアハウスを使用するので、多くはエラー限界を有する限り、高速近似法で満足する。この分野の典型的研究が、米国特許第５，８７０，７５２号で詳しく記述され、これは、エラー限界を与えながら、データ・ウェアハウスの集合結果を推定する方法を示す。基本的問題は、全テーブルのサンプリング、および次の集合の実行が、一般に働かないことである。例えば、キー上でＲとＳを結合したい場合、それぞれの１／１０サンプルをとると、サンプルがランダムであれば、実際の結合のサイズの１／１００であるサイズが与えられる。したがって、より賢くなければならない。その概念は、外部キー結合によって連結されるテーブルＲ，Ｓ，Ｔ，．．．の初期セットをとることである。例えば、Ｒが事実テーブルで、その他が次元テーブルであるとする。Ｒのサンプルをとり、次にＲ’，Ｓ’，Ｔ’，．．．を与えるサンプルに基づいて、これらの外部キー結合を全て実行する。次に、問合せがＲ、Ｓ、Ｔに関連し、その間の外部キー連結を含む場合、照会は、Ｒ’、Ｓ’、Ｔ’に関して非常に正確に実行することができる。エラーは、Ｒ’の幾つかの区画によって獲得された結果を考察し、その変化を調べることによって推定することができる。
【発明の開示】
【発明が解決しようとする課題】
【００１３】
本発明の目的は、効率的な問合せ処理を可能にするデータベース管理システムを編成する代替方法を提供することである。
【課題を解決するための手段】
【００１４】
本発明は、添付の請求項で述べるように、データベース・システムで情報を編成し、問合せを処理する方法を提案する。本発明は、さらに、このような方法を実施するように配置され、プログラムされた手段を備え、データの集まりから情報を管理するデータベース・システム、さらに、このような方法を実行するための命令を有するコンピュータ・プログラム製品を提案する。
【００１５】
本発明の別の態様は、コンピュータ・システムで整数リストを扱う方法に関する。非制限的な方法で、本発明のこの態様は、ＲＤＢＭＳの分野に適用することができ、整数リストは、様々なテーブルのレコードの識別子を表すことができる。
【００１６】
コンピュータ・システムでは、整数リストを、整数リストの明示的形態で、またはビットマップ・ベクトルの形態で同等に記憶し、扱えることがよく知られている。ビットマップ・ベクトルは２進成分を有し、各成分は、成分のランクに対応する整数がリストに属する（１）か、属さない（０）かを示す。ベクトルの次元は、少なくともリストの最大整数と等しくなければならない。
【００１７】
ビットマップ表示が都合がよいのは、ベクトルの２進成分を通常のプロセッサの最も基本的な演算であるブール演算にかけることにより、コード化されたリストで多様な操作を実行できるからである。例えば、整数リストは、ブールＡＮＤ演算によって容易に交差したり、ブールＯＲ演算によってマージしたり、ブールＮＯＴ演算によって補足したりする。
【００１８】
リストの整数が潜在的に大きい場合は、ビットマップ・ベクトルの次元が大きくなり、したがってその形式でリストに記憶するために必要なメモリ・スペースが問題となる。リストが、大きい範囲の整数で充填されることが稀である場合、明示的整数フォーマットは、はるかにコンパクトになる。すなわち、範囲［０，２３２］の整数Ｋ個のリストは、ビットマップ・フォーマットにＫ×３２ビットすなわち、２３２≒４３億ビットが必要である。
【００１９】
ビットマップ表示のこの限界を克服するため、ビットマップ圧縮法が提案されている。この方法は、成分の値が定数であるベクトルの領域を、この領域の境界のみを符号化するよう位置決めすることにある。残りの領域は、ビットマップ・セグメントとしてコード化することができる。非常に大きい定数の領域が見られる場合に、相当の利得が獲得される。このようなビットマップ圧縮法の例は、米国特許第５，３６３，０９８号および第５，９０７，２９７号で開示されているようなものである。
【００２０】
このタイプのビットマップ圧縮は、符号化した整数リストの記憶を最適化するが、その扱いは最適化しない。ビットマップで基本的ブール演算を実行する場合、重複したビットマップ・セグメントを検出するために、複数の比較が必要である（米国特許第６，１４１，６５６号参照）。これは計算にとって効率的ではない。また、定数領域およびビットマップ・セグメントのコード化データを、ハード・ドライブ（すなわち、ＲＡＭではない）などのメモリ装置に記憶する場合は、通常、多数のディスク読み取り演算が必要であり、これは処理速度にとって好ましくない。
【００２１】
本発明のこの態様の目的は、整数リストを符号化および／または結合する代替方法を提供することであり、これにより潜在的に大きい次元になるリストを効率的に扱うことができる。
【００２２】
したがって、本発明は、添付の請求項で述べるように、コンピュータ・システムで整数リストを符号化し、結合する方法を提案する。本発明は、さらに、このような方法を実施するように配置され、プログラムされた手段を備えるコンピュータ・システム、さらにこのような方法を実行する命令を有するコンピュータ・プログラム製品を提案する。
【発明を実施するための最良の形態】
【００２３】
仮想データ・グラフ
図１〜図３は、リレーショナル・データベース管理プログラムを実行するよう構成されたプロセッサと結合したコンピュータ・メモリに記憶することができるデータの集まりを示す。この例は、以下の説明では、適宜、本発明の原理および実施形態を例示するよう言及される。
【００２４】
図１〜図３は、データベース・システム内の従来タイプのデータ編成を示す。図示のシステムは、顧客のための保険を管理する仮想保険会社に関連するデータを扱う。データは、それぞれ図１〜図３に示すように、顧客、保険および事故に関する３つのテーブルで編成される。
【００２５】
論理的見地から、各データ・テーブルは、２次元マトリクスで構成され、行はテーブルの個々のレコードに対応し、列はレコードの個々のデータ属性またはデータベースの構造的特徴に対応する（後者のタイプの列は、通常、構内レコード識別キーまたは目標テーブル内でレコードを指定する外部キーを含む）。
【００２６】
しかし、大きいデータベースでは、メモリ媒体、例えば、磁気ディスクへの実際のデータ記憶は、往々にして他の方法で実行されることが理解される。すなわち、各行は通常、メモリ・アドレスを有し、ここに対応する属性値またはキーが列の順序で記憶され、符号化された文字「＼」などの所定の記号で分離される。
【００２７】
提案するデータ構造の説明を容易にするために与えられる簡略化した例では、テーブルはほどほどのサイズである。実際には、通常、これよりテーブルおよびテーブル当たりの属性（列）が多い（それにもかかわらず、１つまたは複数のテーブルが１つの列を有することもある）。さらに、データ・テーブルは、通常、用途に応じて最高数千または数百万行など、はるかに多くのレコードを含む。
【００２８】
その例のデータベースでは、属性７個のグループが、３つのデータ・テーブルに対応する３つのサブグループに分布する。各属性は、そのサブグループに対応するデータ・テーブルに列を有する。顧客データ・テーブル（図１）は３つの属性、すなわち、顧客名、誕生年および性別を有する。図２の保険データ・テーブルは２つの属性、すなわち、保険のタイプ（「自動車」または「住宅」）および保険の有効期日、および顧客テーブルへの連結列を有する。図３の事故データ・テーブルは２つの属性、すなわち、事故日および発生した損害賠償の任意の通貨での金額、および保険テーブルへの連結列を有する。
【００２９】
任意のデータ・テーブルにおいて、各レコード／行は一意の識別子を有し、これは行ＩＤと呼ばれる。この識別子は、レコードが記憶されるメモリ・アドレスに対応し、通常は変換テーブルを通す。これは、一意の行識別のために、データ・テーブルの列の識別キーとして記憶することができるが、これは強制ではない。本明細書の例では、行ＩＤは、データ・テーブルごとにゼロから開始する整数索引であり、テーブルの列には明示的に記憶されない。
【００３０】
図２および図３の最終列で示すように、テーブルの幾つかを相互に連結する。２つのテーブルを直接連結するのは、その一方（ソース・テーブル）が、レコードを他方（目標テーブル）に指定する外部キーを含むために設けた連結列を有する場合である。
【００３１】
これらの外部キーは、これ以降はリンクと呼び、リレーショナル・データベース・システムで扱うデータの階層および編成を反映する。本明細書の例では、保険会社が扱う各事故は、同社が管理する特定の保険、すなわち、図３の保険リンクに関連付けられる。各保険は、同社の特定の顧客用であり、したがって図２の顧客リンク用である。一部のリンクは任意選択でよいことを理解されたい。例えば、第三者が関与する事故もあり、第三者用に別個のテーブルがある場合、事故テーブルの各レコードは、第三者テーブルへのリンクを有する。
【００３２】
各リンクは、通常、目標データ・テーブルの行ＩＤで構成される。例えば、図３の事故テーブルで行ＩＤ＝０として記憶され、１９９８年１０月３日に発生し、１，０００の金額となる事故は、図２の保険テーブルで行ＩＤ＝１として記憶された保険を指す保険リンクを有する。すなわち、顧客が、図１の顧客テーブルの行ＩＤ＝１で１９９８年９月９日に加入した自動車保険、すなわち、１９７６年生まれの男性Ａｎｄｒｅに関連する。目標テーブルが他の形式のレコード識別キー、例えば、複合キーを有する場合、リンクは、このようなキーによって識別される目標レコードも指定する。
【００３３】
リンクの構造は、幾つかの規則に従う。特に、リンクされたデータ・テーブルは、図４に示した階層木編成のような有向非周期グラフ構造を有する。根テーブルは、図３の事故テーブルのように、他にその行を指すリンクを有するデータ・テーブルがないデータ・テーブルと定義される。すなわち、根テーブルは、目標テーブルを構成しない。同様に、葉テーブルは、図１の顧客テーブルのように、リンク列がないデータ・テーブルと定義される。すなわち、葉テーブルは、ソース・テーブルを構成しない。図４は根テーブルを１つしか示さないが、テーブルの木構造は複数の根を有することができる。
【００３４】
特定のケースでは、関連したデータ・テーブルのグループが循環リンクを呈することもある（例えば、顧客テーブルは、各顧客が遭遇した最初、または最近の事故を示すため、事故データ・テーブルへのリンク列を有することがある）。このようなケースでは、データ・テーブルの木編成は、最初に循環の１つのリンクを取り消すことによって復元される。どのリンクを取り消すかは、データベースのセマンティクスによって指示される（上記の例では、当然、顧客テーブルから事故テーブルへのリンクが取り消される）。
【００３５】
データ・テーブル内で、根テーブルから葉テーブルへの経路が定義される。根テーブルから葉テーブルへの各経路は、葉テーブルを指す根テーブルのリンク列によって定義されるか、１つまたは幾つかの中間テーブルを介して一続きのリンク列によって定義される。
【００３６】
図４では、複数の分岐がある木構造を示すため、２つの葉テーブル（点線）が追加されている（図１〜図３の簡略化した例は、実線で示した単経路の木を提供する）。追加された葉テーブルは、前述したような第三者テーブル、および保険テーブルからの目標テーブルである仲介者テーブルであり、保険を商品化する仲介者に関するデータを含む。
【００３７】
相互に連結されたデータ・テーブル・レコードを、同様の木表示（図５〜図７）で見ることができる。図５のレコード木は、事故＃６が、顧客＃２（Ａｒｉａｎｅ）が仲介者＃Ｙを通して加入し、第三者＃Ｘを巻き込んだ保険＃０（自動車）に関連したことを示す。実線は、図２および図３のデータ・テーブルからの個々のリンクを表す。
【００３８】
図６のレコード木は、さらに、図３の最終列から明白なように、保険＃２（顧客＃４（Ｍａｘ）が自宅について加入した）で事故が発生しなかったという理由で、保険テーブルの行ＩＤ＝２へのリンクを有する事故テーブルに追加できる空レコードを示す。
【００３９】
空、すなわち、ダミー・レコードは、データが存在しないことを示す。その属性値は全てデフォルト値（ゼロ）であり、「値なし」を意味する。この方式にこのようなダミー・レコードを挿入する目的は、どのデータ・テーブルにあるどの有効レコードも、根テーブルのレコード（図４）に由来する少なくとも１つのレコード木に属することを確認することである。
【００４０】
空レコードは、ソース・テーブルの少なくとも１つのリンク列の目標テーブルである各データ・テーブルにも存在することができる。ソース・テーブルの行に、対応するリンク列の外部キーがない場合、その行を含むレコード木は、前記目標テーブル位置を空にすることで完成する。この状況は、図６に示した例の仲介者テーブルで発生している。それを示すため、ソース・テーブルのリンク列にデフォルト値（例えば、−１）を書き込むことができ、これによって目標テーブルに明示的に空レコードが存在する。
【００４１】
空レコードは、適宜、前記経路の葉テーブルから根テーブルへと、すなわち、図４の下方向にデータ・テーブルの各単経路を走査するプロセスに挿入される。経路の走査中に１つのソース／目標テーブル対を検査する場合は、ソース・テーブルの関連するリンク列で発生しない目標テーブルの行ＩＤ値が最初に、次にリストの各ミッシング行ＩＤ値がリストされ、前記ミッシング行ＩＤが前記リンク列にある状態で、ソース・テーブルに新しい空レコードが生成される。
【００４２】
幾つかのリンク列を有するデータ・テーブルに空レコードをこのように挿入すると、空レコードは、走査中の経路に関する列以外のどのリンク列でもデフォルト値（−１）を受け取り、対応するリンクが目標テーブルの空レコード宛てであることを示す。この状況は、図６に示した例の第三者テーブルで発生している。
【００４３】
データ・テーブル木を葉から根へと走査することが重要である。そうしないと、目標テーブルの他の空レコードへのリンクを含む空レコードを見過ごすことがある。例が図７に図示され、これは保険が（もう）ない顧客＃０（Ｏｓｃａｒ）に関するレコード木を示す。事故テーブルは、保険テーブルの別の空レコードを指す空レコードを含み、保険テーブルは、顧客＃０を指す。経路を上方向に走査すると、レコード木の根が根（事故）テーブルにない。
【００４４】
図１〜図３に示すような従来のデータベース編成では、メモリの使用を最適化するためにリンク・キーを設ける。それを示すため、図８に示したフラットファイルを参照することができ、これは図１〜図３の３つのデータ・テーブルと全く同じ情報内容を有する（結局、第三者および仲介者テーブルは無視される）。
【００４５】
フラットファイルは、データ・テーブルの属性（列）ごとに列を有する。図４のデータ・テーブル木構造で構築できる完全な各レコード木で、フラットファイルは、関連の列に、前記木の全レコードの属性値を含む行を有する。フラットファイルの行は、本明細書ではデータ・グラフと呼ぶ。各データ・グラフは、図８の左手部分に示すフラットファイル行ＩＤで識別される。図５〜図７のレコード木は、それぞれ行ＩＤ６、９および１１におけるデータ・グラフのコンパクトな表示である。
【００４６】
フラットファイルの表示を文献と呼ぶことがあるが、大きいサイズのデータベースにとっては実際上ほとんど関係がない。データ記憶に過度の冗長性を必要とするからである。
【００４７】
例えば、本明細書の小さいサイズのケースでは、Ａｎｄｒｅの生年および性別、さらにその自動車保険の詳細が、フラットファイルに３回（行ＩＤ０、３および８）書き込まれるが、記憶が図１〜図３のようなデータ・テーブルの形式である場合は、リンク値とともに１回しか書き込まれない。現実的なサイズのデータベースでは、このような冗長性は許容できない。
【００４８】
本発明によるデータベース・システムは、フラットファイルの概念を使用する。しかし、図８に示すようなフラットファイルの記憶を必要とせず、したがって「仮想フラットファイル」も概念は「仮想データ・グラフ」（ＶＤＧ）を含む。「仮想」という用語は、フラットファイルまたはデータ・グラフをメモリに明示的に保持する必要はないが、方法を実行時にそのデータ構造を参考として使用することを指す。
【００４９】
本発明の特定の実施形態では、フラットファイルは、図９に示すようなリンク・テーブルに還元される。リンク・テーブルの各行は、フラットファイルの個々の行、すなわち、図５〜図７に示すようなレコード木に対応する。
【００５０】
リンク・テーブルの列は、それぞれ、図１〜図３のデータ・テーブルに対応する。すなわち、リンク・テーブルの各列は、対応する（目標）データ・テーブルに割り当てられた属性のサブグループである属性サブグループに関連付けられる。リンク・テーブルの各列は、対応する目標データ・テーブルのレコードを指定するリンク値（行ＩＤ）を含む。
【００５１】
任意のデータ・グラフに対応するリンク・テーブルの行は、前記データ・グラフを表すレコード木に空レコードを有する全てのデータ・テーブルに対応する列に、デフォルト値（−１）を含む。
【００５２】
リンク・テーブルの１つの行にデータ・テーブルの行ＩＤが見られたら、データ・テーブルからリンクされたデータ、すなわち、データ・グラフまたはその一部を検索することができる。リンクは全てリンク・テーブルに表示される。図９のリンク・テーブルの列で記憶された行ＩＤを、図１〜図３の個々のデータ・テーブルで識別された行に記憶された属性値と置換すると、図８のフラットファイルが回復される。
【００５３】
提案するシステムは、さらに、それぞれがデータ・テーブルの１つの各列と、すなわち、属性の１つの関連付けられたワード・シソーラス（図１０Ａ〜図１０Ｇ）を使用する。
【００５４】
好ましい実施形態では、データベース・システムで使用する属性ごとに１つのワード・シソーラスがある。しかし、問合せ基準で、全く使用しない、またはほとんど使用しない属性があると分かっている場合は、このような属性について、シソーラスなしで済ますことが可能である。
【００５５】
データ・テーブルの１つの列に関連付けられた各ワード・シソーラスは、その列に見られる各属性値の項目を有する。このような属性値を、本明細書では「ワード」と呼ぶ。ワードは、関連するデータ・テーブルの列で少なくとも１回発生する限り、シソーラスに１つの項目、そしてわずか１つの項目を有する。
【００５６】
各シソーラスの項目は、属性値に基づいて記憶される。したがって、属性のカテゴリごとに順番関係が定義される。シソーラス・ファイルの属性値フィールドを定義し、次元決定する場合は、これに注意が必要である。
【００５７】
通常、ワードはＡＳＣＩＩフォーマットであり、そのカテゴリは、列ごとに「整数」、「実数」および「文字ストリング」のカテゴリから選択される。文字ストリングは、通常の辞書式順序に従ってソートされる。日付フィールドは、ｙｙｙｙ（ｍｍ）（ｄｄ）（図１０Ｂ、図１０Ｅおよび図１０Ｆ）のような文字ストリングとして宣言することが好ましく、ここで、ｙｙｙｙは年、ｍｍは月（任意選択）、ｄｄは日（任意選択）を表す。このようにソートするシソーラスは、日付を入力順にする。属性カテゴリが「整数」である場合は、整数のデータ値間に自然の順序関係を提供するため、数字を右揃えする。属性カテゴリが「実数」である場合は、その経路全体に従って数字を揃え、列で最長の少数部分を有する値と同じ桁数が右側にある。
【００５８】
空値が、記憶された各シソーラスの一方端（例えば、冒頭）にある。
【００５９】
データ・テーブルＴの列Ｃ（Ｔ）に関連付けられたシソーラスのワードＷの各項目Ｅ（Ｗ）が、Ｃ（Ｔ）に対応する列に属性値Ｗを有するフラットファイルの各行を識別するための情報を含む。フラットファイルをリンク・テーブルの形式で仮想的に記憶する場合は、データ・テーブルＴに対応する列内に、列Ｃ（Ｔ）に値Ｗを有する行を指すリンクがあるリンク・テーブルの各列を識別するために、項目Ｅ（Ｗ）に含まれた情報を使用する。
【００６０】
すなわち、シソーラスの項目Ｅ（Ｗ）の内容が列Ｃ（Ｔ）と関連する状態で、その対応する属性が値Ｗを有する全データ・グラフを検索することができる。
【００６１】
このような内容は、（仮想）フラットファイルの行を指す行ＩＤリスト、すなわち、データ・グラフ識別子リストを表す。このようなリストは、（図１０Ａ〜図１０Ｃのように）特に一部のシソーラスの空値で、空白になることがある。
【００６２】
シソーラスのデータ・グラフ識別子リストの２つの代替表示を、図１〜図３の７つの属性列について、図１０Ａ〜図１０Ｇに示す。最初のものは、明示的整数リストの形式である。
【００６３】
第２の（等価）表示は、長さが、仮想フラットファイルの行数、すなわち、データ・グラフの数に等しい（またはこれより大きい）ビットマップ・ベクトルの形式である。ビットマップ・ベクトルの位置ｉのビット（ｉ≧０）は、その整数ｉが、ビットマップ・ベクトルで表される行ＩＤリストに属するか（１）属さないか（０）を示す。本明細書の簡略化した例では、フラットファイルは１２の行を有し、したがってビットマップ・ベクトルは次元１２でよい。
【００６４】
上述したデータ構造は、仮想フラットファイル、および記憶され、仮想フラットファイルの行を指すシソーラス・ファイルを備え、本明細書ではＶＤＧ構造と呼ぶ。
【００６５】
ＶＤＧ構造は、データベースで問合せを効率的に処理するための強力なツールを提供する。
【００６６】
仮想フラットファイルは、全シソーラスの項目の統一された代数枠組を定義する基準テーブルである。問合せの基準関連するシソーラスを参照して検査し、問合せ基準に一致するデータ・グラフがあれば、それを全て表すフラットファイル行ＩＤリスト（またはビットマップ・ベクトル）を獲得する。次に、所望に応じて、結果の表示の属性値を検索するため、その行ＩＤリストで指されたリンク・テーブル行にアクセスし、列の一部または全部に現れるリンクを読み出すことにより、結果を配布することができる。
【００６７】
シソーラスに関する処理は、主に、これが指す行ＩＤリストで実行する論理演算である。整数リストとして表される場合、このような演算は、基本マージ、交差および／または相補演算に還元することができ、これはそれぞれ、ビットマップ表示のブールＯＲ、ＡＮＤ、ＮＯＴ演算に対応する。
【００６８】
ＶＤＧ構造は、データベースの内容にアクセスするための効率的なツールも提供し、これはデータ・テーブルへのアクセスを必要としない。このツールは、ＳＯＲＴ、ＣＯＵＮＴ、ＤＩＳＴＩＮＣＴ、ＯＲＤＥＲ  ＢＹ、ＧＲＯＵＰ  ＢＹなどの文節のような特殊な結果表示機能を有し、問合せに一致するレコードのデータ値で任意のタイプの計算を実行するための問合せに非常に適している。
【００６９】
例１：
例示として、以下の問合せを考察されたい。すなわち、９００より高い損害賠償が発生する全自動車事故の顧客名および事故日を検索し、顧客名に従って結果をグループ分けする。問合せは、以下のように処理することができる。最初に、９００より高い金額に関係する事故金額シソーラス項目で識別されたフラットファイル行ＩＤリスト（図１０Ｇの最後の５行）をマージすると、リスト｛０，１，３，５，６，７｝（またはビットに関するブールＯＲによって獲得されたビットマップ・ベクトル１１０１０１１１００００）が生成される。次に、そのリストと、「自動車」の値に関する保険タイプ・シソーラス項目で識別された行ＩＤリスト（図１０Ｄの第２行）との交差を決定する。結果リスト｛０，３，５，６｝（またはビットに関するブールＡＮＤで獲得されたビットマップ・ベクトル１００１０１１０００００）は、問合せの基準を満足するデータ・グラフを指定する。最後に、顧客名シソーラス（図１０Ａ）の項目を順次読み出し、結果リストと顧客名シソーラス項目で識別された行ＩＤリストとの間に空白でない交差がある場合、その交差でその行ＩＤを有するリンク・テーブル行を読み出し、所望の属性値を検索する。本明細書のケースでは、出力は、Ａｎｄｒｅ［事故日１９９８年１０月０３日（＃０）および１９９９年０６月１２日（＃３）］、Ａｒｉａｎｅ［事故日１９９９年１２月０９日（＃６）］およびＬａｕｒｅ［事故日１９９９年１２月０８日（＃５）］となる。
【００７０】
上記のタイプの処理は、任意の種類の問合せに適用することができる。応答は、フラットファイルの枠組に明示的に言及するソートされたシソーラスのみを参照することによって準備される。出力フラットファイル行ＩＤリストが獲得されたら、問題となるデータを検索するため、リンク・テーブルまたはシソーラスを使用することができる。
【００７１】
例２：
ＶＤＧ方式の優れた性能をさらに例示するため、当人の３５回目の誕生日となる常用年の開始前に自動車事故に遭遇した顧客を識別するという問合せについて考察してみる。従来の典型的なシステムでは、図３の事故データ・テーブルの全レコードを読み出して、日付の属性および保険リンク値を獲得しなければならない。事故レコードごとに、保険リンク列で見られる行ＩＤで保険データ・テーブルを読み出し、保険タイプの属性および顧客リンク値を獲得して、次に保険タイプが「自動車」である場合は、顧客リンク列にある行ＩＤでさらに顧客データ・テーブルにアクセスし、生年属性値を獲得する必要がある。後者の値を事故テーブルで以前に獲得した日付属性値と比較して、問合せの基準を満たすか決定する。
【００７２】
事前に問合せ基準で参照した属性に基づいてデータ・テーブルをソートしている場合、このような従来の処理は、ディスク・アクセス数を制限することによって加速することができる。それには、レコードを追加、削除または更新するたびにデータ・テーブルのソートが必要であり、これはデータの集まりが大きい場合に実際的ではない。さらに、データ・テーブル・ソート規則で指定された特定のケースでしか可能ではない。
【００７３】
例えば、生年および保険タイプの属性に基づいて顧客および保険テーブルを個々にソートした場合、適切な順序で、コンピュータのキャッシュ・メモリの助けを受けてデータ・レコードにアクセスすることにより、先行する要求を、それほど過酷でない時間で処理することができる。しかし、このコツは、他の同様の問合せには当てはまらない（例えば、超過額を含むために、保険テーブルに追加の列があるとすると、損害賠償額が超過額の１０倍より大きい事故全部の識別で、同じ問題が生じる）。
【００７４】
ＶＤＧ方式では、上記の例示としての問合せを、非常に効率的な方法で扱うことができる。顧客の生年シソーラス（図１０Ｂ）および事故日シソーラス（図１０Ｇ）によって、コンピュータは、日付の基準を満足する｛顧客の生年、事故日｝ワード対、すなわち、顧客の生年＋３５の開始より前の事故日を識別する。これは、事故を起こしたのが顧客か否かを心配することなく実行される。このような識別は、問合せで言及されるような属性は全て、ソートされたシソーラスを有するので、可能ないずれの属性対でも比較的容易である。識別されたワード対ごとに、シソーラス項目の２つのフラットファイル行ＩＤリストの交差が獲得される。その結果生じた整数リストをマージする。次に、コンピュータは、保険タイプ・シソーラスの「自動車」の値に関連する項目の行ＩＤリスト（図１０Ｄの第２行）と、マージから結果するリスト｛０，１，３，５，６，８，１０｝とを交差させる。結果のリスト｛０，３，５，６，８｝は、リンク・テーブルの１組の一致列を指定し、そこから、一致行およびリンク・テーブルの顧客列に表示される行ＩＤを有する顧客テーブル・レコードにアクセスすることにより、関連する顧客名（Ａｎｄｒｅ−３回−、ＬａｕｒｅおよびＡｒｉａｎｅ）が容易に検索される。
【００７５】
問合せを処理する場合は、リンク・テーブルが、問題のデータを検索する手段として簡単に使用されることに留意されたい。この検索機能を遂行する様々な方法を想定することができる。
【００７６】
１つの方法は、元のデータ・テーブル（図１〜図３）をメモリに保持する。しかし、その内容が既にリンク・テーブルに存在するので、リンク列がこのデータ・テーブルから削除されていることがあることに留意されたい。
【００７７】
可能な属性値が全て、対応するシソーラスに記憶されているという観察から、別の方法は、シソーラスへのリンク・テーブル・ポインタに記憶することである。後者の方法は、データ・テーブル列内で値が頻繁に発生しても、属性値を１回しか書かずに済むので、必要なディスク・スペースが減少する。これによって、元のデータ・テーブルを使用する必要なく、任意のフラットファイル行で発生する属性値を迅速に検索することができる。
【００７８】
特定の属性では、明示的属性値をリンク・テーブルに、すなわち、フラットファイルと同様に記憶すると魅力的なことがある。特に、これは、その値が非常に分散し、問合せ応答の出力属性（例えば、金額）の中で往々にして要求される数値フィールド（通常は文字ストリングよりサイズが小さい）で魅力的である。これらの値が、リンク・テーブルに明示的に書き込まれている場合は、必要なディスク・スペースの費用上昇をほどほどにして、出力データの取り出しに必要なディスク・アクセスに、大きい利得があることがある。
【００７９】
以上の説明では、リンク・テーブルは、一種のフラットファイルの骨組みであり、これは、記憶したシソーラスによって問合せに一致するフラットファイル行ＩＤのリストが決定されていたら、データ検索を容易にするために記憶される。
【００８０】
それにもかかわらず、フラットファイル構造を反映するリンク・テーブルまたはテーブルの形式を記憶することが、極めて必要である。有利な実施形態では、データ・グラフ（または、その結果表示のために要求される部分）は、シソーラス・ファイルのみから回復することができる。それを例示するため、再び例２について考える。シソーラス・ファイルに関連して問合せ基準を処理することにより、一致する仮想フラットファイル行の結果リスト｛０，３，５，６，８｝が獲得されたら、顧客名シソーラスを走査し、ワード（顧客名）ごとに、シソーラスで表されたフラットファイル行ＩＤを結果リストと交差させることが可能である。交差が空白でない場合、そのワードは出力に含まれる。これは、交差リストを伴い、それによってユーザは、関連するデータ・グラフからさらなる情報を迅速に獲得することができる。この方法は、シソーラス・ファイルしか記憶する必要がないので、必要なメモリ・スペースが最小になる。
【００８１】
リンク・テーブルが記憶されている場合でも、特定の問合せでは、リンク・テーブルを通してよりも、上記で示したようにシソーラスを走査して属性値を検索すると有利なことがある。これは、特に問合せプロセッサとデータ・テーブル間に比較的遅いインタフェース、例えば、ＯＤＢＣインタフェース（「オープン・データベース接続性」）がある場合に、データ値に関する計算を実行する時に発生する。
【００８２】
ＶＤＧ方式のもう１つの利点は、元の形式でデータ・テーブルと共存できる問合せ処理エンジンを提供することである。次に、元のデータ・テーブルの対応する変化に応答して、シソーラス項目の変更を実行する。これは、従来のテーブルの形式でデータを維持することが重要であることが分かったユーザにとっては魅力的な機能である。何故なら、新しいシステムに過度に依存したくない、または他の用途用の従来のインタフェースを通してテーブルにアクセスする必要があるからである。
【００８３】
マクロワード
上述したＶＤＧは、マクロワード・シソーラスとも呼ばれる接頭シソーラスで終了すると有利である。
【００８４】
上述したワード・シソーラスと同様、各マクロワード・シソーラスは１つの属性、すなわち、１データ・テーブルの１つの列に関連付けられる。また、接頭語長（または打ち切り長）パラメータを有する。
【００８５】
マクロワード・シソーラスの各項目は、ある範囲の属性値に関係し、前記属性に対応する列に、前記範囲に入る属性値を有するフラットファイル行を全て識別するためのデータを含むか、それを指す。マクロワード・シソーラスの項目に対応する範囲は、そのシソーラス割り当てられた接頭語長を有する接頭語値に対応する。すなわち、このような接頭語値で開始するワードは、マクロワードのそれに含まれるそのフラットファイル行ＩＤリストを有する。接頭語長がＰと表記される場合、マクロワードＣ１Ｃ２．．．ＣＰは、Ｐ個の文字または数字Ｃ１Ｃ２．．．ＣＰで始まる属性の全値のセットである。接頭語長が、値フィールドの文字または数字の数である（すなわち、切り捨て長さがゼロである）限定的ケースは、前述したワード・シソーラスである。
【００８６】
すなわち、マクロワード・シソーラス項目は、マクロワードに含まれた個々のワードに対応するワード・シソーラスの項目で識別されたフラットファイル行ＩＤリストのマージ（またはビットマップ・ベクトル間の論理ＯＲ）に対応するフラットファイル行リスト（またはビットマップ・ベクトル）を識別する。
【００８７】
したがって、属性ＡＴに関連付けられる各シソーラス（ワードまたはマクロワード）は、関連するデータ・テーブル・レコードの属性ＡＴに割り当てることができるワードのセットのサブセットへの区分に関連して定義することができる。これは、属性ＡＴに割り当てられた少なくとも１つのワードを含むサブセットごとに個々の項目を有し、この項目は、属性ＡＴに割り当てられたサブセットのワードを有するフラットファイル行のＩＤを含むフラットファイル行ＩＤリストに関連付けられる。マクロワード・シソーラスのケースでは、区分は、各サブセットが、共通接頭語で開始するワードで構成されるような区分である。ワード・シソーラスのケースでは、区分は、各サブセットがワード１つだけで構成されるような区分である。
【００８８】
一例として、図１０Ｈは、３文字の切り捨て長についての事故金額マクロワード・シソーラスを示す。空項目を反復する必要はない。これは既にワード・シソーラスにある。このようなマクロワード・シソーラスは、ディスクのアクセスおよびフラットファイル行ＩＤリストのマージの面で非常に経済的である。例えば、１，０００から１，９９９の間の金額を有する事故に関する情報を獲得するため、フラットファイル行ＩＤ｛０，３，６｝の関連リストを獲得するには、図１０Ｈのマクロワード・シソーラスにアクセスすれば十分であり、図１０Ｇの切り捨てがない事故金額では、２つのシソーラス・アクセスおよび１つのマージ演算が必要になる。利得は、大きいデータベースおよび高い濃度の属性、すなわち、可能な属性値が多い場合に非常に大きくなることがある。
【００８９】
接頭語または切り捨て長に基づくマクロワード・シソーラスは、範囲に基づく問合せ基準の処理に、大きい融通性を提供する。任意の属性で、様々な問合せの処理速度を最適化するために異なる接頭長を有する幾つかのマクロワード・シソーラスを提供することが可能である。
【００９０】
通常、日付の属性は、（日）ワード・シソーラスに加えて、年マクロワード・シソーラス（接頭語長＝４）および月シソーラス（接頭語長＝６）を有することができる。他の任意の種類の属性（数字またはテキスト）も、都合がよいマクロワード・シソーラス階層になることがある。
【００９１】
ＶＤＧ圧縮
これまでに説明したようなＶＤＧ方式では、シソーラス・ファイルで要求されるメモリ・スペースが最適化されていない。
【００９２】
行ＩＤが、通常は３２ビットでコード化される整数である状態で、ワードが図８のフラットファイルの属性列でｎ回発生する場合、そのフラットファイル行ＩＤリストを明示的に符号化するには、ｎ×３２ビットが必要である。フラットファイルがＮｍａｘ行（例えば、数百万行）を有する場合、ｎの値が何であっても、ビットマップ表示の各項目にＮｍａｘのビットが必要である。
【００９３】
概して、日付または金額属性（図１０Ｅ〜図１０Ｇ）などの密度が高い属性では、フラットファイル行ＩＤリストが満杯になることは稀であり、したがってメモリの要件の面で明示的整数リスト表示は満足できるものであり、ビットマップ表示は、大きいフラットファイルには過度に重いことがある。本明細書の例にある顧客の性別または保険タイプ属性（図１０Ｃ〜図１０Ｄ）のように、密度が低い属性もあり、これによってビットマップ表示が非常に適しているが、整数リスト表示は好ましくない。
【００９４】
各シソーラスに、必要なメモリ・スペースを減少させるために最も適切と考えられる表示を適用することが可能である。しかし、それには、属性値を分散させる方法について先験的な知識が必要である。この点で多くの属性が不明瞭であり、任意の属性に関する様々なマクロワード・サイズでは、最適化も困難なことがある。
【００９５】
当業者であれば周知のビットマップ圧縮方法（例えば、米国特許第５，３６３，０９８号または第５，９０７，２９７号）を使用してもよい。問題は、これらの方法が基本的に、処理速度ではなく、記憶量を最適化するために設計されたものであることである。ＶＤＧの状況では、メモリ・スペース減少の利点は、問合せ処理時の複数の圧縮および／または復元作業による応答時間の延長という欠点によって相殺されることがある。これに対して、処理速度は可能な限り上げることが望まれる。
【００９６】
ＶＤＧ方式の好ましい実施では、シソーラスでのフラットファイル行ＩＤリストの圧縮は、フラットファイルの行ＩＤ全部にわたる範囲を所定のパターンに従ってサブセットに分割することによって実行される。次に、シソーラス項目の各フラットファイル行ＩＤリストは、リストの少なくとも１つの行ＩＤを含む範囲の各サブセットをパターン状に位置づけるためのデータ、およびこのように位置づけられたサブセット内の行ＩＤリストの各整数の位置を表すデータで符号化される。
【００９７】
行ＩＤの範囲［０，Ｎｍａｘ［は、そのファイルにある行の数以上になるよう選択される。「所定のパターン」は、「サブセット」を、前記範囲内に同じ長さＤ１を有する連続的インターバル［０，Ｄ１−１［、［Ｄ１，２×Ｄ１−１［などと都合良く定義する。
【００９８】
コード化データは、ユークリッドの除法で非常に簡単に生成することができる。任意の正の数ｘおよびｙについて、ｘに等しいまたはそのすぐ下の整数を
【００９９】
【数１】
2008269643.tif 000003
ｘと等しいまたはそのすぐ上の整数を
【０１００】
【数２】
2008269643.tif 000004
および
【０１０１】
【数３】
2008269643.tif 000005
と表記する。Ｄ１でのユークリッド除法を、入力リストの行ＩＤのＮごとに実行する。商
【０１０２】
【数４】
2008269643.tif 000006
は、パターン内の対応するインターバルのランク（Ｑ１≧０）を示し、剰余Ｒ１＝ＮｍｏｄＤ１は、インターバル内の行ＩＤの位置を表す（０≦Ｒ１＜Ｄ１）。復号も非常に簡単である。すなわち、コード化したリストの項目の符号化データＱ１およびＲ１から、行ＩＤはＮ＝Ｑ１×Ｄ１＋Ｒ１である。
【０１０３】
インターバル長は２の整数累乗であり、したがってユークリッド除法は、簡単なビット・シフト演算で実行される。典型的な長さはＤ１＝２７＝１２８である。
【０１０４】
符号化方法は、ビットマップ表現に言及することにより、同じ意味で表現することができる。各ビットマップ・ベクトルをビットマップ・セグメント（または、より迂遠なパターンが好ましい場合は、他のタイプのビット・グループ）に分割し、少なくとも１つの「１」を含むセグメントごとに、コード化データは、ランク（＝Ｑ１）およびセグメントの内容を含む。ゼロ・セグメントは全て廃棄される。
【０１０５】
図１１Ａ、図１１Ｇおよび図１１Ｈは、図１０Ａおよび図１０Ｇの顧客名および事故金額ワード・シソーラス、および図１０Ｈの事故金額マクロワード・シソーラスを、Ｄ１＝３（簡潔にするため、本明細書で使用するＤ１の非典型的な値）にした他の表現である。第２列は、図１０Ａ、図１０Ｇおよび図１０Ｈそれぞれの最終列からコピーし、ビットマップ・ベクトルの区分を強調表示するブランクがある。第３列は、符号化の結果生成されるランクのリスト（＝ユークリッド商Ｑ１）を示し、第４列は、対応する非ゼロ・ビットマップ・セグメント（各剰余Ｒ１の位置に１を有する）を示す。
【０１０６】
シソーラス項目ごとに、ランクＱ１は、
【０１０７】
【数５】
2008269643.tif 000007
で、範囲［０，Ｎ１ｍａｘ［に含まれる整数リストを形成することが観察される。
【０１０８】
本発明の好ましい実施形態によると、同様のタイプの符号化をこれらのランク・リストに適用することができる。符号化プロセスは、同じ符号化パターンまたは異なる符号化パターンで、数回反復することができる。特に、インターバル長は、反復するごとに変更することができる。これは２の整数累乗であることが好ましい。
【０１０９】
インターバル長Ｄ１で最初の反復にて獲得されるランクおよびビットマップ・セグメントは、層１（またはＬ１）ランクおよび層１セグメントと呼ばれる（図１１Ａ、図１１Ｇおよび図１１Ｈ）。Ｄ２と表記されるインターバル長で第２の反復にて獲得されたものは、層２（またはＬ２）ランクおよび層２セグメントと呼ばれ（図１２Ａ、図１２Ｇおよび図１２Ｈ）、以下同様である。
【０１１０】
以下では、ｎは１≦ｋ≦ｎでｋと番号付けされた符号化層の数を意味し、層ｋは除数パラメータＤｋを有し、積
【０１１１】
【数６】
2008269643.tif 000008
は、層ｋビットマップ・セグメント（Δ１＝１）の１ビットに含まれるフラットファイル行ＩＤの数である。
【０１１２】
図１２Ａ、図１２Ｇおよび図１２Ｈで示した簡略化したケースでは、ｎ＝２であり、第２の符号化層はＤ２＝２を使用する。「Ｌ１ビットマップ」とラベルされた列は、層１ランク・リストのビットマップ表現であり、最後の２列に示された層２データを導くさらなるビットマップ区分を強調表示するブランクがある。
【０１１３】
層１および層２コード化データが図１３Ａ、図１３Ｇおよび図１３Ｈに図示され、これはフラットファイル行リストの情報を記憶するのに可能な方法を示す。層１ランク・リストは、層２データで完全に定義されているので、そのリストの記憶は厳密には必要ないことに留意されたい。しかし、このような記憶は、本発明の特定の実施形態では、問合せ処理を多少簡略化することをさらに理解されたい。
【０１１４】
ワードおよびマクロワード・シソーラスの任意の１つに同じ種類の符号化を使用することができる。しかし、その一部が従来タイプの行ＩＲリスト記憶（明示的整数リストまたはビットマップ・ベクトル）、すなわち、ｎ＝０を保持することも可能である。特に、明示的整数リスト表現は、それでも希薄に分散したシソーラスによく適合している。
【０１１５】
図１４〜図１６は、図１３Ａ、図１３Ｇおよび図１３Ｈのシソーラスに含まれる情報を記憶する可能な別の方法を示す。符号化した層ごとに、シソーラス項目は、ランク・ファイルおよびビットマップ・セグメントを含むデータ・コンテナ（層１については図１５、層２については図１６）にあるレコードの個々のチェーンと関連付けられる。層ｋランク・ファイル（１≦ｋ≦ｎ）の各レコードは、ランク値（０とＮｋｍａｘ−１）を受信するフィールド、およびランク・ファイルの次レコードのアドレスを受信するフィールドを有する。次アドレス・フィールドのデフォルト値（図示の例では０）は、レコードがチェーンの最後のレコードであることを意味する。ビットマップ・セグメント・ファイル（図１５および図１６の右側部分）は、関連するランク・ファイルと同じ方法でアドレス指定される。層ｋのレコードごとに、これはランク・ファイルの対応するレコードに記憶されたランクと関連するビットマップ・セグメントを受信するため、Ｄｋビットのビットマップ・フィールドを有する。ランク値および次レコード・アドレスは、同じファイルの２つのフィールドではなく、共通のアドレス指定を有する２つの別個のファイルに記憶してもよいことを理解されたい。
【０１１６】
ＶＤＧコード化層ｋごとに、シソーラスの項目は、層ｋランク・ファイルのアドレスを含むための頭部アドレスを有し、ここに項目に関する第１のランク・レコードが記憶される。そこから、関連のランク・チェーンを検索することができる。例えば、Ｍａｘの層１ランク０、２および３（図１３Ａ）は、シソーラス項目（図１４Ａ）の頭部アドレス・フィールドで指示されたアドレス２９で、次にチェーン・アドレス２７および１５で図１５のランク・ファイルにアクセスすることによって検索される。並行して、対応する層１ビットマップ・セグメント００１、０１０および１００が読み出される。図１５および図１６は、ランクおよびビットマップ・セグメント・ファイルが、自由レコード（図１５のアドレス３２／３３／１７および図１６の２９／８／１７／２４）で構成された追加チェーンを有することも示す。後者のチェーンの頭部は、必要に応じて新しいコード化データを書き込むために割り当てられる。
【０１１７】
シソーラス項目は、さらに、図１４Ａ、図１４Ｇおよび図１４Ｈの第３列で示すように、項目に属するチェーンの最終レコードのランク・ファイルにあるアドレスを含むため、層１末尾アドレス・フィールドを有することが好ましい。これによって、符号化データ記憶の更新が容易になる。例えば、対応する層１ビットマップ・セグメントでＭａｘの新しい層１ランクを挿入する作業は、以下のように進行する。すなわち、自由レコード・チェーンの頭部を位置決めし（アドレス３２）、次レコード・アドレス・フィールドにあるアドレス（３３）が、新しい自由レコード・チェーン頭部のアドレスになり、アドレス３２にあるレコードが、ランク・フィールドの新しい層１ランク、次アドレス・フィールドのチェーン終了フラグ（０）、およびセグメント・フィールドの新しいビットマップ・セグメントをそれぞれ受信し、Ｍａｘのシソーラス項目（１５）の末尾アドレス・フィールドに含まれるアドレスが（チェーンの潜在的に長い経路を迂回して）直接アクセスされて、新しいデータのアドレス（３２）を書き込み、これはＭａｘのシソーラス項目の末尾アドレス・フィールドにも書き込まれる。層１ランクがＭａｘにとって新しいランクであることは、層２のデータから決定することができる。すなわち、以前に実行した層２の更新が、層２ビットマップ・セグメントの「０」を「１」に変更し、層１ランクは、ワードにとって新しく、それ以外の場合、層１ランクは既にＭａｘの層１ランク・リストに存在するので、前記層１ランクが見られるまで、これを取り消さねばならない。３つ以上の符号化層がある場合は、ｋ＞１で、シソーラス項目に層ｋ末尾アドレス・フィールドを提供し、層ｋ＋１データから決定された通り、新しい層ｋランクにて同じ方法で進行することが可能である。しかし、これを実行する際の主な利得は、チェーンが最も長い層１にある。
【０１１８】
図１５および図１６では、３つの異種シソーラス（顧客名シソーラス、事故金額ワード・シソーラスおよび事故金額マクロワード・シソーラス）から来るコード化データを同じデータ・コンテナに記憶する。図の明快さを期して、他のシソーラスは無視する。実際、１つの層のコード化データは全て、その由来となるワードまたはマクロワード・シソーラスに関係なく、同じランク／ビットマップ・セグメント・ファイルにパイルアップされる。これで、どのシソーラスのどの項目も、この２つの結合されたファイルにある個々のレコード・チェーンを指す。
【０１１９】
処理速度を最適化するため、レコードのグループを、それが関連するシソーラス項目に基づいてグループ分けするように、ディスク記憶についてランクおよびビットマップ・セグメントをソートすることが好ましい。それを実行する利点は、物理的に近接したレコードのグループの同時ＲＡＭローディングを可能にするコンピュータ・キャッシュ・メモリによって、１つのシソーラス項目のコード化データを読み出すのに必要なディスク・アクセス数が少なくなることである。その最適化ソートのバッチ実行は、シソーラス項目（頭部および末尾アドレス・フィールド）を同時に更新する必要があり、タイミングの悪いリソース使用を回避するために使用してもよい。
【０１２０】
この最適化を容易にするため、異なるシソーラスには、共通ファイルではなく別個のデータ・コンテナを使用することが好ましい。これによって、各回に記憶すべきデータの量が減少する。特に、シソーラスおよびコード化層ごとに１つのランク／ビットマップ・セグメント・ファイル対を使用するのが適当なようである。
【０１２１】
さらなる可能な方法は、異なるシソーラス項目に別個のランクおよびビットマップ・セグメント・ファイルを提供する。それには、メモリのファイル宣言数を多くしなければならない。しかし、処理速度の点から、上述した最適ソート作業を必要とせず、これが最適である。レコード・チェーンを指す頭部および末尾アドレスを記憶する必要もない。すなわち、シソーラス項目が、単に、ランクおよびビットマップ・セグメント・データが記憶されているデータ・コンテナを指定するのである。
【０１２２】
図１７は、後者のケースで顧客名シソーラスのデータを構成する方法を示す。シソーラスは、シソーラス・ワードがソートされた状態にあるインデックス・レジスタを有する。ワードおよびコード化層ｋごとに、システム・メモリに２つのファイルが提供され、一方はランク・データを含み（ＮＯｋと呼ばれる）、一方はビットマップ・セグメントを含む（ＨＰｋと呼ばれる）。属性値（Ａｎｄｒｅ、Ａｒｉａｎｅなど）を使用して、対応するファイルに命名することができる。記憶機構は、図１５〜図１６に示すように、共通のデータ・コンテナほどコンパクトではないが、１つのワードに関するデータへのアクセスが、ソートの必要なく非常に迅速になる。
【０１２３】
図１７に示すような構成は、オペレーティング・システムがメモリで管理できるファイル数に関する過度に過酷な制限に困っていない、または多数の個々のファイルの記憶によるオーバヘッドが問題でない場合に好ましい。それ以外では、異なる（マクロ）ワード、または前述したように異なるシソーラスに関しても、ランクおよびビットマップ・ファイルをグループ分けすることが可能である。
【０１２４】
データ圧縮の高度化に加えて、多層行ＩＤリストの符号化方法は、大部分の問合せ処理を非常に加速させる。処理は、最初に、より高次の層で実施され、その結果が下層に渡される。コード化方式は、各層の全シソーラスの項目で共通の構造を維持し、仮想フラットファイルによって与えられた元の構造によって転写される。したがって、様々な層で、異なるシソーラスからの整数リストまたはビットマップ間の一括論理演算が可能である。層ｋ＋１で獲得された結果が、層ｋでの演算回数を最小にするためのフィルタのソートを提供し、これによって処理効率が特に複数アドレス問合せ基準にて強化される。
【０１２５】
この強化は、本明細書の簡略化した例では小さすぎて見えにくい。以下の要求を考察してみる。すなわち、金額が１，３００のＭａｘの事故を検索する（応答がない）。直接の層１処理は、関連する層１のデータを読み出し、復号して、図１０Ａおよび図１０Ｇのシソーラスにあるワード「Ｍａｘ」および「１，３００」のビットマップ・ベクトルを構築し、２つのビットマップ・ベクトルの論理ＡＮＤを計算する。層２で全く同じ種類の処理をすると、層２の方がレコードが少ないので、読み出し作業が少なくなり、ワード「Ｍａｘ」と「１，３００」に関する２つの層１ランク・リスト（図１３Ａおよび図１３Ｇの第２列）間に重複がないので、層１の処理が回避される。１，３００ではなく１０，０００の金額で同じ要求をされると、層２の結果は、ランク０（他のランクがフィルタリングされてない）に対応する２つの層１ビットマップ・セグメントをロードし、そのセグメント間のＡＮＤを計算するという層１の処理を減少させることができる。
【０１２６】
Ｄ１およびＤ２のより代表的な値（例えば、Ｄ１＝Ｄ２＝１２８）および大きいサイズのデータベースでは、この２層間のフィルタリング原理は、優れた利得を提供する。層２（層ｋ＋１）でグループ全体のフィルタリングが達成されているので、層１（または一般に層ｋ≧１）の処理から、大きいビットマップ・ベクトルが消える。
【０１２７】
ＶＤＧの作成および管理
図１８は、本発明によるシステムのハードウェア・プラットフォームを形成するのに適したコンピュータ・システムの例示としてのレイアウトを示す。このハードウェアは従来のタイプでよい。以下のような複数のユニット間でディジタル信号を交換するため、バス１００を有する。
−  中央演算処理装置（ＣＰＵ）１０１；
−  ＣＰＵの基本的演算命令を含む読出し専用メモリ（ＲＯＭ）１０２；
−  ＣＰＵ１０１に作業スペースを提供し、ＣＰＵが扱うプログラム命令および変数を動的に含むランダム・アクセス・メモリ（ＲＡＭ）１０３；
−  １つまたは複数の表示装置（または情報を人間に送出する他の種類の装置）を制御する回路、およびキーボード、マウス、ディジタル・ペン、タッチ・スクリーン、オーディオ・インタフェース等のような取得装置からコンピュータ・システムへ情報を入力する回路を備えるマンマシン・インタフェース１０４；
−  ＲＡＭ１０３にロードするデータおよびコンピュータ・プログラムを記憶する大容量記憶装置。図１８に示す典型的な例では、大容量記憶装置は、１組の磁気ディスク１０６にデータを記憶するハード・ドライブ１０５を備える。本発明の実施には、磁気でも光学的でも、任意の種類の大容量記憶装置を使用することができることを理解されたい。
【０１２８】
本発明を実施するには、前述したようなデータ構造および以下でさらに詳細に説明するプログラムを記憶するためにハード・ドライブ・ユニット１０５を使用する。プログラム命令および有用なデータが、処理するためにＣＰＵ１０１によって動的記憶機構ＲＡＭ１０３にロードされる。問合せ結果は、ハード・ドライブに記憶したり、マンマシン・インタフェース１０４を通して、または遠隔アクセスの場合はネットワーク・インタフェース（図示せず）を通してユーザに配布したりする。
【０１２９】
大容量記憶装置１０５は、大量のデータの記憶に適しているが、アクセス時間はＲＡＭ１０３よりはるかに長い。これは、ハード・ドライブの読み取りヘッドを所望のディスク位置の前に運ぶために必要な時間のせいである。当技術分野で周知のように、ハード・ドライブ１０５でディスク・アクセスを実行する場合、実際に読み出されるデータは、ハード・ディスク上に近接して記憶されたデータのブロックを形成し、これは「キャッシュ」メモリと呼ばれるＲＡＭ１０３の部分にロードされる。ＣＰＵが同時に、または短い期間内に異なるデータ片を必要とする可能性が高いことが分かっている場合は、同じブロックに属するこのようなデータが、１回のディスク・アクセスで検索できるようにデータ記憶編成を構成すると都合がよく、これで処理時間が最短になる。
【０１３０】
図１８のシステムとしては、デスクトップまたはラップトップ・タイプのパーソナル・コンピュータ（ＰＣ）を使用することができる。ワークステーションまたはメインフレーム・コンピュータを使用することもできる。
【０１３１】
もちろん、本発明の実施には、他のハードウェア・プラットフォームを使用してもよい。特に、当業者には、ビットマップ・セグメントおよびベクトルで実行される多くの計算は、専用論理回路またはコプロセッサによって効率的に実施されることを理解することができるだろう。さらに、このシステムでは並行計算が非常に自然である。
【０１３２】
次に、図１９を参照しながら、最も一般的なデータ表現である図１〜図３に示した形式である入力データ・テーブルからＶＤＧデータ構造を作成するプロセスについて説明する。この作成プロセスは、レガシー・データベースからＶＤＧ構造を作成するのに適している。さらに説明されるＶＤＧ更新規則から、ＶＤＧを全く新しいデータから直接作成することができることを理解されたい。
【０１３３】
特定のデータベースでは、データ・テーブルは、図１〜図３のような行ＩＤではなく、複合キーを特徴とする自身の行を有する。複合キーは、データ・テーブルの幾つかのキー・フィールドの内容を連結したものである。ソース・データ・テーブルでは、レコードは、目標テーブルのレコードの複合キーを指定する外部キーを含む。このようなレガシー・データベースを扱う場合、ＶＤＧ作成手順の第１段階は、複合キーを図１〜図３に示す行ＩＤのような単一キーに翻訳することである。この（任意選択の）第１段階を、図１９のボックス１２０で示す。
【０１３４】
第２段階１２１は、適宜、空レコードでデータ・テーブルを完成することである。これは、図４〜図７に関して上述したように、データ・テーブル木の各経路を経路の葉テーブルから根テーブルへと走査することによって実行される。空レコードへのリンクは、デフォルト値−１で表される。その結果、ソース／目標テーブル対ごとに、目標テーブルの全行ＩＤが、ソース・テーブル・リンク列に少なくとも１回現れる。
【０１３５】
次の段階１２２は、ワード・シソーラスの作成を含む。関連する属性、すなわち、問合せ基準に使用する可能性が高い属性（全部でもよい）を決定する。決定した属性ごとに、ワード・フォーマット（タイプおよび長さ）を選択する。ワード・シソーラスごとに、関連する列で発生する属性値を、空値も含めて、ハード・ドライブ１０５に記憶されたデータ・テーブルから読み取る。反復する値は削除され、属性値および属性のタイプに適用することができる順序関係に基づき、残りの値をソートする。このソート作業を、ハード・ドライブ１０５からＣＰＵのキャッシュ・メモリに転送された連続データ・レコード・ブロックで実行し、各ブロックの処理後に、外部ソートする。
【０１３６】
次にＶＤＧ作成手順は、段階１２３の関連マクロワード・フォーマットの決定へと進む。マクロワード・シソーラスが生成されないワード・シソーラスもある（例えば、図１０Ｃの顧客の性別シソーラスはマクロワードを必要としない）。これに対して、例えば、日付または金額属性に対応するシソーラスなど、異なる切り捨て長を有する幾つかのマクロワード・シソーラスを生成するシソーラスもある。属性列に見られる値が、アルファベットの大部分の文字で始まる文字ストリングを含む場合は、接頭語長が１文字のマクロワード・シソーラスを作成すると都合がよい。適切なマクロワード階層に関する決定は、データベース管理者によって実行され、マンマシン・インタフェース１０４を通して入力される。これは、シソーラスのワードの属性タイプおよび／または分布に基づく自動プロセスでもよい。段階１２３では、対応するワード・シソーラスのワードに切り捨てを適用し、反復するマクロワードを削除することにより、ソートされた形式で直接、マクロワード・シソーラスも作成される。
【０１３７】
マクロワード・シソーラスの各項目は、マクロワードの対象となる範囲に含まれる下位レベル・シソーラスの第１ワード（または下位レベルマクロワード）を示すことが好ましい。このように、考慮中のマクロワードと一致する接頭語を有する最下位ワード（またはマクロワード）を表示すると、そのマクロワードの「子」へのアクセスに必要な時間が短縮される。下位レベル・シソーラスを走査することなく、最初のものにアクセスできるからである。代替的または累加的に、接頭語がマクロワードと一致する最高位ワード（または下位レベルマクロワード）を、マクロワード・シソーラスで表示することができる。
【０１３８】
段階１２４では、リンク・テーブルの行および個々のワード・シソーラスの項目を作成する。これは、ｎ＝２層で符号化する場合、例えば、図２０に示すアルゴリズムに従い、全フラットファイル（図８）を記憶せずに実行することが好ましい。
【０１３９】
図２０〜図３２に示す実施形態では、属性値に関するシソーラスの各項目は、索引ＷＩを含み、これは図１４Ａ、図１４Ｇまたは図１４Ｈに示すタイプの補助テーブルの行ＩＤを形成し、図１５および図１６に示すタイプのコード化データ・コンテナを指す。符号化層ｋごとに、この補助テーブルは以下を有する。
−  層ｋに関連するコード化データ・コンテナに、索引ＷＩのシソーラス・ワードに関する第１のレコードのＡＴ＿Ｆｋ（ＷＩ）と表示されたアドレスを含む列；
−  前述したように、データ・コンテナに索引ＷＩのシソーラス・ワードのチェーンの最終レコードのＡＴ＿Ｌｋ（ＷＩ）と表示されたアドレスを含む列で、後者の列は、層１にしかないことがある。
【０１４０】
前述したように、任意のコード化層のデータ・コンテナを、シソーラスの全部または一部で共用するか、各個別シソーラスに関連付けることができる。層ｋコンテナのアドレスＡＤ（≧１）にあるレコード（ここでは全シソーラスに共通とする）は、ランク・データを０からＤｋ−１の範囲の整数として含む第１のフィールドＮＯｋ（ＡＤ）、チェーンの次レコードのアドレスＮＸｋ（ＡＤ）を含む第２のフィールド（このアドレスは、さらなるアドレスがない場合は０である）、および対応するビットマップ・セグメントＨＰｋ（ＡＤ）を含む第３のフィールドを備える。層ｋのコンテナは、第１のレコード・アドレスがＨｋと表記される自由レコード・チェーンを有する。
【０１４１】
補助テーブルも、別個のワード索引を含む幾つかのシソーラスで共用し、このような共通の補助テーブルにアクセスできることも理解される。
【０１４２】
段階１２４の前に、データ・コンテナの全レコードは、相互に連鎖されて自由であり、ビットマップ・セグメントＨＰｋ（ＡＤ）は、全てのゼロ・セグメントで初期化される。全ての補助テーブルの列ＡＴ＿ＦｋおよびＡＴ＿Ｌｋも、値０で初期化される。
【０１４３】
フラットファイル行ＩＤのＤ１でのユークリッド除法による商および剰余は、それぞれＱ１およびＲ１と表示される。さらなる層ｋ＞ｌごとに、ＱｋおよびＲｋはそれぞれ、ＤｋによるＱ（ｋ−１）のユークリッド除法による商および剰余を指す。図２０の初期化ステップ１３０で、整数Ｑ１、Ｒ１、Ｑ２およびＲ２は０に設定される。
【０１４４】
ハード・ドライブ１０５から１つずつ、またはブロックごとに読み出される根テーブルの行は、ステップ１３１で１つずつ選択される。選択した根テーブル行に連結された他のデータ・テーブルのレコードをステップ１３２で読み出す。これは、図５〜図７にてコンパクトな形式で示したタイプのデータ・グラフを提供する。
【０１４５】
これらのデータ・グラフのリンク、すなわち、データ・テーブルの行ＩＤを、行ＩＤのＱ１×Ｄ１＋Ｒ１でリンク・テーブル（図９）の関連列に書き込む（ステップ１３３）。リンク・テーブルがない場合は、ステップ１３３を省略する。
【０１４６】
現データ・グラフについて、異なる属性ＡＴを連続的に選択する（ステップ１３４）。選択した属性ＡＴの値は、対応するシソーラスの二分検索によって位置決めされ、そのワード索引ＷＩはステップ１３５で読み出される。ステップ１３６は、図２１〜図２４に関して以下でさらに詳細に説明されるが、ワード索引ＷＩのＡＴシソーラス項目について、補助テーブルおよびデータ・コンテナを更新する。この更新は、現フラットファイル行ＩＤのＱ１×Ｄ１＋Ｒ１をシソーラス・ワード索引ＷＩに関連する整数リストに挿入することに相当する。
【０１４７】
全ての属性をこのように処理したら（テスト１３７）層１の剰余索引Ｒ１を、ステップ１３８で１ユニットだけ増加させる。増加したＲ１がＤ１に等しい場合（テスト１３９）は、索引Ｒ１を０にリセットし、層１の商索引Ｑ１および層２の剰余索引Ｒ２をそれぞれ、ステップ１４０で１ユニットだけ増加させる。増加したＲ２がＤ２に等しい場合（テスト１４１）は、索引Ｒ２を０にリセットし、層２の商Ｑ２をステップ１４２で１ユニットだけ増加させる。ステップ１４２の後、またはステップ１３９でＲ１＜Ｄ１になるか、ステップ１４１でＲ２＜Ｄ２である場合は、テスト１４３を実行して、全ての行または全ての根テーブルを考察したか判断する。考察していない場合、手順はステップ１３１に戻って、新しい根テーブル行を選択する。
【０１４８】
全ての根テーブル行を考察したら、図１９の段階１２４が終了し、パラメータＱ１、Ｒ１、Ｑ２およびＲ２を、起こり得る新しいデータ・レコードをその後に挿入するため、記憶する。最終的に、仮想フラットファイルの行数は、Ｑ１×Ｄ１＋Ｒ１で与えられる。
【０１４９】
図２０の手順は、ステップ１３０で全てのＱｋおよびＲｋパラメータを０に初期化し、より高い層でステップ１３８からステップ１４２を発展させる（これはデータ・グラフ・ポインタＱ１×Ｄ１＋Ｒ１を増分させることに等しい）ことにより、ｎ＞２符号化層に容易に拡張される。
【０１５０】
図２１は、プログラムが属性ＡＴに関するシソーラスのワード索引ＷＩについて、データ・コンテナ内のレコード・チェーン、および層ｋ≧１のシソーラス補助テーブルを管理する方法を示す。第１のステップ１５０は、補助テーブルに記憶されている値ＡＴ＿Ｆｋ（ＷＩ）をアドレス変数ＡＤにロードする。ＡＤ＝０（テスト１５１）である場合は、シソーラス索引ＷＩについてレコード・チェーンを初期化しなければならず、したがってデータ・コンテナにある自由レコード・チェーンの頭部アドレスＨｋが、ステップ１５２でＡＴ＿Ｆｋ（ＷＩ）に指定される。
【０１５１】
シソーラス索引ＷＩに既にレコード・チェーンがある場合（テスト１５１でＡＤ＞０）は、ステップ１５３でランクＮＯｋ（ＡＤ）をランク変数にロードする。その後のテスト１５４で、ｑが商変数Ｑｋと異なることが示されたら、ステップ１５５でアドレス変数ＡＤ’がチェーンの次レコードのアドレス、すなわち、ＮＸｋ（ＡＤ）を受け取る。ＡＤ’がまだ０でない場合（テスト１５６）、プロセスは、ステップ１５７でＡＤをＡＤ’で置換した後、レコード・チェーンの次ランク変数を検査するため、ステップ１５３に戻る。テスト１５６でＡＤ＝０の場合、ステップ１５８で自由レコード・チェーンの頭部アドレスＨｋが、次レコード・フィールドＮＸｋ（ＡＤ）に書き込まれるように、データ・コンテナのレコードをシソーラス索引ＷＩのチェーンに追加しなければならない。
【０１５２】
ステップ１５２またはステップ１５８の後、自由レコード・チェーンの頭部アドレスＨｋをステップ１５９でアドレス変数ＡＤにロードする。次にステップ１６０を実行して、補助テーブルおよびデータ・コンテナを更新する。この更新作業１６０は、以下で構成される。
−  頭部アドレスＨｋを自由チェーンの次アドレスＮＸｋ（ＡＤ）で置換し、
−  アドレス変数ＡＤの現値をＡＴ＿Ｌｋ（ＷＩ）に書き込み、
−  Ｑｋおよび０をそれぞれ、データ・コンテナのフィールドＮＯｋ（ＡＤ）およびＮＸｋ（ＡＤ）に書き込む。
【０１５３】
ステップ１６０の後、または上述したテスト１５４でｑ＝Ｑｋの場合は、ステップ１６１で、ビットマップ・セグメントＨＰｋ（ＡＤ）を、そのセグメントのビット位置Ｒｋに数字「１」を書き込むことにより更新する。
【０１５４】
図２０では、層１および層２のコード化データが両方ともステップ１３６で更新されていると考えられた。すなわち、図２０の手順は、ｋ＝１で１回、ｋ＝２で１回実行される。ｋ＝１でしか実行せず、その後に段階１２４で生成された層１のランク・データを処理することにより層２のコード化データを作成するという可能性もある。
【０１５５】
図２０のように、レガシー・データベースからＶＤＧを初期化する場合、ランク・データＱｋは小さい順に表示されることに留意されたい（図２１のテスト１５４では、常にｑ≦Ｑｋである）。したがって、ステップ１５０で、ＡＤ＝ＡＴ＿Ｆｋ（ＷＩ）ではなく、レコード・チェーンの末尾、すなわち、ＡＤ＝ＡＴ＿Ｌｋ（ＷＩ）に直接移動させることが可能である。この場合、テスト１５４でＱｋ＞ｑの場合は、ステップ１５８を直接実行し、レコード・チェーンの走査を回避する。このような実施形態を図２２に示す。
【０１５６】
後者の実施形態では、ＶＤＧの初期化が終了したら、ｋ＞１の状態で、層ｋの末尾アドレス・フィールドＡＴ＿Ｌｋを廃棄してもよい。しかし、挿入される可能性が高い新しいＶＤＧが、既存のＶＤＧのフラットファイル行ＩＤ全部と等しい、またはこれより大きいフラットファイル行ＩＤを有するよう（すなわち、削除したＶＤＧのフラットファイル行はもう使用しないよう）、ＶＤＧを管理している場合、その後の更新を全て、図２２の実施形態に従って実行するため、全ての末尾アドレス・フィールドＡＴ＿Ｌｋを保持することが有利である。
【０１５７】
図２１に示す形式では、更新手順が別個にランク値Ｑｋの仮説に適用することができる。
【０１５８】
図２３および図２４は、ステップ１３６でワード索引ＷＩについてＡＴシソーラス項目に関する補助テーブルおよびデータ・コンテナを更新する代替方法を示し、これは層１（ｎ＝２のコード化層を有する）の補助テーブルの末尾アドレス・フィールドＡＴ＿Ｌ１を利用する。図２３は、図２４の層１の処理より前に実行される層２の処理を示す。図２３〜図２４のステップは大部分が、図２１のステップと非常に似ており、したがって対応する参照番号を使用している。
【０１５９】
図２３の層２の処理は、基本的に図２１（ｋ＝２）と同じであるが、以下の違いがある。
−  ステップ１６０で、末尾アドレス・フィールドＡＴ＿Ｌ２（ＷＩ）を処理する必要がない。
−  ステップ１６１が、さらに、２進変数ＬＬ１を「１」に設定することを含み、これは、現層１のランク・データＱ１が、ワード索引ＷＩに関する層１のレコード・チェーンに属していないことを意味する。
−  テスト１５４でｑ＝Ｑ２の場合は、別のテスト１６４を実行して、層２セグメントＨＰ２（ＡＤ）のビット位置Ｒ２が値「１」を含むか判断し、テスト１６４がノーの場合のみ、その後にステップ１６１を実行する。
−  テスト１６４がイエスの場合は、現層１のランク・データＱ１が既に、ワード索引ＷＩに関する層１のレコード・チェーンに属し、したがってステップ１６５で変数ＬＬ１を「０」に設定する。
【０１６０】
図２４の層１の処理は、ステップ１７０で、ＬＬ１が０か１かをテストして開始する。ＬＬ１＝０の場合は、ステップ１５０を実行して、層１の補助テーブルに記憶されている値ＡＴ＿Ｆ１（ＷＩ）をアドレス変数ＡＤにロードし、ループ１５３〜１５５を実行して、ランクＱ１に関するデータが記憶されているデータ・コンテナアドレスＡＤを求める。ステップ１５３およびステップ１５４は、図２１と同じであり、ステップ１５５で、次アドレスＮＸ１（ＡＤ）をアドレス変数ＡＤに直接ロードする（ＬＬ１＝０であるので、ＡＤが０になることはない）。テスト１５４でｑ＝Ｑ１の場合、プログラムはステップ１６１へと進む。
【０１６１】
テスト１７０でＬＬ１＝１の場合は、ステップ１７１を実行し、層１の補助テーブルに記憶されている値ＡＴ＿Ｌ１（ＷＩ）をアドレス変数ＡＤにロードする。ＡＤ＝０の場合（テスト１７２）は、図２１と同様に一連のステップ１５２、１５９から１６１を実行する（しかし、ステップ１６０で次アドレス・フィールドＮＸ１（ＡＤ）を扱う必要はない）。テスト１７２でＡＤ＝１の場合は、図２１と同様に一連のステップ１５８〜１６１を実行する。
【０１６２】
図２３〜図２４の手順は、ランク・データＱ１が層１のレコード・チェーンにない場合、ランク値の仮説なしで、このようなチェーンを走査しない。
【０１６３】
個別ワード・シソーラスのコード化データを全て作成した後、図１９に示す手順の次の段階１２５は、記憶したコード化データを再構成する。前述したように、これを実行して、各層のコード化データ・コンテナのレコード・チェーンを編成し、したがって同じシソーラス・ワードに属するレコードは、ＣＰＵのキャッシュ・メモリによって１回または数少ないディスク・アクセスでアクセス可能になるよう、連続アドレスを有する。これを実行するための簡単な方法は、新しい補助テーブルおよび新しいコード化データ・コンテナのためにメモリ・スペースをとっておくことである。シソーラス・ワードを１つずつ考察し、それぞれで古い補助テーブルで指示されたコード化データを順次読み出し、書き込み作業ごとに増分されたアドレスＡＤで、新しいデータ・コンテナにコピーする。次のシソーラス・ワード索引ＷＩ＋１へと進んだら、新しいポインタＡＴ＿Ｌｋ（ＷＩ）＝ＡＤ−１およびＡＴ＿Ｆｋ（ＷＩ＋１）＝ＡＤを決定し、新しい補助テーブルに記憶する。全てのコード化データ・レコードをこのように読み出して、新しいデータ・コンテナに再度書き込んだら、古いデータ・コンテナおよび補助テーブルを廃棄する。
【０１６４】
このような再構成は、コード化層ｋごとに別個に実行することができる。
【０１６５】
コード化層のシソーラスによって幾つかのデータ・コンテナがある場合は、これを別個に発注してもよい。
【０１６６】
前述したように、シソーラスが、図１７で示した方法で編成されている場合は、再構成ステップ１２５が省略される。コード化データ・ファイルが、当然、シソーラス・ワードに関するグループ化状態を満足しているからである。
【０１６７】
図１９に示した手順のその後の段階１２６では、マクロワード・シソーラス項目を作成する。マクロワードおよび層ごとに、これはマクロワードがカバーするワード（または下位レベルマクロワード）のランク・コード化データＱ１、Ｑ２をマージし、ワード（または下位レベルマクロワード）に関するものの論理ＯＲによって対応するビットマップ・セグメントを獲得することにより、簡単に実行される。段階１２５で示すように、ワード・シソーラスに関してコード化データが再構成されている場合は、マクロワード・シソーラスでコード化データの同じグループ化が自動的に達成される。
【０１６８】
段階１２７では、元のデータ・テーブル（図１〜図３）でもう無用になったリンク列を削除することができる。段階１２１で追加された空レコードも削除することができ、その発生は、リンク・テーブル（図９）のデフォルト値−１で表示される。
【０１６９】
最後に、上述した実施形態でハード・ドライブ１０５に記憶される要素は以下の通りである。
−  リンク列がない、図１〜図３で図示したようなデータ・テーブル。図４のデータ・テーブル木構造を定義するパラメータは、テーブルとともに記憶される。
−  図９で図示したようなリンク・テーブル。
−  所望の各属性について、指標レジスタおよび補助テーブルを備え、記憶されているシソーラス。図２５〜図２６は、本明細書の簡略化した例の属性ＡＴ＝ＣＮ（「顧客名」）およびＡＴ＝ＡＡ（「事故金額」）の指標レジスタを示す。図２８〜図２９は、対応する補助テーブルを示す。
−  特定の切り捨てまたは接頭語長を有し、個別ワード・シソーラスのように編成されたマクロワード・シソーラス。各マクロワード・シソーラスの指標レジスタは、さらに、マクロワードごとに、同じ属性の下位レベルのシソーラスの指標レジスタにマクロワードの対象となる第１ワード（またはマクロワード）の行ＩＤを含む追加列を有する。図２７および図３０は、属性ＡＴ＝ＣＮおよび切り捨て長３の指標レジスタおよび補助テーブルを示す。
−  それぞれが自身の自由レコード・チェーンの変数頭部アドレスを有する各コード化層のコード化データ・コンテナ。図３１および図３２は、図２４〜図２９のシソーラスが共用する層１および層２のデータ・コンテナ（それぞれ自由レコード・チェーン頭部アドレス３１および２７）を示す。
−  任意選択で、高密度の属性に適した「低密度」フォーマットで記憶された１つまたは複数のシソーラス。低密度フォーマットでは、ｎ＝０およびフラットファイル行ＩＤを、明示的（短）整数リストとして、例えば、レコード・チェーンによって記憶する。層１からｎのコード化データが必要な場合、これは、リストに記憶された各整数から連続的にユークリッド除法をｎ回実行することにより、容易に計算される。所与の高密度属性では、個々のワード・シソーラスを低密度フォーマットで、１つまたは複数のマクロワード・シソーラスを「通常の」符号化したフォーマットで提供することが適当である。
【０１７０】
図３１および図３２のデータ・コンテナは、再構成段階１２５に従って図１５および図１６に示すコンテナから取得し、ここで図２８〜図３０の補助テーブルも、それぞれ図１４Ａ、図１４Ｇおよび図１４Ｈから獲得される。Ａｎｄｒｅと呼ばれる顧客に関する問合せを処理するには、プロセッサは、コード化データ・コンテナが再構成されていなければ、図１５のレコード＃２０、＃１１および＃２を読み出さなければならず（自身を層１に制限する）、一方で図３１の再構成されたコンテナの物理的に連続するレコード＃１、＃２および＃３を読み出す。後者の読み出しは、通常、１つのブロックをキャッシュ・メモリにロードすることによって実行することができる。分散したレコードを読み出すには、ディスクへのアクセスを増加させる必要があり、したがって処理時間が長くなる。
【０１７１】
図９および図２８〜図３２の破線で分離された列は、別個に記憶することが好ましい。例えば、このような列にある１つの値の記憶アドレスは、列に割り当てられた開始アドレスに、その行ＩＤに等しいオフセットを加え、フィールド長を掛けた値と定義することができる。
【０１７２】
したがって、リンク・テーブル行のリンク（データ・グラフ）フラットファイル行ＩＤによって与えられた対応のアドレスに記憶される。このリンク列の別個記憶は、問合せで要求された出力データを生成するためにデータ・テーブルの一部にアクセスする必要がない場合、データ検索を加速する。
【０１７３】
同様に、問合せ処理で実行される基本的作業には、１層のコード化データしか必要としないものがあり、したがって処理を加速するために補助テーブルの各層に関する情報を分離すると都合がよい。ランク・データとビットマップ・セグメント・データを別個に示唆する作業もあり、したがって図３１および図３２で示すようにデータ・コンテナ内でこれらのデータを分離すると有利である。
【０１７４】
シソーラスを記憶する代替方法では、ワード指標レジスタおよび補助テーブルを、ハフマン・タイプの索引付けで１つのテーブルにマージする。すなわち、そのテーブルの各行が属性ＡＴの値、ＡＴ＿ＦｋおよびＡＴ＿Ｌｋデータ、次行ポインタ（次行は記憶されたシソーラスにある属性の次の値を含む）、および任意選択で先行行ポインタを含む。
【０１７５】
実施形態では、上述したように作成されたＶＤＧの保守は、以下の作業を含む。
【０１７６】
１／  レコードの挿入
新しい仮想データ・グラフ、すなわち、フラットファイルの新しい行は、概ねデータ・テーブルへの新レコードの挿入に応答して作成される。
【０１７７】
しかし、新レコードが、別の目標テーブルの既存レコードとのリンク有し、したがって、前記既存レコードを指す他のリンクがない場合は、新しいデータ・グラフは必要ないが、既存データ・グラフを更新する必要がある。例えば、顧客Ｏｓｃａｒが、例えば、自動車について、新しい保険に加入したら、新しいＶＤＧを作成せずに、保険データ・テーブルに新しいレコードを追加する。すなわち、図７のデータ・グラフを単に修正して、新しいデータを保険テーブルに対応するノードに入れる。次に、Ｏｓｃａｒが、例えば、住宅について第２の保険に加入したら、新しいＶＤＧが必要になる。
【０１７８】
新しいＶＤＧを作成するには、空レコードを含め、挿入された新しいレコードに関して他のデータ・テーブルからの全レコードを、必要に応じて個々の行ＩＤによって識別し、これはこの関連レコードの属性値に基づき、問合せで検索することができる。
【０１７９】
新レコードをデータ・テーブルに追加した後、最初にすることは、新しい属性値が発生した場合、必要になりそうな全ての新シソーラス項目を初期化することである（全てのＡＴ＿ＦｋおよびＡＴ＿Ｌｋフィールドは０に初期化される）。新しい仮想フラットファイル行およびその対応するシソーラス項目は、図２０のステップ１３３から１４２のように作成することができる。より高いレベルのマクロワード・シソーラスを、これに応じて更新する。
【０１８０】
２／  レコード属性の修正
既に存在するデータ・テーブルの属性値と変更または追加しても、リンク・テーブルに影響を与えず、これはテーブル内容を反映しないが、リンク構造は反映する。追加は、先行属性値が空だった場合の変更の特殊ケースである。同様に、レコードからの属性値の削除は、新しい属性値が空であった場合の変更の特殊ケースである。
【０１８１】
新しい属性値が新しいシソーラス項目を必要とする場合、このような項目を初期化する（ＡＴ＿Ｆｋ＝ＡＴ＿Ｌｋ＝０）。修正すべきデータ・レコードを備えるフラットファイル・レコードに対応するリンク・テーブル行ＩＤのリストＬは、適切な問合せをすることによって獲得される。後者のリストＬを、新しい属性値のフラットファイル行ＩＤのリストＬ’とマージし（ビットマップＯＲ演算）、マージしたリストＬ∨Ｌ’のコード化データを新しい属性値に割り当てる。リストＬの補数
【０１８２】
【数７】
2008269643.tif 000009
も、先行属性値の単層行ＩＤリストＬ”と交差する（ＡＮＤｅｄ）ように決定される（ビットマップＮＯＴ演算）。その結果の交差リスト
【０１８３】
【数８】
2008269643.tif 000010
が空白でない場合は、そのコード化データを先行属性値に割り当てる。これは、以前に先行属性値に関連するレコード・チェーンに属していた１つまたは複数のデータ・コンテナの自由レコード・チェーンへの転送でよい。交差リスト
【０１８４】
【数９】
2008269643.tif 000011
が空白である場合、先行属性値をそのワード・シソーラスから削除することができる。より高いレベルのマクロワード・シソーラスがあれば、同じ交差および更新シーケンスを実行する。
【０１８５】
３／  レコード・リンクの修正
ソース・データ・テーブルのリンクを変更すると、リンク・テーブルにあるリンクの出現に対応する変化が生じる。関係するリンク・テーブル行のリストＬは、適切な問合せを処理することにより決定することができる。
【０１８６】
前のリンクによって指示された目標テーブル・レコードが、これを指示するリンクをこれ以上有さない（その行ＩＤが、修正後にリンク・テーブルの対応する列にもう発生しない）場合は、新しいＶＤＧが作成される。修正したリンクの下流では、この新しいＶＤＧは、修正中のものと同じ内容を有する。修正したリンクの上流では、これは空レコードで構成される。新しい仮想フラットファイル行およびその対応するシソーラス項目は、図２０のステップ１３３から１４２のように作成することができる。より高いレベルのマクロワード・シソーラスがあれば、これに応じて更新される。
【０１８７】
その後、前のセクションで説明したものと同様の手順を、目標テーブルの各属性について実行することができる。すなわち、／ａ／リストＬを、新しい属性値（新しいリンクによって指示された目標テーブル・レコードで発生した値）のフラットファイル行ＩＤリストＬ’とマージし、／ｂ／マージされたリストＬ∨Ｌ’のコード化データを新しい属性値に指定し、／ｃ／リストＬの補数
【０１８８】
【数１０】
2008269643.tif 000012
を先行属性値（以前のリンクによって指示された目標テーブル・レコードで発生した値）のフラットファイル行ＩＤリストＬ”と交差させ、／ｄ／結果の交差リスト
【０１８９】
【数１１】
2008269643.tif 000013
のコード化データを先行属性値に指定し、／ｅ／より高いレベルのマクロワード・シソーラスがあれば、その全てで同じ交差および更新シーケンスを実行する。
【０１９０】
（修正したリンクの）第１の目標テーブルが、第２の目標テーブルへのリンク列を有する場合、第２の目標テーブルに関連したリンク・テーブルの列、およびリストＬの各行に記憶されたリンク値も変更し、第２の目標テーブルの属性ごとに、上述した手順／ａ／から／ｅ／を実行する。これを、データ・テーブル木の第１の目標テーブルの下流に位置する全てのデータ・テーブルで反復する（図４）。
【０１９１】
例えば、図３の事故テーブルで補正を実行し、事故＃６が保険＃０ではなく保険＃２で扱われる、すなわち、Ａｒｉａｎｅの自動車保険ではなくＭａｘの住宅保険に関することを示す場合、図５のデータ・グラフにある事故テーブルからのリンクを、保険レコード＃２を指示するよう変更し、保険テーブルからのリンクを顧客レコード＃４を指示するよう変更しなければならない。新しい行を仮想フラットファイルに挿入し事故が発生していないＡｒｉａｎｅの自動車保険に関する有用な情報を含める。その結果、図９のリンク・テーブルの行＃６は、顧客、保険および事故リンク列にそれぞれ４、２および６の値を含むよう変更され、それぞれ２、４および−１の値を含む新しい行＃１２が追加され、それに応じてシソーラスが変更される。
【０１９２】
４／  レコードの取り消し
根テーブルからのレコードの取り消しは、そのレコードを含むフラットファイルの行を削除する。対応するフラットファイル行ＩＤが、シソーラスで符号化されたリストから除去される。すなわち、ビットマップ・ベクトルの関連付けられた位置にゼロが書き込まれる。このフラットファイル行ＩＤを、例えば、上記のセクション１／または３／に従って、さらなるＶＤＧ挿入をできるようにする。仮想フラットファイルのサイズが主要な関心事でない場合、これは空白行のままにしてもよい。同様に、対応するソース・テーブルでこれを指示するリンクがない目標テーブルからレコードを取り消すには、そのレコードを含むフラットファイルの行を削除する（これらの行は、取り消されるレコードの上流にて、空レコードでデータ・グラフを表していた）。
【０１９３】
取り消すレコードが、強制的リンク（例えば、本明細書の例の顧客または保険テーブル）の目標テーブルに属している場合、そのレコードを含むフラットファイル行も削除される。取り消すレコードが、任意選択リンク（例えば、図４の例の第三者または仲介者テーブル）の目標テーブルに属している場合、取り消しはリンクの修正を含み、これによってそのレコードを指示するリンクが全て、空レコード（リンク値＝−１）へのリンクで置換される。このような修正は、上記のセクション３／で説明したように実行することができる（しかし新しいＶＤＧは生成しない）。
【０１９４】
リンク・テーブルの対応する列にそれ以上行ＩＤが発生しない非空目標テーブル・レコードを指すリンクが、取り消したレコードにある場合、その全てで、前記非空目標テーブル内およびその下流に、取り消したレコードと同じデータを、取り消したレコード内およびその上流に空値を含む新しいＶＤＧを作成する必要がある。新しい仮想フラットファイル行およびその対応するシソーラス項目を、図２０のステップ１３３から１４２のように作成することができる。より高いレベルのマクロワード・シソーラスがあれば、これに応じて更新される。
【０１９５】
５／  シソーラスの更新およびソート
シソーラス項目の上述の構造では、そのフラットファイル行ＩＤリストが空白になった場合に発生するシソーラスのワードの取り消しは、シソーラス項目のＨＰｋデータをゼロに維持することによって実行できる。しかし、メモリの使用に関しては最適でない。
【０１９６】
より効率的な方法は、取り消したワードの項目ＷＩについて補助テーブルがＡＴ＿Ｆｋ（ＷＩ）＝ＡＴ＿Ｌｋ（ＷＩ）＝０を有するように、データ・コンテナのレコード・チェーンを更新することである。このようなケースでは、ワード索引ＷＩを解放することができ、デフォルト値（例えば、−１）が、シソーラス指標レジスタの取り消したワードについて、ワード指標コラムに書き込まれる。
【０１９７】
新しいワード・シソーラス項目の作成は、図２１〜図２４に示すように実行することができる（テスト１５１または１７２でＡＤ＝０）。ワード索引ＷＩは、シソーラス項目の数を表すカウンタを増加させるか、使用できるワード索引（例えば、別のワードを取り消した時に、以前に解放されたワード索引）を選択することによって獲得される。このプロセスでは、行ＩＤ＝ＷＩで、対応する属性の補助テーブルに、（有用な）行を追加する。
【０１９８】
マクロワード・シソーラスの更新に、同様の手順を適用することができる。マクロワードの取り消し時に、マクロワード索引ＷＩを解放することができる（その構成ワードは全て取り消されている）。ワード作成の場合は、マクロワードが既に存在するか最初にチェックし、存在する場合は、そのマクロワード索引ＷＩが回復され、それ以外ではマクロワードも作成される。
【０１９９】
したがって、ワードを除去および／または追加したら、補助テーブルはもうシソーラス・ワードの昇順でソートされない。シソーラスのソートを維持するため、ワード指標レジスタを操作しなければならない。
【０２００】
しかし、このようなワード指標レジスタの操作を迅速に実行する必要がない。多少時間がかかるシソーラス全体のソート作業を必要とすることなく、更新したデータベースを新しい問合せに使用できるので、これは非常に有利である。
【０２０１】
シソーラスの新たに作成したワードまたはマクロワードは、別個の２次指標レジスタに記憶された自身のワード索引を有することができるが、これはシソーラスの前のワードと同じ補助テーブルおよびコード化データ・コンテナを共用する。シソーラスの追加時には、この２次指標レジスタのみをソートすることができ、これはシソーラス・ワードの大部分が１次レジスタに属しているので、比較的軽い仕事である。ワードを削除する場合、１次または２次指標レジスタにあるその行は、ワード索引列にデフォルト値が残る。したがって、任意のワード範囲に関するコード化データにアクセスするには、１次および２次指標レジスタの両方で二分法によって範囲の境界を探して、関連するワード索引を決定し、次にこれを通常の方法で使用して、共通の補助テーブルおよびデータ・コンテナをアドレス指定する。
【０２０２】
時々、ＣＰＵ１０１が使用可能な場合に、バッチ作業を実行して１次および２次指標レジスタをマージしながら、ワード指標列にデフォルト値を有するその行を削除することがある。これは、両方のレジスタが既にソートされているので、簡単な外部ソート作業である。それで生成されたマージ済みレジスタをセーブして、１次レジスタと置換し、２次レジスタを取り消す。
【０２０３】
このようなマージ作業を実行する前に、２次ワード指標レジスタが大きくなりすぎた（すなわち、項目を追加するたびに、ソートに時間がかかりすぎる）場合は、さらなる３次指標レジスタを作成し、新しいシソーラス項目を受け取り、以下同様にすることが可能である。
【０２０４】
６／  データ・コンテナの最適化
シソーラス編成が、図１７に示したタイプではなく図２５〜図３２に示したタイプである場合に、これは有用である。
【０２０５】
レコードがコード化データ・コンテナ内で挿入、削除されるので、同じシソーラス・ワードに属するレコードが連続アドレスを有するように、レコード・チェーンを配置することが好ましいという上述の条件はもう満たされない。これは、データベース・システムの満足できる動作を妨げるものではない。しかし、問合せ処理時間を最適化するため、上述したステップ１２５のように、コード化データ・コンテナのレコード、およびシソーラス補助テーブルの対応する列を再構成することが好ましい。ワード指標レジスタのソートと同様、このような再構成はＣＰＵの時間が使用可能である場合に実行することができる。
【０２０６】
代替シソーラス構成
シソーラスを、図１７で示した好ましい編成に従い、ワードまたはマクロワードごとに別個のファイルにして構成する場合、図１９〜図２４の流れ図が多少簡単になる。第一に、図１９の段階１２５を実行しない（ＶＤＧを作成し、保守する場合、ファイル編成は、このようなソートを省略すると有利である）。図２０では、ステップ１３６の二分検索１３５およびシソーラス更新を、図３３に示した手順と置換することができる。
【０２０７】
この手順では、ｉｍａｘ（ＡＴ、Ｗ、ｋ）が、シソーラスＡＴおよびワードＷに関するコード化データ・ファイルの層ｋレコードの現数を指定する。これらのパラメータは、初期化ステップ１３０でＡＴ、Ｗおよびｋの全ての値でゼロに設定される。
【０２０８】
図２０のステップ１３４で選択した属性ＡＴの現データ・グラフの値を図３３のステップ１７５で変数Ｗに割り当て、コード化層索引ｋを１に初期化する。コード化データ・ファイルのレコードを指示する整数ｉは、最初にステップ１７６でゼロに設定される。その後のテスト１７７でｉ＝ｉｍａｘ（ＡＴ，Ｗ，ｋ）である場合、値Ｑｋを有するレコードＡＴ＿Ｗ＿ＮＯｋ（ｉ）を、ワードＷに属する層ｋランク・ファイルに追加し、全ゼロ値を有するレコードＡＴ＿Ｗ＿ＨＰｋ（ｉ）を、対応するビットマップ・セグメント・ファイルに追加する。これはステップ１７８で実行され、ここではｉｍａｘ（ＡＴ，Ｗ，ｋ）も１ユニットだけ増加する。テスト１７７でｉ＜ｉｍａｘ（ＡＴ，Ｗ，ｋ）である場合は、ステップ１７９でランクＡＴ＿Ｗ＿ＮＯｋ（ｉ）をランク変数ｑにロードする。その後のテスト１８０でｑが商変数Ｑｋと異なることが判明した場合は、ステップ１８１で整数ｉを１ユニットだけ増加させ、ファイルに次のランク変数がある場合は、それを検査するため、プロセスはステップ１７７に戻る。したがって、各層ｋのコード化データ・レコード・チェーンの走査（図２１のループ１５３〜１５６に対応する）が、ＡＴ＿Ｗ＿ＮＯｋファイル内で実行され、これはシソーラスの全ワードに共通のデータ・コンテナより小さい。したがって、最小数のディスク・アクセスが確保される。
【０２０９】
ステップ１７８の後、またはテスト１８０でｑ＝Ｑｋである場合は、関連するコード化データ・ファイルにあるビットマップ・セグメントＡＴ＿Ｗ＿ＨＰｋ（ｉ）のランクＲｋのビットに「１」を書き込む（ステップ１８２）。テスト１８３で、コード化層索引ｋをｎ（その後により高い層のコード化データを計算する場合は、これより低い値）と比較する。ｋ＜ｎなら、ステップ１７６に戻る前に、ステップ１８４で索引ｋを１ユニット増加させる。ｋ＝ｎなら、シソーラスの更新が終了し、プログラムは図２０のステップ１３７へと進む。
【０２１０】
図３３の手順では、それぞれが整数値で構成されるランク・データＡＴ＿Ｗ＿ＮＯｋを大きいブロックでハード・ドライブ１０５からキャッシュ・メモリに読み出すことができ、したがってこの手順は非常に高速である。
【０２１１】
シソーラスで使用できる別の選択肢は、ワードに関する各項目に、フラットファイル行ＩＤリストの代表的フォーマットの表示を含めることである。実際、フォーマット（例えば、低密度または通常密度）を、考察中のワードを含むデータ・グラフの数に応じて、ワードごとに選択することができる。これは、フォーマットが２つしかない、すなわち、低密度（０）およびｎ＝２コード化層（１）の通常密度である場合、図２５〜図２７の右側部分にて破線で図示されている。この例では、シソーラス項目が全て、通常密度のフォーマットである。フォーマットが３個以上あってもよく、例えば、シソーラスのフォーマット・データは、ワードごとにコード化層の数を指定することができる。フラットファイル行ＩＤリストが、１つまたは複数のシソーラスに共通なデータ・コンテナに記憶されたデータで表される場合、異なるコード化フォーマットに別個のコンテナを設ける。
【０２１２】
上述した選択肢を使用する場合は、記憶機構を最適化するため、データベースが生きているので、各シソーラス項目のフォーマットを修正することができる。問合せエンジンはどのフォーマットでも働くことができるので、これは優先順位が低いタスクである。例えば、シソーラス項目を更新している場合、修正したデータベースのワードの密度によって満たされた所定の条件に基づき、フォーマット変更が望ましいと思われる項目をマークすることが可能である。例えば、そのシソーラス項目で特定数のデータ・グラフが識別された場合、ワードまたはマクロワードを低密度から通常密度のフォーマット、およびその逆に変更することができる。その後、プロセッサの時間が使用可能な場合、マークした項目を新しいフォーマットに変換し、システムを最適化することができる。
【０２１３】
以上で、ｎ＞１である場合は、フラットファイル行ＩＤリストが、全層のビットマップ・セグメント・データおよび最終層のランク・データによって完全に定義されているので、各コード化層でのランク・データの記憶が多少冗長であると述べた。
【０２１４】
図３４Ａ〜図３４Ｂは、コード化データ・ファイルを構成する代替方法を示し、これはｋ＜ｎの層ｋランクを記憶しない。この構成では、補助テーブル（図２８〜図３０）が層ｎのデータ・コンテナの第１のレコードを指示することが重要である。すなわち、アドレスＡＴ＿Ｆ１およびＡＴ＿Ｌ１が必要ない。図３４Ａに示す最高層ｎ＝２のデータ・コンテナは、図３２のものと同じであり、下位層ｎ−１＝１のデータ・コンテナにあるレコード・チェーンの頭部アドレスＦ（ｎ−１）（ＡＤ）＝Ｆ１（ＡＤ）を含むため、各レコードに追加フィールドがある。後者のデータ・コンテナ（図３４Ｂ）は、データ・コンテナによってカバーされる各シソーラス項目に関する層ｎランクごとに１つのレコード・チェーンを有する。層ｋ＜ｎデータ・コンテナの各レコードは、チェーンの次レコードのアドレスＮＸｋ（ＡＤ）を含む第１のフィールド（このアドレスは、さらなるアドレスがない場合は０である）、および対応するビットマップ・セグメントＨＰｋ（ＡＤ）を含む第２のフィールドを有する。層ｋ＜ｎチェーンは、チェーンの頭部アドレスを含む上位層データ・コンテナのレコードに記憶されるビットマップ・セグメントＨＰ（ｋ＋１）の非ゼロ・ビットに従って順序づけられる。１＜ｋ＜ｎ（図示せず）の場合、レコードは、さらに、下位層ｋ−１のデータ・コンテナにあるレコード・チェーンの頭部アドレスを含む第３のフィールドを有する（ｋ＝１になるまで以下同様である）。
【０２１５】
図３４Ａ〜図３４Ｂのデータ・コンテナを指示するシソーラスからフラットファイル行ＩＤリストを検索する手順は、以下の通りである。ワード索引ＷＩを使用して、層２データ・コンテナにある第１の関連レコードのアドレスを取得する。このアドレス（およびＮＸ２フィールドによって定義されたチェーンの各アドレス）で、層２ランクＮＯ２を読み出し、ビットマップ・セグメントＨＰ２を走査する。この走査で「１」が発見されるたびに、ビット位置Ｒ２で、層１のランクＮＯ１＝ＮＯ２×Ｄ２＋Ｒ２を決定し、下位層データ・コンテナの対応するレコードを読み出す（最初は、層２データ・コンテナの列Ｆ１によって与えられた頭部アドレスで、次に層１データ・コンテナのＮＸ１アドレスによって指示されたアドレスで）。この方法により層１のビットマップ・セグメントＨＰ１およびその位置ＮＯ１を検索して、所望のフラットファイル行ＩＤリストを表すビットマップ・ベクトルをアセンブルする。
【０２１６】
一般的ケースでは、データ・コンテナを層ｎからアクセスする。ｋ＞１のランクＮＯｋを決定した後に読み出した各セグメントＨＰｋを走査して、その非ゼロ・ビットを検出する。位置Ｒｋで検出されたＨＰｋの各非ゼロ・ビットは、下位層ランクＮＯ（ｋ−１）＝ＮＯｋ×Ｄｋ＋Ｒｋを提供し、下位層コンテナで指定されたチェーンで対応するビットマップ・セグメントＨＰ（ｋ−１）が読み出される。ｋ＝１になるまでプロセスを再帰的に反復する。数字ＮＯ１×Ｄ１＋Ｒ１は、シソーラス項目のフラットファイル行ＩＤである。
【０２１７】
図３４Ａ〜図３４Ｂに示したコード化データ・ファイルは、図１９〜図２１に関して説明したものと同様の方法で作成することができる。全てのＨＰｋおよびＦ（ｋ−１）フィールドは、段階１２４の前にゼロで初期化される。図２１の手順は、ｋ＝ｎでのみ実行され、ステップ１６１ではコード化層索引ｋがｎから１に減少する図３５のループによって置換される。
【０２１８】
このループの第１のステップ４５０は、ビットマップ・セグメントＨＰｋ（ＡＤ）のビット位置Ｒｋに数字「１」を書き込む。コード化層ｋが１より大きい場合（テスト４５１）、これはステップ４５２で１ユニットだけ減少させ、層（ｋ＋１）コード化データ・コンテナで第１のアドレスＭ＝Ｆｋ（ＡＤ）を読み出す（ステップ４５３）。
【０２１９】
Ｍがゼロである場合（テスト４５４）、層ｋコード化データ・コンテナの自由レコード・チェーンの頭部アドレスＨｋを層（ｋ＋１）コード化データ・コンテナの第１のアドレス・フィールドＦｋ（ＡＤ）に書き込み（ステップ４５５）、新しいチェーンを作成する。次に、ＡＤの値をＨｋで置換し（ステップ４５６）、層ｋコード化データ・コンテナでレコード・チェーンを更新する（ステップ４５７〜４５８）。ＮＸｋ（ＡＤ）を０に設定する前にＨｋをＮＸｋ（ＡＤ）で置換する。ステップ４５８の後、プロセスはステップ４５０に戻る。
【０２２０】
テスト４５４でＭ＞０の場合は、ステップ４６０で索引Ｒを０に設定して、ビットマップ・セグメントＨＰ＝ＨＰ（ｋ＋１）（ＡＤ）の走査を初期化する。Ｒが、現データ・グラフ識別子に対応する剰余Ｒ（ｋ＋１）より小さい場合は、ビットマップ・セグメントＨＰの対応するビットＨＰ（Ｒ）を評価する（テスト４６２）。ＨＲ（Ｐ）＝０の場合は、プログラムがステップ４６３へと進み、テスト４６１に戻る前にＲを１ユニットだけ増加させる。テスト４６２でＨＰ（Ｒ）＝１である場合は、層ｋレコード・チェーンを前進する必要がある。整数Ｍ’が、ステップ４６４でＭの値を受け取り、ステップ４６５でＭがＮＸｋ（Ｍ’）に置換される。Ｍの新しい値がゼロでない場合（テスト４６６）、プログラムは上述したステップ４６３へと進む。それ以外は、層ｋレコード・チェーンの最後に到達しているので、ステップ４６７で層ｋの自由レコード・チェーンの頭部アドレスＨｋをＮＸｋ（Ｍ’）に割り当ててから、上述したステップ４５６へと進む。
【０２２１】
テスト４６１でＲが剰余Ｒ（ｋ＋１）と等しい場合は、ビットマップ・セグメントＨＰの対応するビットＨＰ（Ｒ）も評価する（テスト４７０）。ＨＰ（Ｒ）＝１の場合は、現シソーラス項目に関係する層ｋ＋１の入力リストに既にランクＱｋが存在し、したがって層ｋコード化データ・コンテナに新しいレコードを作成する必要がない。ＡＤの値は、ステップ４７１で単にＭで置換され、プロセスはステップ４５０へと戻る。
【０２２２】
テスト４７０でＨＰ（Ｒ）＝０の場合は、ＡＤの値を自由レコード・チェーンの頭部アドレスＨｋで置換し（ステップ４７２）、層ｋのコード化データ・コンテナでハフマン・タイプのレコード・チェーンを更新する（ステップ４７３〜４７４）。ＮＸｋ（ＡＤ）をＭに設定する前に、ＨｋをＮＸｋ（ＡＤ）で置換する。ステップ４７４の後、プロセスはステップ４５０へと戻る。
【０２２３】
テスト４５１でｋ＝１になったら、図３５のループは終了である。
【０２２４】
図３４Ｃおよび図３４Ｄは、図３４Ａおよび図３４Ｂと等しい内容を有するテーブルを示し、ここではｋ＞１のビットマップ・セグメントＨＰｋが明示的に記憶されていない。層ｎのコード化データ・コンテナ（図３４Ｃ）は、図３４Ａに関して説明したものと同一であるが、ＨＰｎ列がない。ｋ＜ｎの各層ｋコード化データ・コンテナ（図３４Ｄ）は、図３４Ｂに関して説明したものと同一であるが、層ｋ＋１の剰余を含む追加列Ｒ（ｋ＋１）がある。層ｋコード化データ・コンテナへのレコードに剰余値Ｒ（ｋ＋１）が存在することは、記憶されていない上位層のビットマップ・セグメントＨＰ（ｋ＋１）の位置Ｒ（ｋ＋１）に「１」があることを意味する。
【０２２５】
図１７の方式、すなわち、ディスク・アクセスを最少にするために、シソーラス項目ごとにコード化データ・ファイルを別個にする方式は、記憶してあるコード化データが層１，・・・，ｎ−１のランクを含まない場合にも適用することができる。層ｎのランクおよびビットマップ・セグメントは、図１７のように記憶することができる。下位層については、幾つかの選択肢がある。シソーラス・ワードおよびコード化層ｋ＜ｎごとに１つのデータ・コンテナがあり、データ・チェーンが、上位層ｋ＋１に関するレコードで指示される。層ｋのレコード・チェーンは、属性名ＡＴ、ワードまたはマクロワード値Ｗ、コード化層索引ｋおよび層ｋ＋１のランクＮＯ（ｋ＋１）を含む名前を有する別個のファイルに切り離すこともできる。このようなファイルＡＴ＿Ｗ＿ｋ＿ＮＯ（ｋ＋１）の各レコードは、層ｋ＋１の剰余Ｒ（ｋ＋１）、およびランクＮＯｋ＝ＮＯ（ｋ＋１）×Ｄ（ｋ＋１）＋Ｒ（ｋ＋１）で検出される層ｋのビットマップ・セグメントＨＰｋを含む。
【０２２６】
問合せ基準の取扱い
ＲＤＢＭＳの場合と同様、問合せは、構造的問合せ言語（ＳＱＬ）に従って表現することができ、これは国際標準化機構（ＩＳＯ）および米国規格協会（ＡＮＳＩ）が標準として採用している。
【０２２７】
問合せ処理手順の一般的な流れ図を図３６に示す。
【０２２８】
ＳＱＬの「ＷＨＥＲＥ」文節に含まれる問合せ基準を、図３６の段階１９０の要求木に変換する。問合せ基準を分析し、葉がＳＱＬ問合せで定義されたような個々の属性値の範囲に対応し、ノードがその葉から実行される論理演算に対応する木に従って構築する。葉は、ＳＱＬ問合せの「ＢＥＴＷＥＥＮ文節」とも呼ばれる。ＳＱＬ問合せで定義される個々の属性値は、１つのワードを対象とするＢＥＴＷＥＥＮ文節である。
【０２２９】
例３：
このような木の例を、問合せの例示としてのケースの図３７で示し、これは顧客Ａｎｄｒｅまたは顧客Ｍａｘが遭遇した事故に関し、５００≦ＡＡ≦５０００などの損害賠償金額を有する全データ・グラフを検索することを含む。この木は、破線で示した３つの葉を有し、これは問合せで定義されたＢＥＴＷＥＥＮ文節に対応する。すなわち、顧客名属性については［Ａｎｄｒｅ，Ａｎｄｒｅ］および［Ｍａｘ，Ｍａｘ］、事故金額属性については［５００，５０００］である。木は２つのノードも有し、一方は２つのＣＮ基準間のＯＲ演算、一方はＡＡ基準でのＡＮＤ演算用の根にある。
【０２３０】
木の分解は一意ではない。最小数のノードを有する方法を選択することが好ましい。
【０２３１】
次の段階１９１は、マクロワード・シソーラスを有する属性に関係するＢＥＴＷＥＥＮ文節を分析し、分割することによって、木の拡張を実行する。これは、ステップ１９０で獲得した木から、記憶してあるシソーラス・ワード、および問合せに使用する属性に関連付けられたマクロワード索引ファイルに関して実行される。ＢＥＴＷＥＥＮ文節で定義された各範囲の上下の境界を、属性に関連するシソーラスのワードと比較して、範囲から部分範囲への分解を検索し、これによってワードまたはマクロワード・シソーラス内で各部分範囲もＢＥＴＷＥＥＮ文節として定義される。
【０２３２】
好ましい実施形態では、マクロワードを最大限に使用するため、分解を最適化する。この最適化では、可能な最小数のワードまたはマクロワードを保持し、ＢＥＴＷＥＥＮ文節で定義される範囲にマッピングされる部分範囲を形成する。システムは、インターバルに含まれる最高レベルのマクロワードを選択し、最小のワード・レベルを獲得するか、その範囲のワードがなくなるまで範囲の残りの部分で同じプロセスを繰り返す。
【０２３３】
段階１９１で生成された拡張木では、分割されているＢＥＴＷＥＥＮ葉を、ＯＲノードおよび部分範囲に関連付けられた葉で作成した部分木で置換する。この葉もＢＥＴＷＥＥＮ文節の形式であり、問合せに関係あるシソーラス項目をカバーする。拡張木は、その後の処理のため、関係あるシソーラス項目の組合せを定義する。
【０２３４】
拡張木の全ての葉は、個々のワードまたはマクロワードの（部分）範囲と関連付けられる。このような範囲は、シソーラス索引ファイルのワードまたはマクロワード行ＩＤの点で、その境界によって定義することができる。
【０２３５】
図３８は、例３（図３７）の木に対応する拡張木を示す。これは、図２５〜図２７のシソーラス索引ファイルによって取得される。１ワードの範囲「ＣＮ＝Ａｎｄｒｅ」および「ＣＮ＝Ｍａｘ」は分割されないが、単に、二分検索で取得したシソーラス索引ファイルのワードの行ＩＤのＣＮ＿ｘ＝１および４で符号化される。図２６および図２７の事故金額シソーラスをさらに検索すると、範囲５００≦ＡＡ≦５０００が部分範囲に分割され、一方はワードＡＡ＿ｘ＝２および５、一方はマクロワードＡＡ＿３＿ｘ＝１に関する。
【０２３６】
図３９は、図３６の段階１９１でＢＥＴＷＥＥＮ文節を分割するための最適手順の流れ図を示す。（接続された）範囲は空値を含まないと仮定する（さもなければ、葉を最初に、ＯＲノードで連結された２つの置換葉に分割することができ、一方の葉は個々のワード行ＩＤ、ＡＴ＿ｘ＝０を有し、他方は上記の仮定を満足する）。
【０２３７】
ＢＥＴＷＥＥＮ文節で考察する属性ＡＴが、整数レベル・パラメータｑ（１≦ｑ≦Ｑ）で索引付けられたマクロワード・シソーラスの数Ｑ≧０を有し、レベルｑ＝０が個々のワード・シソーラスを指定することも仮定する。レベルｑのシソーラスでは、接頭語長（例えば、ＡＳＣＩＩ文字の数）をＰ（ｑ）と表記し、Ｐ（０）＞Ｐ（１）＞・・・＞Ｐ（Ｑ）である。Ｐ（０）は個々のワード長である。図３９〜図４０では、ｘｍａｘがシソーラス０の非空ワードの数を指定し、Ｗｑ（ｘ）がレベルｑシソーラスの行ＩＤ＝ｘに記憶された（マクロ）ワードを指定し、［Ｗ］Ｐ（ｑ）が、長さＰ（ｑ）の接頭語（ｑ≧１）を維持するためにワードＷを切り捨てることによって取得されたマクロワードを指定する。
【０２３８】
図３９の手順の初期ステップ２００で、プログラムはワード・シソーラス行ＩＤのａおよびｂを選択し、したがってＷ０（ａ）およびＷ０（ｂ）はそれぞれ、処理中の葉のために定義された範囲に含まれる最低および最高シソーラス・ワードである。整数ａおよびｂは、範囲の境界に基づき、ワード・シソーラスの二分検索で容易に選択される。検索によって、範囲の対象にシソーラス・ワードがないことが判明した場合、手順は、葉の出力が空白のフラットファイル行ＩＤリストとなることを指定して終了する。
【０２３９】
Ｗ０（ａ）がシソーラスの最低ワードである場合は（テスト２０１でａ＝１）、２進変数ＸＬをステップ２０２でＸＬ＝０として初期化する。それ以外では、ステップ２０３でＸＬ＝１として初期化する。Ｗ０（ｂ）がシソーラスの最高ワードである場合は（テスト２０４でｂ＝ｘｍａｘ）、２進変数ＸＲをステップ２０５でＸＲ＝０として初期化する。それ以外では、ステップ２０６でＸＲ＝１として初期化する。以下のステップでは、値ＸＬ（ＸＲ）＝０は、考察中の範囲の下（上）限がマクロワードの境界と一致することを示す。レベルｑシソーラスからのマクロワード境界と一致する場合は、１≦ｑ’≦ｑである任意のレベルｑ’のシソーラスでも真である。初期化２０１〜２０６は、ｑ＝Ｑの場合に有効である。
【０２４０】
ステップ２０７で、プログラムは図４０で示した流れ図を有するファンクションＦＵＮＣを起動する。このファンクションは、処理した葉の場所に挿入すべき部分木を記述するデータを戻す（ステップ２０８）。ファンクションＦＵＮＣは、図４０Ａのステップ２１０で実行を開始した時に入力された６つの引数を有する。すなわち、属性基準ＡＴ、シソーラス・レベル・パラメータｑ（図３９のステップ２０７でファンクションを最初に開始した時にはｑ＝Ｑ）、問題となる範囲にある最低および最高ＡＴワードのシソーラスの行ＩＤのａおよびｂ、および上記で定義した変数ＸＬおよびＸＲである。
【０２４１】
ステップ２１０の後、シソーラス・レベル・パラメータｑがゼロか否かを判断する（テスト２１１）。ｑ＞０の場合は、Ｗｑ（ａ’）＝［Ｗ０（ａ）］Ｐ（ｑ）およびＷｑ（ｂ’）＝［Ｗ０（ｂ）］Ｐ（ｑ）となるように、ステップ２１２で２つのマクロワード・シソーラスの行ＩＤａ’およびｂ’を選択する。これは、ワードＷ０（ａ）およびＷ０（ｂ）を切り捨てた後にレベルｑシソーラスの簡単な二分検索によって実行される。
【０２４２】
その後のテスト２１３では、変数ＸＬを評価する。ＸＬ＝１の場合は、テスト２１４で連続するワードＷ０（ａ−１）およびＷ０（ａ）が同じレベルｑのマクロワードを共用するか、すなわち、［Ｗ０（ａ−１）］Ｐ（ｑ）＝Ｗｑ（ａ’）であるか判断する。イエスである場合は、ステップ２１５で整数ａ’を１ユニットだけ増加させる。テスト２１４で［Ｗ０（ａ−１）］Ｐ（ｑ）＜Ｗｑ（ａ’）である場合は、ステップ２１６でＸＬの値を０に変更する。考察中の範囲の下限が、レベルｑのマクロワードの境界と一致するからである。ステップ２１５または２１６の後、またはテスト２１３でＸＬ＝０の場合は、変数ＸＲを評価する（テスト２１７）。ＸＲ＝１の場合は、テスト２１８で連続するワードＷ０（ｂ）およびＷ０（ｂ＋１）が同じレベルｑのマクロワードを共用するか、すなわち、［Ｗ０（ｂ＋１）］Ｐ（ｑ）＝Ｗｑ（ｂ’）であるか判断する。イエスである場合は、ステップ２１９で整数ｂ’を１ユニットだけ減少させる。テスト２１８で［Ｗ０（ｂ＋１）］Ｐ（ｑ）＞Ｗｑ（ｂ’）である場合は、ステップ２１６でＸＲの値を０に変更する。考察中の範囲の上限が、レベルｑのマクロワードの境界と一致するからである。
【０２４３】
ステップ２１９または２２０の後、またはテスト２１７でＸＲ＝０の場合は、テスト２２１で変数ａ’およびｂ’を比較する。ａ’＞ｂ’である場合は、考察中の範囲がレベルｑのマクロワードに及ばず、プログラムはステップ２２２でｑを１ユニットだけ減少させ、ステップ２１１へと戻る。
【０２４４】
テスト２２１でａ’≦ｂ’である場合は、拡張した問合せ木に挿入するため、ｂ’−ａ’＋１マクロワードの部分範囲を作成する（図４０Ｂのステップ２２３）。この部分範囲は、ＡＴ＿Ｐ（ｑ）＿ｘ＝ａ’からＡＴ＿Ｐ（ｑ）＿ｘ＝ｂ’まで、マクロワード行ＩＤをカバーする。
【０２４５】
その後、ステップ２２４で再び変数ＸＬを評価する。ＸＬ＝１の場合は、ステップ２２３で作成した部分範囲の下に別の範囲を考慮しなければならない。ステップ２２５で、その下方範囲の上限の行ＩＤ、ｂ”を決定する。対応するワードＷ０（ｂ”）はＡＴシソーラスの最上位であり、したがって［Ｗ０（ｂ”）］Ｐ（ｑ）＜Ｗｑ（ａ’）である。次に、ステップ２２６でファンクションＦＵＮＣ（ＡＴ、ｑ−１、ａ、ｂ”、１、０）を再帰的に呼び出して、追加の下限を扱う。ステップ２２６の後、またはテスト２２４でＸＬ＝０の場合は、ステップ２２７で変数ＸＲを再び評価する。ＸＲ＝１の場合は、ステップ２２３で作成した部分範囲の上に、別の範囲を考慮しなければならない。ステップ２２８で、その上方範囲の下限の行ＩＤ、ａ”を決定する。対応するワードＷ０（ａ”）はＡＴシソーラスの最下位であり、したがって［Ｗ０（ａ”）］Ｐ（ｑ）＞Ｗｑ（ｂ’）である。次に、ステップ２２９でファンクションＦＵＮＣ（ＡＴ、ｑ−１、ａ”、ｂ、０、１）を再帰的に呼び出して、追加の下限を扱う。
【０２４６】
テスト２１１でｑ＝１である場合は、拡張した問合せ木に挿入するため、ｂ−ａ＋１ワードの部分範囲を作成する（ステップ２３０）。この部分範囲は、ＡＴ＿ｘ＝ａからＡＴ＿ｘ＝ｂまで、個々のワード行ＩＤをカバーする。
【０２４７】
ステップ２２９または２３０の後、またはテスト２２７でＸＲ＝０である場合は、ステップ２３１で、ステップ２２３または２３０で作成されたか、ステップ２２６および／または２２９で再帰的に呼び出されたファンクションで戻された、またはその両方の部分木を記述するデータを戻すことにより、ファンクションＦＵＮＣの実行を終了する。
【０２４８】
問合せ木を分析し、拡張する段階１９１が終了したら、図３６の段階１９２で、最高コード化層ｎから開始して、拡張木を処理する。ｎ＞１の場合は、図４１のループで示すように、層ｋにて、ｋをｎから１へと減少させて処理を連続的に実行する。
【０２４９】
図４１のステップ２４０で、コード化層索引ｋを値ｎで初期化する。層ｋの処理は、ステップ２４１で開始し、拡張した問合せ木の根ＮＤを、ＦＮＯＤＥと命名されたファンクションを読み出す（ステップ２４２）ためのノードとして選択する。このファンクションへの入力は、コード化層索引ｋ、ノードＮＤおよびその子ノードを記述するパラメータ、およびビットマップ・ベクトルＲｅｓ（ｋ＝ｎで任意の方法にて初期化される）を備える。その出力は、ＷＺと表記されるビットマップ・ベクトルである。層１では、出力ビットマップ・ベクトルＷＺのビットの値が１であれば、ＶＤＧ（フラットファイル行ＩＤ）が、ノードＮＤである根を有する木によって定義された問合せ基準と一致することを示す。層ｋ＞１では、少なくとも１つの一致するフラットファイルＩＤを有するΔｋ個のフラットファイル行ＩＤでできたグループの個々の層ｋ−１ランクを示す。各コード化層索引ｋで、ファンクションＦＮＯＤＥを再帰的に呼び出して、拡張した問合せ木の全ノードを処理する。
【０２５０】
ステップ２４２で呼び出したファンクションによって出力されたビットマップ・ベクトルＷＺは、ｋ＞１の場合、その後の層ｋ−１の処理で使用するため、ステップ２４３で層ｋの問合せ結果Ｒｅｓとして保存する。その場合（テスト２４４）は、ステップ２４５で索引ｋを１ユニットだけ減少させ、ステップ２４１から次の層処理を開始する。
【０２５１】
ｋ＝１の場合、Ｒｅｓは、ステップ２４６で出力された所望のフラットファイル行ＩＤリストをビットマップで表示したものである。
【０２５２】
ファンクションＦＮＯＤＥの流れ図を図４２に示す。ビットマップ・ベクトルＷＺは、個々では一続きのビットＤｋ個のセグメントと見なされる。ベクトルＷＺのランクＮのセグメント（すなわち、Ｎ≧０の（Ｎ＋１）番目のセグメント）をＷＺ［Ｎ］と表記する。ベクトルＷＺのランクＮのビット（すなわち、Ｎ≧０の（Ｎ＋１）番目のビット）をＷＺ（Ｎ）と表記する。ファンクションの開始（ステップ２４８）後、ビットマップ・ベクトルＷＺを含む（ステップ２４９）ために、ＲＡＭ１０３に作業ゾーンを確保する。
【０２５３】
テスト２５０で、ＮＤが事前設定したノードを指示しているか最初に判断する。事前設定ノード（図３８の例では図示せず）は、フラットファイル行ＩＤリストが既に決定されているノードである。通常、このリストは、以前の問合せの処理で一致するデータ・グラフ識別子（ステップ１９２の出力）として作成されている。これは、このようなマッチング識別子リストの組合せでもよい。ＳＱＬ問合せが、以前の１つまたは複数の問合せ結果に言及する、例えば、応答を、以前の問合せに対する応答に含まれたレコードに制限している場合は、変換ステップ１９０で１つまたは複数の事前設定ノードを定義することができる。この機能は、データベースを対話モードで使用する場合に特に有用である。
【０２５４】
事前設定ノードについて以前に決定したフラットファイル行ＩＤリストは、ＲＡＭ１０３に記憶するか、ハード・ドライブ１０５に保存することができる（後者の場合は、圧縮した形式で行うことが好ましい）。このリストは、１≦ｋ≦ｎの場合にビットマップ・ベクトルの形式で層ｋの入力リストを提供するように、ｎコード化層に従って符号化される。このような層ｋのビットマップ・ベクトルは、テスト２５０でノードＮＤが事前設定されていると判明した場合、ステップ２５１でＷＺとしてロードされる。
【０２５５】
それ以外では、演算子ノードが葉ではなく演算子ノードを指示した場合（テスト２５２）は、ステップ２５３でその最初の子ノードＮＤ１を選択し、ステップ２５４でファンクションＦＮＯＤＥを再帰的に呼び出し、ノードＮＤ１に対応するビットマップ・ベクトルＷＺ１を取得する。次にステップ２５５で演算子ノードＮＤの第２の子ノードＮＤ２を選択し、ステップ２５６で再びファンクションＦＮＯＤＥを呼び出して、ノードＮＤ２に対応するビットマップ・ベクトルＷＺ２を取得する。
【０２５６】
ステップ２５７では、ビットマップ・ベクトルＷＺ１をＷＺ２とビットごとに組み合わせてビットマップ・ベクトルＷＺを形成する。この組合せ
【０２５７】
【数１２】
2008269643.tif 000014
は、例えば、ＡＮＤ、ＯＲ、Ｅｘｃｌｕｓｉｖｅ  ＯＲなどの演算のように、ノードＮＤのパラメータで記述されたブール演算子
【０２５８】
【数１３】
2008269643.tif 000015
に従う。これは基本的にビットマップ・ベクトルの重ね合わせであり、両方のオペランド・ベクトルがＲＡＭ１０３に記憶されているので、非常に迅速に実行される。ステップ２５８では、作業ゾーンＷＺ１およびＷＺ２に割り当てられているＲＡＭスペースを解放する。図４２では、演算子ノードが２つの子ノードを有するケースのみを考察する。これは明らかに３つ以上のオペランドがあるケースにも拡張することができる。さらに、ＮＯＴ演算のように、１つのオペランドの演算もあり、したがってファンクションＦＮＯＤＥを１回呼び出すだけでよい。
【０２５９】
ノードＮＤが葉である場合（テスト２５２）は、初期化ステップ２６０で作業ゾーンＷＺの全ビットをゼロに設定する。また、シソーラス・ポインタｘを、ノードＮＤについて定義されたＢＥＴＷＥＥＮ範囲の第１行ＩＤの値ｘ１に初期化する。
【０２６０】
ノードＮＤが、属性ＡＴ、およびシソーラスが「低密度」フォーマットで記憶されているマクロワード索引ｑに関係がある場合（テスト２６１）は、葉を図４３に関して以下で説明するように処理し（ステップ２６２）、関連するビットマップ・ベクトルＷＺを取得する。シソーラス・フォーマットが「通常密度」である場合、処理はプログラムが（時間の経過順に）第１の層にあるか、すなわち、ｋ＝ｎであるか否か（テスト２６３）によって決定される。図４４の処理は、ｋ＝ｎの場合に当てはまり（ステップ２６４）、ｋ＜ｎの場合は図４５の処理が当てはまる（ステップ２６５）。
【０２６１】
ステップ２５１、２５８、２６２、２６４または２６５の後、ステップ２６６でビットマップ・ベクトルＷＺを戻すことにより、ファンクションＦＮＯＤＥの実行を終了する。
【０２６２】
低密度処理を説明するために、図４３では、シソーラスの記憶機構がレコード・チェーンも利用すると仮定する。シソーラスが、図２５〜図２７と同様の索引ファイル（行ＩＤｘに記憶されたワード索引はＡＴ＿ＷＩ（ｘ）と表記される）と、ワード索引によってアドレス指定され、レコード・チェーンの第１のフラットファイル行ＩＤのデータ・コンテナにアドレスＡＴ＿Ｆ（ＷＩ）を含む補助テーブルを有する。アドレスＡＤ＞０の各レコードで、このデータ・コンテナは、フラットファイル行ＩＤ値ＮＯ（ＡＤ）に加えて、レコード・チェーンの次アドレスＮＸ（ＡＤ）へのポインタを含む次アドレス・フィールドを有する。チェーン末尾は、ＮＸ（ＡＤ）＝０を有する。あるいは、低密度リストを、ワードごとに個々のファイルに記憶することができる（図１７と同様）。
【０２６３】
図４３の低密度処理は、ＢＥＴＷＥＥＮ範囲のワードを連続的に取り扱うループを有する。反復するごとに、プログラムは最初にステップ２７０でワード索引ＷＩ＝ＡＴ＿ＷＩ（ｘ）を、次にステップ２７１で頭部アドレスＡＤ＝ＡＴ＿Ｆ（ＷＩ）を取得して、レコード・チェーンの走査を開始する。ＡＤ＞０である場合（テスト２７２）は、レコード・チェーンに検査すべき少なくとも１つの項目が残っているので、ステップ２７３でフラットファイル行ＩＤ値ＮＯ（ＡＤ）および次アドレスＮＸ（ＡＤ）をそれぞれ変数ＮおよびＭとして読み出す。ステップ２７４で、
【０２６４】
【数１４】
2008269643.tif 000016
によるＮのユークリッド除法を実行し、層ｋ＝１の商（ランク）Ｎ’を取得する。ｋ＝１の場合はＮ’＝Ｎである。ｋ＞１の場合、この演算２７４は、層ｋ’の除数Ｄｋ’が２δｋ’（δｋ’は整数（１≦ｋ’＜ｋ））であれば、Ｎ（剰余）の
【０２６５】
【数１５】
2008269643.tif 000017
最下位ビットを削除するだけである。次に、ビットマップ・ベクトルＷＺのビットＷＺ（Ｎ’）に「１」を書き込む（ステップ２７５）。ステップ２７６でＡＤを次アドレスＭで置換した後、テスト２７２に戻る。レコード・チェーンを完全に検査したら（テスト２７２でＡＤ＝０）、現ワードｘがＢＥＴＷＥＥＮ範囲の最終ワードｘ２であるか判断する（テスト２７７）。ｘ＜ｘ２の場合は、ループの次の反復のために、ステップ２７８でシソーラス・ポインタｘを１ユニットだけ増加させる。テスト２７７でｘ＝ｘ２であればループが終了し、プログラムは図４２のステップ２６６へと進む。
【０２６６】
図４４の層ｎの通常密度処理は、ＢＥＴＷＥＥＮ範囲のワードまたはマクロワードを連続的に取り扱う同様のループを有するが、（記憶してある）コード化データの再計算は実行しない。反復ごとに、プログラムは最初にステップ２８０でワード索引ＷＩ＝ＡＴ＿Ｐ（ｑ）＿ＷＩ（ｘ）を取得し、次にステップ２８１で頭部アドレスＡＤ＝ＡＴ＿Ｐ（ｑ）＿Ｆｎ（ＷＩ）を取得して、レコード・チェーンの走査を開始する。ＡＤ＞０である場合（テスト２８２）は、レコード・チェーンに検査すべき少なくとも１つの項目が残っているので、ステップ２８３で層ｎのランク値ＮＯｎ（ＡＤ）、次アドレスＮＸｎ（ＡＤ）および対応する層ｎのビットマップ・セグメントＨＰｎ（ＡＤ）をそれぞれ変数Ｎ、ＭおよびＨとして読み出す。次にビットマップ・セグメントＨを、ブールＯＲ演算でビットマップ・ベクトルＷＺのセグメントＷＺ［Ｎ］に重畳させ（ステップ２８４）、ステップ２８５でＡＤをＭで置換してからテスト２８２に戻る。レコード・チェーンを完全に検査したら（テスト２８２でＡＤ＝０）、現ワードｘがＢＥＴＷＥＥＮ範囲の最終ワードｘ２であるか判断する（テスト２８６）。ｘ＜ｘ２の場合は、ループの次の反復のために、ステップ２８７でシソーラス・ポインタｘを１ユニットだけ増加させる。テスト２８６でｘ＝ｘ２であればループが終了し、プログラムは図４２のステップ２６６へと進む。
【０２６７】
シソーラスを図２５〜図３２に示すように構成したケースで、層ｋ＜ｎの通常密度処理を図４５で詳細に示す。これは、ＮＯｋ（ＡＤ）が、ＢＥＴＷＥＥＮ範囲のワードまたはマクロワードに関連する層ｋのランク・リストに属していても、先行層ｋ＋１で取得したビットマップ・ベクトルＲｅｓのランクＮＯｋ（ＡＤ）のビットにゼロがあれば、ビットマップ・セグメントＨＰｋ（ＡＤ）へのアクセスは無駄である、ということを利用する。
【０２６８】
図４５の手順は図４４の手順と同様である。ステップ２８０〜２８２と２８５〜２８７は、ｎをｋで置換すれば同じである。しかし、レコード・チェーンを検査すべき場合（テスト２８２でＡＤ＞０）は、ステップ２９０で層ｋのランク値ＮＯｋ（ＡＤ）および次アドレスＮＸｋ（ＡＤ）のみを変数ＮおよびＭとして読み出す。次に、テスト２９１で層ｋ＋１の結果ビットマップＲｅｓのビットＲｅｓ（Ｎ）を評価する。Ｒｅｓ（Ｎ）＝０の場合は、ステップ２８５に直接ジャンプして、ランクＮをフィルタリングし、除去する。それ以外（Ｒｅｓ（Ｎ）＝１）では、ステップ２９３でビットマップ・セグメントＨＰｋ（ＡＤ）を読み出してから、ステップ２８４へと進む。
【０２６９】
シソーラス項目のコード化データを構成すると、図４４おおび図４５のループが一般に、連続するデータ・コンテナのレコードの連続的読み取りを意味することが分かる（ステップ２８３および２９０）。何故なら、索引ＷＩの各ワードが、データ・コンテナの連続するアドレスＡＤに記憶されたコード化データ、およびＢＥＴＷＥＥＮ範囲の大部分の連続ワードを有するからである。したがって、これらのループは、コンピュータのキャッシュ・メモリでデータ・コンテナレコードのブロックをロードし、それによって必要なディスク・アクセス回数を減少させることによって、効率的に実行することができる。同じ考慮事項が、図４３のステップ２７３で読み出す低密度データＮＯ（ＡＤ）およびＮＸ（ＡＤ）にも当てはまる。
【０２７０】
図４６に示した層ｋ＜ｎの通常密度処理で、さらに改良が得られ、これは２つの連続ループで構成される。シソーラス・ポインタｘで索引付けられた第１のループは、第２のループでビットマップ・セグメントを取り扱うために使用するＴＮＯと表記された一時的ランク・テーブルを決定するためのものである。テーブルＴＮＯは幾つかのアドレスを有し、これは少なくとも、現シソーラスの層ｋコード化データ（ＡＴ、ｑ）を記憶しているデータ・コンテナのアドレスＡＤｍａｘの数と等しい。ランク・テーブルＴＮＯのアドレスＡＤの各項目ＴＮＯ（ＡＤ）は、ビットマップ・セグメントＨＰｋ（ＡＤ）へのアクセスが有用な場合は、ランクＮＯｋ（ＡＤ）を表す整数、それ以外ではデフォルト値（−１）を含むためのものである。
【０２７１】
初期化ステップ２７９では、ランク・テーブルＴＮＯの全項目をデフォルト値−１に設定する。第１のループは図４５のループと同様である。テスト２９１でＲｅｓ（Ｎ）＝１である場合は、ステップ２９５でランクＮをアドレスＡＤでテーブルＴＮＯに書き込んでから、ステップ２８５でＡＤをＭで置換する。
【０２７２】
第１のループが終了したら（テスト２８６でｘ＝ｘ２になったら）、プログラムは第２のループへと進み、これはステップ３０１にてＡＤ＝１で初期化される。第２のループを反復するごとに、アドレスＡＤでのランク・テーブルＴＮＯの内容Ｎをステップ３０２で読み出し、テスト３０３でデフォルト値と比較する。Ｎが有効ランク値（≠−１）である場合は、ビットマップ・セグメントＨＰｋ（ＡＤ）を読み出し（ステップ３０４）、ビットごとにブールＯＲ演算でビットマップ・ベクトルＷＺのセグメントＷＺ［Ｎ］に重畳させる（ステップ３０５）。ＡＤ＜ＡＤｍａｘである場合（テスト３０６）は、ステップ３０７でランク・テーブルのアドレスＡＤを１ユニットだけ増加させてから、ステップ３０２へと戻る。テスト３０６でＡＤ＝ＡＤｍａｘになった場合は、第２のループが終了し、プログラムは図４２のステップ２６６へと進む。
【０２７３】
読み出す価値がないビットマップ・セグメントＨＰｋ（ＡＤ）をフィルタリングして除去する以外に、図４６で示した手順は、ランク・テーブルＴＮＯのおかげで、アドレスＡＤに基づいて層ｋのビットマップ・セグメント・データを含むファイルの読み出し作業をグループ分けする（第２のループのステップ３０４）。このようなグループ分けは、ワード単位ばかりでなく、ＢＥＴＷＥＥＮ範囲の全ワードでも実行され、最終的に第２のループでＨＰｋファイルを読み出す場合に、ランク値がテーブルＴＮＯに書き込まれているワード間には区別がなくなる。これは、ＨＰｋファイルのブロックごとのアクセスを最大限に利用し、非常に大きい利点を提供する。何故なら、下位層、特に層１は最大のＨＰｋを意味し、ここで読み出し作業数が最高になるからである。
【０２７４】
図４７は、コード化データ・コンテナが図２５〜図３０および図３４Ａ〜図３４Ｂで示したように記憶されている場合に、図４５の手順を適用する方法を示す。ループは同様の構造を有する。しかし、コード化データを最高層ｎからアクセスするので、ステップ２８１で読み出すアドレスＡＤは、層ｎのデータ・コンテナにあるレコード・チェーンの頭部アドレスＡＴ＿Ｐ（ｑ）＿Ｆｎ（ＷＩ）であり、ステップ２８２でＡＤ＞０である場合は、ステップ２９６で変数ＮおよびＭとして読み出されるランク値ＮＯｎ（ＡＤ）および次アドレスＮＸｎ（ＡＤ）は、層ｎとも関係する。ステップ２９６の後、ステップ２９７でフィルタリング・ファンクションＦＩＬＴを呼び出してから、ステップ２８５でＡＤをＭで置換する。
【０２７５】
このファンクションＦＩＬＴの流れ図を図４８に示す。ステップ５００で実行を開始した時に入力されたその引数は（図４７〜図４８で暗黙的な属性名およびマクロワード・レベル以外に）、以下の通りである。
−  図４１のステップ２４２で呼び出したファンクションＦＮＯＤＥの第１の引数に対応する第１のコード化層索引ｋ；
−  図４７のステップ２９７でファンクションＦＩＬＴを呼び出した場合に、ｋ’＝ｎである、第２のコード化層索引ｋ’＞ｋ；
−  ｋ’−ｋビットマップ・ベクトルＲｅｓｋ＋１，Ｒｅｓｋ＋２，・・・，Ｒｅｓｋ、ここで、Ｒｅｓｋ＋１は層ｋ＋１の問合せ結果Ｒｅｓである。ｋ’＞ｋ＋１の場合、Ｒｅｓｋ＋２，・・・，Ｒｅｓｋは、図４１のステップ２４３で上位層にてＲｅｓを符号化して取得されたビットマップ・ベクトルである；
−  層ｋ’のランクＮで、図４７のステップ２９７でファンクションＦＩＬＴを呼び出した場合はＮ＝ＮＯｎ（ＡＤ）である；
−  層ｋ’のデータ・コンテナにあり、対応するレコード・アドレスＡＤ；および
−  計算中のビットマップ・ベクトルＷＺである。
【０２７６】
テスト５０１では、ビットマップ・ベクトルＲｅｓｋ’の（Ｎ＋１）番目のセグメントがゼロになっているだけか判断する。イエスの場合は、層ｋ’のランクＮに関するコード化データをさらに読み出す必要はなく、したがってステップ５０２でビットマップ・ベクトルＷＺを戻して、ファンクションが終了する。
【０２７７】
テスト５０１でセグメントＲｅｓｋ’［Ｎ］が少なくとも１つの「１」を有する場合は、ステップ５０３でビットマップ・セグメントＨＰｋ’（ＡＤ）をセグメント変数Ｈとして読み出し、テスト５０４で交差セグメントＨ  ＡＮＤ  Ｒｅｓｋ’［Ｎ］を評価する。この交差セグメントがゼロになっているだけの場合は、同様にコード化データをさらに読み出すのは無駄であり、プログラムは直接ステップ５０２へと進む。
【０２７８】
テスト５０４でセグメントＨＡＮＤ  Ｒｅｓｋ’［Ｎ］が少なくとも１つの「１」を有していると判明した場合は、下位層のレコード・チェーンへと入る必要がある。ステップ５０５でその頭部アドレスＦ（ｋ’−１）（ＡＤ）を変数ＡＤ’として読み出し、その一方でランクｋ’の剰余Ｒを０に初期化し、層ｋ’−１のランクＮ’をＮ×Ｄｋ’に初期化する。ビットＨ（Ｒ）を連続的に検査するループ（テスト５０６）でビットマップ・セグメントＨ＝ＨＰｋ’（ＡＤ）を走査し、ランクＮ’＝Ｎ×Ｄｋ’＋Ｒを考慮すべきか確認する。Ｈ（Ｒ）＝０の場合は、ランクＮ’が現シソーラス項目の層ｋ’のコード化データに入っていないので、これは無視される。すなわち、ステップ５０７でＲを１ユニットだけ増加させ、新しいＲがそれでもＤｋ’より小さい場合（テスト５０８）は、ステップ５０９でＮ’も１ユニットだけ増加させてから、テスト５０６から次の反復へと進む。
【０２７９】
テスト５０６でＨ（Ｒ）＝１である場合は、テスト５１０でベクトルＲｅｓｋ’の（Ｎ’＋１）番目のビットを検査し、層ｋ’−１のランクＮ’を、上位層の処理でフィルタリングして除去されているか判断する。除去されている場合（Ｒｅｓｋ’（Ｎ’）＝０）、プログラムは、ステップ５１１でＡＤ’をＮＸ（ｋ’−１）（ＡＤ’）で置換することにより、層ｋ’−１のレコード・チェーンの次位置にジャンプする。ステップ５１１の後、プログラムは上述したステップ５０７へと進む。
【０２８０】
テスト５１０でＲｅｓｋ’（Ｎ’）＝１である場合、処理は、コード化層ｋ’がｋのすぐ上か否か（テスト５１２）によって決定される。ｋ’＝ｋ＋１の場合は、ビットマップ・セグメントＨＰｋ（ＡＤ’）を読み出して（ステップ５１３）、ビットごとにブールＯＲ演算でビットマップ・ベクトルＷＺのセグメントＷＺ［Ｎ’］に重畳させる（ステップ５１４）。テスト５１２でｋ’＞ｋ＋１である場合は、ステップ５１５にて引数ｋ、ｋ’−１、Ｒｅｓｋ＋１，・・・，Ｒｅｓｋ’−１、Ｎ’、ＡＤ’およびＷＺで再帰的ファンクションＦＩＬＴを呼び出す。ステップ５１４または５１５の後、プログラムは上述したステップ５１１へと進む。
【０２８１】
テスト５０８でＲ＝Ｄｋ’になったら、ビットマップ・セグメントＨ＝ＨＰｋ’（ＡＤ）の走査は終了である。次に、ステップ５０２で更新したビットマップ・ベクトルＷＺを戻す。
【０２８２】
コード化データ・コンテナを図３４Ｃ〜図３４Ｄで示すように構成すると、ループ５０５から５０９の層ｋ’ビットマップ・セグメントの走査が、層ｋ’−１のコード化データ・コンテナのレコード・チェーンにある層ｋ’の剰余の走査で置換される。
【０２８３】
図４７〜図４８の手順は、下位層のレコード・チェーンが厳密に必要な場合しかアクセスされないという利点を有する。特に、図４５のループ２８２から２８５は、現シソーラス項目に関する全ての層ｋランクを読み出す必要がある（ステップ２９０）が、ｋ＋１の処理から一部のランクが無視される（テスト２９１でＲｅｓ（Ｎ）＝０）ことが既に知られていることが分かる。図４７〜図４８でこれが生じると、ハード・ドライブでランクＮを読み出さない（記憶もしない）。この利点が非常に重要であるのは、下位層、特に層１が最大のコード化データ・コンテナを有し、したがって多くの無駄な読み出し作業が回避されるからである。
【０２８４】
図４６によるランク・テーブルＴＮＯの使用は、図４７〜図４８の手順と非常に互換性があることが分かる。図４６の第１のループ２８０から２８７は、単に図４７のそれと置換され、図４８のステップ５１３から５１４は、Ｎ’をＴＮＯ（ＡＤ’）に書き込むことで置換される。
【０２８５】
図４３〜図４７のループは、シソーラスのＢＥＴＷＥＥＮ範囲を対象とするばかりでなく、同じデータ・コンテナに記憶されたコード化データを有し、ＯＲタイプの演算と組み合わされるワードおよび／またはマクロワードも対象とすることが分かる。ｘ＝ｘ１からｘ＝ｘ２までループを実行する代わりに、このようなワードまたはマクロワードそれぞれで反復を実行する。
【０２８６】
例えば、任意の属性のワードおよびマクロワード・シソーラスが同じデータ・コンテナを共用している場合、ループは、属性の全ての関連値、すなわち、図３６の段階１９１で問合せ木の対応するノードと置換された部分木で、１回しか実行しなくてよい。
【０２８７】
また、このようなワードおよび／またはマクロワードが異なるシソーラスに属する可能性がある（問合せ木のＯＲノードの適切なラベリングを必要とする）。例えば、問合せが、特定の顧客が遭遇した事故、または所定の値を上回る損害賠償金額を有する事故を目的とし、顧客および事故金額シソーラスが（図３１〜図３２のように）同じデータ・コンテナを共用している場合は、図４６の同じ第１のループ内で顧客および事故金額属性を検査し、ＴＮＯテーブルを１回だけ走査して、関連する全てのＨＰ１セグメントを検索することができる。
【０２８８】
しかし、前述したようにシソーラスおよびマクロワード・レベルごとに１つのデータ・コンテナを有することが好ましい。その利点は、図４６の手順で使用するランク・テーブルＴＮＯのサイズを減少させることである。
【０２８９】
拡張した問合せ木の葉を符号化する場合は、シソーラス行ＩＤｘではなくワード索引ＡＴ＿Ｐ（ｑ）＿ＷＩ（ｘ）の使用が可能であることも分かる。次に、拡張した問合せ木の葉ごとにワード索引のリストを符号化する。したがって、木の拡張手順１９１は、シソーラス・ワード索引ファイルに関連して実行されるが、段階１９２の処理では使用されず、これはワード索引によってアドレス指定されたレコード・チェーンの頭部を直接呼び出す。これは、（図２５〜図２７とは異なり）ワード索引がシソーラスの行ＩＤと一致していない場合に有用であり、これはデータベースが生きているので、普通に生じることである。
【０２９０】
図１７のように、シソーラス・ワードごとに別個のコード化データ・ファイルを使用する好ましいケースでは、ステップ２６４の層ｎの処理が、図４４に示す処理と同様である。ループは、共通のデータ・コンテナ内で（ループ索引ＡＤで）実行されるのではなく、個々のコード化データ・ファイルＡＴ＿Ｐ（ｑ）＿Ｗ＿ＮＯｋおよびＡＴ＿Ｐ（ｑ）＿Ｗ＿ＨＰｋで（図３３のようにループ索引ｉで）実行される。シソーラスをソートせずに、最適なディスク・アクセスが確保される。ステップ２６５の層ｋ＜ｎ処理は、図４６と異なり、２つのループを必要としない。図４９の通りでよい。
【０２９１】
図４９に示す手順の第１のステップ３１０は、現シソーラスにあるランクｘのワードの値ＡＴ＿Ｐ（ｑ）（ｘ）をワード変数Ｗに割り当て、ループ索引ｉを起動してゼロにすることにある。ｉが、シソーラスＡＴ、マクロワード・レベルｑおよびワードＷに関するコード化データ・ファイルにある層ｋレコードの総数ｉｍａｘ（ＡＴ、ｑ、Ｗ、ｋ）より小さい限り（テスト３１１）、ステップ３１２から３１５を実行する。ステップ３１２では、ランクＡＴ＿Ｐ（ｑ）＿Ｗ＿ＮＯｋ（ｉ）を整数変数Ｎに割り当てる。これらのランク・データをブロックごとに読み出して、ディスク・アクセスを最少にする。その後のテスト３１３で、層ｋ＋１の結果ビットマップＲｅｓのビットＲｅｓ（Ｎ）を評価する。Ｒｅｓ（Ｎ）＝１である場合は、ステップ３１４でビットマップ・セグメントＡＴ＿Ｐ（ｑ）＿Ｗ＿ＨＰｋ（ｉ）を読み出し、ステップ３１５でブールＯＲ演算によってビットマップ・ベクトルＷＺのセグメントＷＺ［Ｎ］に重畳させ、それによってＡＴ＿Ｐ（ｑ）＿Ｗ＿ＨＰｋ（ｉ）に「１」があれば、それを対応する位置でＷＺ［Ｎ］に書き込み、ＡＴ＿Ｐ（ｑ）＿Ｗ＿ＨＰｋ（ｉ）に「０」があれば、ＷＺ［Ｎ］の対応するビットを元のままにしておく。ビットマップ・セグメント・データＡＴ＿Ｐ（ｑ）＿Ｗ＿ＨＰｋ（ｉ）は、ブロックごとにも読み出す。ステップ３１５の後、またはテスト３１３でＲｅｓ（Ｎ）＝０の場合に実行されるステップ３１６では、ループ索引ｉを１ユニットだけ増加させてから、テスト３１１へと戻る。関連するコード化データを完全に検査したら（テスト３１１でｉ＝ｉｍａｘ（ＡＴ、ｑ、Ｗ，ｋ））、現ワードｘがＢＥＴＷＥＥＮ範囲の最終ワードｘ２であるか判断する（テスト３１７）。ｘ＜ｘ２の場合は、ステップ３１８でシソーラス・ポインタｘを１ユニットだけ増加させてから、ループの次の反復のため、ステップ３１０へと戻る。テスト３１７でｘ＝ｘ２であれば、ループが終了している。
【０２９２】
図５０は、図２５〜図２７の右部分で示すように、シソーラス指標レジスタでフラットファイル行ＩＤリストのコード化フォーマットが指定されているケースで、（テスト２５２がポジティブの場合に）図４２の葉処理を実行する代替方法を示す。
【０２９３】
初期化ステップ２６０Ａは図４２のステップ２６０と同様であるが、ランク・テーブルＴＮＯが同時にデフォルト値に初期化される。ステップ２８０Ａでは、ＡＴレベルｑシソーラス指標レジスタからワード索引ＷＩ＝ＡＴ＿Ｐ（ｑ）＿ＷＩ（ｘ）および対応するフォーマットＦ＝ＡＴ＿Ｐ（ｑ）＿ＦＯＲＭＡＴ（ｘ）を読み出す。Ｆが「低密度」を指定している場合（テスト２６１Ａ）は、図４３で示したループ２７１から２７６をステップ２６２Ａで実行する。そうでない（Ｆがｎコード化層で「通常密度」を指定する）場合は、ステップ２８１Ａで頭部アドレスＡＤ＝ＡＴ＿Ｐ（ｑ）＿Ｆｋ（ＷＩ）を読み出して、レコード・チェーンの走査を開始する。第１のコード化層ｋ＝ｎ（テスト２６３Ａ）で作業中の場合は、図４４で示したループ２８２から２８５をステップ２６４Ａで実行する。それ以外では、図４６の第１のループ２８２から２８５をステップ２６５Ａで実行する。ステップ２６２Ａ、２６４Ａまたは２６５Ａの後、テスト２８６Ａで現シソーラス・ポインタｘをＢＥＴＷＥＥＮ範囲の上限ｘ２と比較し、ステップ２８７０Ａで増加させてから、ｘ＜ｘ２である場合はステップ２８０Ａへと戻る。テスト２８６Ａでｘ＝ｘ２である場合は、図４２のステップ２６６で戻されたビットマップ・ベクトルＷＺを完成するために、ステップ３０１ＡでテーブルＴＮＯを利用し、これは図４６の第２のループ３０１〜３０６と同じである。
【０２９４】
問合せの出力
ＳＱＬ問合せは、さらに、問合せ基準に一致したデータを応答内で表す方法を指定する。したがって、問合せ処理の次の段階１９３（図３６）は、段階１９４で表示するための結果の準備である。
【０２９５】
通常、問合せは、表示する応答に含めねばならない値を有する属性のリストを定義する（ＳＱＬ問合せの「ＳＥＬＥＣＴ」および「ＦＲＯＭ」文節で、ＦＲＯＭが関連するデータ・テーブルを指定し、ＳＥＬＥＣＴがそのテーブルの関連列を指定する）。
【０２９６】
図９に示すタイプのリンク・テーブルを記憶する場合、リストされた属性に対応するそのリンク・テーブルの列を、一致する行で読み出し、関連するデータ・テーブルを指示するリンクを取得するため、図４１のステップ２４６でビットマップ・ベクトルＲｅｓ出力で識別する。
【０２９７】
もう１つの可能な方法は、このような属性に関するシソーラスを走査し、結果ビットマップ・ベクトルＲｅｓとシソーラスの符号化した各ビットマップ・ベクトルとの間でビットごとにブールＡＮＤを計算する。これらのベクトル間にヒットがある（ＡＮＤ出力ベクトルに「１」がある）ごとに、対応するシソーラス・ワードが表示されるか他の方法で処理される。これによって、リンクまたはデータ・テーブルを一切使用せずに、応答の属性値を検索することができる。
【０２９８】
ＡＮＤ演算は、層１で直接実行することができる。これは、ｋ＝ｎからｋ＝１まで層索引を減少させることにより、前述したように実行することもできる。それには、層１のビットマップ・ベクトルＲｅｓから計算できる層ｋの結果が必要である。後者の選択肢は、多層ＶＤＧ圧縮方式を利用することによりディスク・アクセスを最適化する。
【０２９９】
このような走査は、マクロワード・シソーラスを利用することにより加速してもよい。属性の最高レベル・シソーラスを最初に走査し、マクロワードでヒットが観察された場合のみ、所与のマクロワードでカバーされた下位レベル・シソーラスを走査する。
【０３００】
図５１は、対応するマクロワードおよび／またはワード・シソーラスを走査することにより、所与の属性ＡＴに応答して含むべき値にアクセスするのに適した手順を示し、これはマクロワード・グルーピングおよびＶＤＧ圧縮方式の両方を十分に利用する。
【０３０１】
前述したように、属性ＡＴは、個々の接頭語長Ｐ（ｑ）を有し、Ｐ（０）＞Ｐ（１）＞・・・＞Ｐ（Ｑ）であるレベル・パラメータｑ（０≦ｑ≦Ｑ）で索引付けされたＱ＋１≧１個のシソーラスを有し、レベル・パラメータｑ＝０が個々のワード・シソーラスを指定し、その接頭語長が、属性のワード長に対応するものとする。図４５の表記では、以下の通りになる。
−  ＱＡは、問合せの結果に予想される正確さを示す０≦ＱＡ≦Ｑの整数であり、ＱＡは、正確さを最大にするには０に設定する。
−  シソーラス・ポインタｘｑは、レベルｑのＡＴシソーラス指標レジスタにある行ＩＤである。
−  ｑ≧ＱＡの場合、ＷＺ１ｑは、問合せ基準に一致し、レベルｑのシソーラス・ワードｘｑに関して検査すべきデータ・グラフ識別子の層ｑの目標リストを表すビットマップ・ベクトルである。初期化ステップ３２０では、図４１のステップ２４６で出力される結果ビットマップ・ベクトルＲｅｓをベクトルＷＺ１Ｑに割り当て、これは問合せ基準に一致するフラットファイル行ＩＤを表す。
−  ｋ＞１の場合、ＷＺｋｑはビットマップ・ベクトルを指定し、ここでランクＮの各ビット（すなわち、（Ｎ＋１）番目のビット）は、ＶＤＧ圧縮方式（０≦ｑ≦Ｑ）に従って、ＷＺ（ｋ−１）ｑのＤ（ｋ−１）ビットの（Ｎ＋１）番目のセグメントが少なくとも１つの「１」を含むか示す。ＷＺｋｑは、ＱＡ≦ｑ≦Ｑおよび１≦ｋ≦ｎの場合に層ｋおよびレベルｑフィルタリング・リストと呼ばれる。作業ゾーンは、ハード・ドライブに記憶する必要があるビットマップ・ベクトルＷＺｋｑを含むため、ＲＡＭ１０３に確保される。
【０３０２】
初期化ステップ３２０では、最高レベル・シソーラスの走査を開始するため、索引ｑおよびｘＱをｑ＝ＱおよびｘＱ＝０に設定する。変換ステップ３２１では、ビットマップ・ベクトルＷＺ１ｑを処理して、対応する上位層ベクトルＷＺｋＱ（１＜ｋ≦ｎ）を提供する。
【０３０３】
コード化層索引ｋをステップ３２２でｎに設定し、ファンクションＦＩＮＴＥＲを呼び出して（ステップ３２３）、シソーラス項目ｘｑの層ｋコード化データで表示された整数リストとビットマップ・ベクトルＷＺｋｑで表示されたフィルタリング・リストとの間の交差を判断する。このファンクションへの入力は、コード化層索引ｋ、（マクロ）ワード・シソーラス・レベルｑ、（マクロ）ワード索引ｘ＝ｘｑ、およびビットマップ・ベクトルＷＺ＝ＷＺｋｑを備える。その出力は、同じ次元を有し、整数リスト交差を表すＷＸと表記された別のビットマップ・ベクトルである。
【０３０４】
ステップ３２３で呼び出したファンクションＦＩＮＴＥＲが出力したビットマップ・ベクトルＷＸをステップ３２４でテストして、そのビットの少なくとも１つが「１」であるか判断する。ノーの場合は、ｘｑによって指示された（マクロ）ワードが、その問合せに関連する属性値をまったくカバーしないので、ステップ３２５でシソーラス・ポインタｘｑを１ユニットだけ増加させて、プログラムはステップ３２２へと戻り、レベルｑシソーラスの次の（マクロ）ワードを検査する。
【０３０５】
ビットマップ・ベクトルＷＸが少なくとも１つの「１」を有し、ｋ＞１であれば（その後のテスト３２６）、ステップ３２７で層索引ｋを１ユニットだけ減少させる。次にステップ３２３から次の層処理を開始する。
【０３０６】
テスト３２６でｋ＝１の場合は、ＷＸ≠０が、フラットファイル行ＩＤのリストのビットマップ表示であり、これは結果ビットマップ・ベクトルＲｅｓと現（マクロ）ワードｘｑのコード化データとの両方で表される。
【０３０７】
ｑ＞ＱＡの場合（テスト３３０）は、ステップ３３１でこのビットマップ・ベクトルＷＸをＷＺ１ｑ−１として保存する。次に、下位レベル・シソーラスにあるマクロワードｘｑの第１の「子」の行ＩＤ、ＡＴ＿Ｐ（ｑ）＿ＦＷ（ｘｑ）をレベルｑシソーラスで読み出し、シソーラス・ポインタｘｑ−１の開始値として割り当てる（ステップ３３２）。次に、ステップ３３３でシソーラス・レベルｑを１ユニットだけ減少させ、ステップ３２１から下位レベル処理を開始する。
【０３０８】
テスト３３０でｑ＝ＱＡの場合は、ｘＱＡによって指示されたワード（ＱＡ＝０の場合）またはｘＱＡによって指示されたマクロワードがカバーするワード（ＱＡ＞０の場合）が、問合せ基準に一致するデータ・グラフの属性値である。ステップ３３５で、このワードまたはそのシソーラス・ポインタｘＱＡおよび対応するビットマップ・ベクトルＷＸに基づいて、特定の措置を執る。後者のベクトル識別子は、ＡＴ列に（マクロ）ワードｘＱＡを含み、問合せ基準を満足するフラットファイルの行を識別する。措置のタイプは、ＳＱＬ問合せによって決定される。可能な様々な方法について、さらに説明する。
【０３０９】
ステップ３３５の後、行為レベル・ビットマップ・ベクトルＷＺ１ｑを更新して、ＷＸと同じ位置に「１」があれば、それを除去する。このような「１」は、ｘＱＡによって指示されたワードを有するデータ・グラフ（ＱＡ＝１の場合）、またはｘＱＡによって指示されたマクロワードがカバーするワード（ＱＡ＞０の場合）を属性ＡＴの値として表し、したがってこれにヒットする他のワードはないので、除去することができる。更新を初期化するには、ステップ３３６で索引ｑをＱと等しくする。ステップ３３７で、ブール演算ＷＺ１ｑ  ＡＮＤ  ＮＯＴ  ＷＸをビットごとに実行すると、結果は更新済みのＷＺ１ｑになる。結果のビットマップ・ベクトルＷＺ１ｑに少なくとも１つの「１」が残っていたら（テスト３３８）、ステップ３３９でシソーラス・レベル索引ｑを１ユニットだけ減少させ、ステップ３３７を繰り返す。
【０３１０】
ＷＺ１ｑがテスト３３８でゼロのみで構成されている場合は、下位レベルで更新を継続する必要がない。ｑ＜Ｑなら（テスト３４０）、ｘｑによって指示された（マクロ）ワードが、その問合せに関連する属性値をもうカバーしていない。したがってステップ３４１でシソーラス・ポインタｘｑを増加させ、プログラムはステップ３２１へと戻り、レベルｑシソーラスの次の（マクロ）ワードを検査する。
【０３１１】
テスト３４０でｑ＝Ｑになると、属性ＡＴのシソーラスの走査が終了する。
【０３１２】
ステップ３２３で呼び出されたファンクションＦＩＮＴＥＲは、シソーラスを図２５〜図３２で示したように記憶してある場合、図５２に示した流れ図に従ってもよい。これはステップ３５０で上述した入力引数ｋ、ｑ、ｘ（＝ｘｑ）およびＷＺ（＝ＷＺｋｑ）をロードして開始する。ステップ３５１で、ビットマップ・ベクトルＷＸをゼロで初期化する。プログラムは最初にステップ３５２でワード索引ＷＩ＝ＡＴ＿Ｐ（ｑ）＿ＷＩ（ｘ）を取得し、次にステップ３５３で頭部アドレスＡＤ＝ＡＴ＿Ｐ（ｑ）＿Ｆｋ（ＷＩ）を取得して、データ・コンテナにある関連レコード・チェーンの走査を開始する。
【０３１３】
属性ＡＴのレベルｑシソーラス項目が、「低密度」フォーマットで記憶されている場合（テスト３５４）、処理は、図５３に関して以下で説明するようになり（ステップ３５５）、交差ベクトルＷＸを取得する。フォーマットが「通常密度」である場合、処理は、プログラムが第１の層にあるか、すなわち、ｋ＝ｎであるかによって（テスト３５６）決定される。図５４の処理は、ｋ＝ｎである場合（ステップ３５７）に当てはまり、ｋ＜ｎの場合は図５５の処理が当てはまる（ステップ３５８）。ステップ３５５、３５７または３５８の後、ファンクションＦＩＮＴＥＲの実行は、ステップ３５９でビットマップ・ベクトルＷＸを戻して終了する。
【０３１４】
図５３の低密度処理は、テスト３６０でアドレスＡＤをチェーン終了値（０）と比較することによって各反復を開始するループを有する。ＡＤ＞０の場合は、レコード・チェーンに検査すべき項目が少なくとも１つ残っているので、ステップ３６１でフラットファイル行ＩＤ値ＮＯ（ＡＤ）および次アドレスＮＸ（ＡＤ）を変数ＮおよびＭとして読み出す。ステップ３６２でΔｋによるＮのユークリッド除法を実行し、層ｋ−１の商（ランク）Ｎ’を取得する。その後のテスト３６３でＷＺ（Ｎ’）＝１である場合は、ビットマップ・ベクトルＷＸのビットＷＸ（Ｎ’）に「１」を書き込む（ステップ３６４）。ステップ３６４の後、またはテスト３６３でＷＺ（Ｎ’）＝０の場合は、ステップ３６５でＡＤを変数Ｍで置換してから、テスト３６０へと戻る。レコード・チェーンを完全に検査したら（テスト３６０でＡＤ＝０）、現（マクロ）ワードの低密度処理が終了し、プログラムは図５２のステップ３５９へと進む。
【０３１５】
図５４の層ｎの通常密度処理は、各反復がステップ３７０でアドレスＡＤをチェーン終了値（０）と比較することにより開始する同様のループを有する。ＡＤ＞０の場合は、ステップ３７１で層ｎのランク値ＮＯｎ（ＡＤ）および次アドレスＮＸｎ（ＡＤ）をそれぞれ変数ＮおよびＭとして読み出す。ビットマップ・ベクトルＷＺのランクＮのセグメントが少なくとも１つの「１」を有する（その後のテスト３７２でＷＺ［Ｎ］≠０）場合は、ビットマップ・セグメントＨＰｎ（ＡＤ）を読み出し（ステップ３７３）、ビットごとのブールＡＮＤ演算でビットマップ・セグメントＷＺ［Ｎ］と組み合わせて、ビットマップ・ベクトルＷＸのセグメントＷＸ［Ｎ］を提供する（ステップ３７４）。ステップ３７４の後、またはテスト３７２でＷＺ［Ｎ］＝０の場合は、ステップ３７５でＡＤを変数Ｍで置換してから、テスト３７０へと戻る。レコード・チェーンを完全に検査したら（テスト３７０でＡＤ＝０）、現（マクロ）ワードの層ｎの通常密度処理が終了し、プログラムは図５２のステップ３５９へと進む。
【０３１６】
層ｋ＜ｎの通常密度処理は、２つの連続ループ（図５５）で実行すると有利である。第１のループは、一時的ランク・テーブルＴＮＯを決定するためのものであり、これは図４６に関して前述した手順と同様に、第２のループのビットマップ・セグメントを取り扱うために使用される。テーブルＴＮＯは幾つかのアドレスを有し、これは少なくとも、現シソーラス（ＡＴ、ｑ）の層ｋのコード化データが記憶されているデータ・コンテナのアドレスＡＤｍａｘと等しい。ランク・テーブルＴＮＯのアドレスＡＤの各項目ＴＮＯ（ＡＤ）は、ビットマップ・セグメントＨＰｋ（ＡＤ）にアクセスするのに有用な場合はランクＮＯｋ（ＡＤ）を表す整数、それ以外の場合はデフォルト値（−１）を含むためのものである。このようなアクセスは、ＮＯｋ（ＡＤ）が、現（マクロ）ワードｘｑ’に関連付けられた層ｋのランク・リストに属していない場合、またはビットマップ・ベクトルＷＺ＝ＷＺｋｑ＋１のランクＮＯｋ（ＡＤ）のセグメントにゼロしかない場合は無駄である。
【０３１７】
初期化ステップ３８０では、ランク・テーブルＴＮＯの全項目をデフォルト値−１に設定する。第１のループの各反復は、ステップ３８１で、アドレスＡＤをチェーン終了値（０）と比較して開始する。ＡＤ＞０の場合は、ステップ３８２で層ｋのランク値ＮＯｋ（ＡＤ）および次アドレスＮＸｋ（ＡＤ）をそれぞれ変数ＮおよびＭとして読み出す。テスト３８３で、ビットマップ・ベクトルＷＺのランクＮのセグメントＷＺ［Ｎ］を検査する。そのセグメントＷＺ［Ｎ］が少なくとも１つの「１」を有する（テスト３８３でＷＺ［Ｎ］≠０）の場合は、ステップ３８４でランクＮをアドレスＡＤにてテーブルＴＮＯに書き込んでから、ステップ３８５でＡＤをＭで置換し、テスト３８１へと戻って、チェーンの次レコードを検査する。それ以外（ＷＺ［Ｎ］＝０）の場合は、ステップ３８５へと直接ジャンプして、ランクＮをフィルタリングして除去する。
【０３１８】
レコード・チェーンを完全に検査したら（テスト３８１でＡＤ＝０）、第１のループの終了である。次にプログラムは第２のループ３８６〜３９１へと進む。第２のループの各反復では、ステップ３８６でＡＤを増加させた後にステップ３８７で読み出したアドレスＡＤでのランク・テーブルＴＮＯの内容Ｎを、テスト３８８でデフォルト値と比較する。Ｎが有効ランク値（≠−１）なら、ビットマップ・セグメントＨＰｋ（ＡＤ）を読み出して（ステップ３８９）、ビットごとのブールＡＮＤ演算でビットマップ・セグメントＷＺ［Ｎ］を結合し、ビットマップ・ベクトルＷＸのランクＮのセグメントＷＸ［Ｎ］を提供する（ステップ３９０）。ＡＤ＜ＡＤｍａｘである場合（テスト３９１）は、次の反復の開始時にステップ３８６でランク・テーブル・アドレスＡＤを１ユニットだけ増加させる。テスト３９１でＡＤ＝ＡＤｍａｘであると第２のループが終了し、プログラムは図５２のステップ３５９へと進む。
【０３１９】
図５１〜図５５に関して説明したようなシソーラスの走査は、以下のように幾つかの重大な利点を有する。
−  元のデータ・テーブルにアクセスする必要がない。したがって、メモリにデータ・テーブルを維持することが強制されない。記憶してある場合でも、ＯＤＢＣなどの比較的低いソフトウェア・インタフェースでアクセス可能であることが多い。走査方法は、このインタフェースを迂回すると有利である。
−  コード化データ・コンテナのレコード・グルーピングを利用するので、ディスク・アクセスの面で非常に効率的である。図５３〜図５５の手順は、それぞれディスク・アクセスに関する図４３、図４４および図４６と同様であり、この点で上述した利点を提供する。
−  図５１の手順も、ビットマップ・ベクトルＷＺ１ｑの更新（ループ３３６〜３３９）によって達成されるフィルタリングのせいで、非常に効率的である。このフィルタリングは、各フラットファイル行が属性ごとに一意の値（場合によっては空）を有することを利用する。最下層でヒットがないようなその後のシソーラス・ワードおよびマクロワードに属するコード化データを読み出すための大量の無駄な作業（何故なら、上位層でのヒットは、既に考察したシソーラス・ワードに対応するフラットファイル行ＩＤによるものだからである）を回避する。
【０３２０】
図５６は、コード化データ・コンテナを図２５〜図３０および図３４Ａ〜図３４Ｂで示すように記憶した場合に、図５１の手順を適用する方法を示す。上述したファンクションＦＩＮＴＥＲを、図５７で示した再帰的ファンクションＦＦＩＬＴで置換する。したがって、図５２のように（ｋ＝ｎで）ステップ３５１から３５３を実行した後、ループ３２２から３２７をループ５９０から５９３で置換する。結果の交差ビットマップＷＸがゼロのみで構成されている場合（テスト３２４）は、ステップ３２５でｘｑを増加させてから、現レベルｑのシソーラス範囲の次（マクロ）ワードのために、ステップ３５１へと戻る。ＷＸがテスト３２４で少なくとも１つの「１」を有する場合は、前述したようにプログラムがステップ３３０へと進む。それ以外では、図５６の手順が図５１の手順と同じになる。
【０３２１】
ループ５９０から５９３の各反復は、テスト５９０でアドレスＡＤをチェーン終了値（０）と比較して開始する。ＡＤ＞０の場合は、ステップ５９１で層ｎのランク値ＮＯｎ（ＡＤ）および次アドレスＮＸｎ（ＡＤ）をそれぞれ変数ＮおよびＭとして読み出す。その後、フィルタリングおよび交差ファンクションＦＦＩＬＴをステップ５９２で呼び出してから、ステップ５９３でＡＤをＭで置換する。層ｎのレコード・チェーンを完全に検査したら（テスト５９０でＡＤ＝０）、現（マクロ）ワードの交差リストＷＸの計算は終了であり、プログラムは上述したようにテスト３２４へと進む。
【０３２２】
このファンクションＦＦＩＬＴの流れ図を図５７に示す。ステップ６００で実行を開始する時に入力するその引数は、以下の通りである。
−  図５６のステップ５９２でファンクションＦＦＩＬＴを読み出した場合、コード化層索引ｋで、ｋ＝ｎ。
−  図５６のステップ３２１で取得した通りのｋ個のビットマップ・ベクトルＷＺ１ｑ，ＷＺ２ｑ，・・・，ＷＺｋｑ。
−  図５６のステップ５９２でファンクションＦＦＩＬＴを読み出した場合、層ｋのランクＮでＮ＝ＮＯｎ（ＡＤ）。
−  層ｋデータ・コンテナの対応するレコード・アドレスＡＤ。
−  計算中の交差ビットマップＷＸ。
【０３２３】
テスト６０１で、ビットマップ・ベクトルＷＺｋｑのランクＮのセグメントがゼロのみで構成されているか判断する。イエスの場合は、層ｋのランクＮに関するコード化データをさらに読み出す必要はなく、したがってステップ６０２でビットマップ・ベクトルＷＸを戻して、ファンクションの実行が終了する。
【０３２４】
テスト６０１でセグメントＷＺｋｑ［Ｎ］が少なくとも１つの「１」を有する場合は、ステップ６０３でビットマップ・セグメントＨＰｋ（ＡＤ）をセグメント変数Ｈとして読み出し、テスト６０４で交差セグメントＨ  ＡＮＤ  ＷＺｋｑ［Ｎ］を評価する。この交差セグメントがゼロになっているだけの場合は、同様にコード化データをさらに読み出すのは無駄であり、プログラムは直接ステップ６０２へと進む。
【０３２５】
テスト６０４でＨ  ＡＮＤ  ＷＺｋｑ［Ｎ］が少なくとも１つの「１」を有していると判明した場合は、下位層のレコード・チェーンへと入る必要がある。ステップ６０５でその頭部アドレスＦ（ｋ−１）（ＡＤ）を変数ＡＤ’として読み出し、その一方でランクｋの剰余Ｒを０に初期化し、層ｋ−１のランクＮ’をＮ×Ｄｋに初期化する。ビットＨ（Ｒ）を連続的に検査するループ（テスト６０６）でビットマップ・セグメントＨ＝ＨＰｋ（ＡＤ）を走査し、ランクＮ’＝Ｎ×Ｄｋ＋Ｒを考慮すべきか確認する。Ｈ（Ｒ）＝０の場合は、ランクＮ’が現シソーラス項目の層ｋのコード化データに入っていないので、これは無視される。すなわち、ステップ６０７でＲを１ユニットだけ増加させ、新しいＲがそれでもＤｋより小さい場合（テスト６０８）は、ステップ６０９でＮ’も１ユニットだけ増加させてから、テスト６０６から次の反復へと進む。
【０３２６】
テスト６０６でＨ（Ｒ）＝１である場合は、テスト６１０でベクトルＷＺｋｑのランクＮ’のビットを検査し、層ｋ−１のランクＮ’が結果リストに入っているか判断する。（ＷＺｋｑ（Ｎ’）＝０）でない場合、プログラムは、ステップ６１１でＡＤ’を次アドレスＮＸ（ｋ−１）（ＡＤ’）で置換することにより、層ｋ−１のレコード・チェーンの次位置にジャンプする。ステップ６１１の後、プログラムは上述したステップ６０７へと進む。
【０３２７】
テスト６１０でＷＺｋｑ（Ｎ’）＝１である場合、処理は、コード化層ｋが１のすぐ上か否か（テスト６１２）によって決定される。ｋ＝２の場合は、ビットマップ・セグメントＨＰ１（ＡＤ’）を読み出して（ステップ６１３）、ビットごとにブールＡＮＤ演算でビットマップ・セグメントＷＺ１ｑ［Ｎ’］と組み合わせ、ビットマップ・ベクトルＷＸのランクＮ’のセグメントＷＸ［Ｎ’］を提供する（ステップ６１４）。テスト６１２でｋ＞２である場合は、ステップ６１５にて引数ｋ、ＷＺ１ｑ，・・・，ＷＺ（ｋ−１）ｑ、Ｎ’、ＡＤ’およびＷＸで再帰的ファンクションＦＦＩＬＴを呼び出す。ステップ６１４または６１５の後、プログラムは上述したステップ６１１へと進む。
【０３２８】
テスト６０８でＲ＝Ｄｋになったら、ビットマップ・セグメントＨ＝ＨＰｋ（ＡＤ）の走査は終了である。次に、ステップ６０２で更新したビットマップ・ベクトルＷＸを戻す。
【０３２９】
（図５５のような）層１のランク・テーブルＴＮＯの使用は、図５６〜図５７の手順と非常に互換性があることが分かる。ステップ３５１でテーブルＴＮＯのレコードをデフォルト値で初期化し、図５７のステップ６１３から６１４の代わりにＮ’をＴＮＯ（ＡＤ’）に書き込み、テスト５９０でＡＤ＝０の場合は、図５５のループ３８６から３９１でテーブルＴＮＯを走査する。
【０３３０】
図５１または図５６の手順は、記憶されているシソーラス・データが、図５８〜図６１で示すように編成したファイルを含む場合は、さらなる最適化を達成することができる。シソーラスごとに、図５８〜図６０に示したタイプのテーブルを記憶し、図６１で示すように、層ｎのランクＮＯｎで可能な各値を追加データ・コンテナのレコード・チェーン頭部アドレスＦ＿ＡＤ’と関連付ける。後者のデータ・コンテナは、図３２または図３４Ａと同じ層ｎのビットマップ・セグメント・データＨＰ’２＝ＨＰ２を含むが、リンクＮＸ’２は、同じシソーラス項目ではなく同じ層ｎランクに属するレコード・チェーンを定義する。したがって、図６１のデータ・コンテナは、ＮＯ２列に基づいて図３２または図３４Ａのそれをソートし、ＮＯ２、ＮＸ２およびＦ１列を削除して、ＮＯ２に基づいてレコード・チェーンにアドレスを含むよう列ＮＸ’２を追加し、さらにそのレコードが属するシソーラス索引ｘが書き込まれた列ＰＴＲを追加することにより取得される。ランクＮＯ２ごとに、チェーンの頭部アドレスをＦ＿ＡＤ’（ＮＯ２）に記憶させる。
【０３３１】
図５１または図５６の手順を開始する前、またはステップ３２１で反復するごとに、図６２に示した事前フィルタリング処理を適用し、その層ｎのランクが、一致するデータ・グラフ識別子リストの層ｎのコード化データにないという理由で読み出されないシソーラス項目をマークする。マーキングは、レベルｑのシソーラス・ポインタｘｑごとに１つのビットＴｑ（ｘｑ）を有するマクロワード・レベルｑのテーブルＴｑによって実行される。これらのビット、さらに層ｎのランクＮ＝ＮＯｎは、図６２のステップ６２０でゼロに初期化する。ＷＺｎｑのランクＮのセグメントがゼロのみで構成されている場合（テスト６２１）は、テスト６２２を実行して、可能な最高の層ｎのランクＮＯｎｍａｘに到達したか判断する。ノーの場合は、ステップ６２３でＮを増加させて、テスト６２１を繰り返す。テスト６２１でＷＺｎｑ［Ｎ］≠０の場合は、ステップ６２４で頭部アドレスＦ＿ＡＤ’（Ｎ）を変数ＡＤ’として読み出し、テスト６２５でチェーン終了値（０）と比較する。ＡＤ’＝０の場合は、プログラムがステップ６２２へと進む。それ以外では、ステップ６２６でビットマップ・セグメントＨＰ’ｎ（ＡＤ’）および対応する次アドレス値ＮＸ’ｎ（ＡＤ’）をそれぞれ変数Ｈ’およびＭ’として読み出す。Ｈ’およびＷＺｎｑ［Ｎ］が共通して「１」を有さない場合（テスト６２７）は、ステップ６２８でＡＤ’をＭ’で置換し、テスト６２５から次の反復を開始する。テスト６２７でＨ’およびＷＺｎｑ［Ｎ］のビットごとのブールＡＮＤ組合せで少なくとも１つの「１」がある場合は、図６１の最終列でシソーラス・ポインタｘｑ＝ＰＴＲ（ＡＤ’）を読み出し、テーブルＴｑの対応する位置に「１」を書き込んでから、ステップ６２８へと進む。
【０３３２】
その後、図６３で示すように、関連するビットマップ・ベクトルＷＸを計算したら、図５１のループ３２２から３２７は、ビットＴｑ（ｘｑ）をテストする初期フィルタリング・ステップ６４０によって完成する。このテスト６４０は、ステップ３２５でｘｑを増加した後にも実行する。テスト６４０でＴｑ（ｘｑ）＝１の場合は、前述したようにプログラムがステップ３２２へと進む。Ｔｑ（ｘｑ）＝０の場合は、直接ステップ３２５へと進み、これによって空白である交差リストＷＸの計算を回避する。
【０３３３】
図５６のステップ３５１の前に、同じフィルタリング・ステップ６４０を実行することができる。
【０３３４】
図５２〜図５５に示すファンクションＦＩＮＴＥＲは、図１７のように別個のコード化データ・ファイルを各シソーラス・ワードに使用するケースに容易に適用される。図５２のステップ３５２から３５３の代わりに、値ＡＴ＿Ｐ（ｑ）（ｘ）をワード変数Ｗに割り当て、ループ索引ｉをゼロに初期化する。ステップ３５５の低密度処理、およびステップ３５７の層ｎの通常密度処理は、図５３および図５４で示した処理と同様である。ループは、共通データ・コンテナ（ループ索引ＡＤ）では実行されないが、個々のコード化データ・ファイル（図３３のようにループ検索ｉ）では実行される。ステップ３５８の層ｋ＜ｎの処理は、図５５とは異なり、２つのループを必要としない。図６４に従ってよい。
【０３３５】
図６４に示す手順では、ループ索引ｉが、シソーラスＡＴ、マクロワード・レベルｑおよびワードＷに関するコード化データ・ファイルにある層ｋのレコードの総数ｉｍａｘ（ＡＴ，ｑ，Ｗ，ｋ）より低い限り（テスト３９４）、ステップ３９５から３９９が実行される。ステップ３９５では、ランクＡＴ＿Ｐ（ｑ）＿Ｗ＿ＮＯｋ（ｉ）を整数変数Ｎに関連付ける。その後のステップ３９６では、ビットマップ・ベクトルＷＺのランクＮのセグメントＷＺ［Ｎ］をテストする。ＷＺ［Ｎ］が少なくとも１つの「１」を有する（ＷＺ［Ｎ］≠０）場合は、ビットマップ・セグメントＡＴ＿Ｐ（ｑ）＿Ｗ＿ＨＰｋ（ｉ）を読み出し（ステップ３９７）、ビットごとのブールＡＮＤ演算でビットマップ・セグメントＷＺ［Ｎ］と組み合わせて、ビットマップ・ベクトルＷＸのランクＮのセグメントＷＸ［Ｎ］を提供する（ステップ３９８）。ステップ３９８の後、またはテスト３９６でＷＺ［Ｎ］＝０の場合に実行されるステップ３９９では、ループ索引ｉを１ユニットだけ増加させてから、テスト３９４へと戻る。関連するコード化データを完全に検査したら、すなわち、テスト３９４でｉ＝ｉｍａｘ（ＡＴ，ｑ，Ｗ，ｋ）の場合は、ループが終了である。
【０３３６】
上述した手順は、ＳＱＬ問合せの特徴に基づき、図５１または図５６のステップ３３５で異なるタイプの措置を含むことができる。
【０３３７】
比較的簡単なタイプのＳＱＬ問合せでは、１つの属性の値のリスト（例えば、特定の基準を満たす全顧客の名前）が必要である。このようなケースでは、図５１または図５６の走査が、その属性に関するシソーラスでのみ、ＱＡ＝０で実行され、ステップ３３５の措置は、単に、個々のワード・シソーラスの位置ｘ０にあるワードＡＴ（ｘ０）を読み出して（実際、コード化データが図１７に示すように記憶されていると、ワードＡＴ（ｘ０）は直前に読み出されている）、このワードＡＴ（ｘ０）を出力テーブルに書き込むか、それを印刷するだけである。このようにして生成されたワード・リストは、昇順で自動的にソートされることが分かる。反対の順序が必要な場合は、シソーラスを反対方向に走査することができる。
【０３３８】
ＳＱＬが、属性ＡＴに関するＳＥＬＥＣＴ文節にＤＩＳＴＩＮＣＴキーワードを有する場合は、ステップ３３５でワードＡＴ（ｘ０）を１回出力する。そうでない場合、またはＳＥＬＥＣＴ文節がキーワードＡＬＬを有する場合は、ステップ３３５でＷＸの非ゼロ・ビットごとにワードＡＴ（ｘ０）を１回出力することができる。この非ゼロ・ビットをカウントして、マッチングデータ・グラフ中のワードＡＴ（ｘ０）の発生数を提供することもできる。
【０３３９】
正確さを下げて属性の値が必要である場合は、ＱＡ＞０の条件で図５１または図５６に示したようにシソーラスを走査し、それによってｑ＜ＱＡのレベルｑシソーラスから関係ない詳細を取得するメモリ・アクセスを回避することができる。例えば、日付の属性を年単位で表現する必要がある場合は、４の切り捨て長に対応するレベルＱＡで、図５１または図５６の走査を停止することができる。
【０３４０】
ＳＱＬ問合せは、ＳＥＬＥＣＴおよびＦＲＯＭ文節にある幾つかの属性を必要とすることが多い。同じデータ・グラフに属する属性値間の接続を維持するため、何らかの形式の索引付けが必要である。可能な１つの方法は、ＲＡＭ１０３内に、仮想フラットファイルと尾内だけの行を有する出力テーブル、および結果リストの属性値を受ける個々の列を含むための作業ゾーンを確保することである。出力テーブルのメモリ・ロケーションを、デフォルト値で初期化する。上述した属性値ＡＴ（ｘ０）またはＱＡ＞０の場合はその接頭語ＡＴ（ｘＱＡ）を、図５１または図５６に示すステップ３３５の出現の出力テーブルに書き込む。ステップ３３５のこのような書き込み作業は、ビットマップ・ベクトルＷＸの非ゼロ・ビットで示された出力テーブルの任意の行で実行される。出力データは、最終的に、出力テーブルから空白行（まだデフォルト値を含む行）を削除することによって生成される。
【０３４１】
図６５は、このようなケースでステップ３３５を発展させ、適宜、ワードＷ＝ＡＴ（ｘＱＡ）を出力テーブルの列ＯＴ＿ＡＴに書き込む方法を示す。ステップ４００で行ポインタｊをゼロに初期化し、ワードＷを（以前に実行されていなかったら）ロードする。ビットＷＸ（ｊ）が１であるたびに（テスト４０１）、ワードＷを出力テーブルの行ｊおよび列ＡＴに書き込む（ステップ４０２）。テスト４０３で行ポインタｊを最大値ｊｍａｘと比較し、ｊ＜ｊｍａｘである場合は増加させる（ステップ４０４）。テスト４０３でｊ＝ｊｍａｘになると、プログラムはステップ３３５の措置を終了させたことになる。
【０３４２】
例４：
例３の問合せ基準を考察し、表示するよう要求された属性が事故日、顧客名、および保険日であると仮定する。図３７〜図３８に関して検討する例３では、マッチングデータ・グラフのビットマップ（図４１のステップ２４６の出力）は、図８でチェックするように、Ｒｅｓ＝１０１１００００１０００である。この例では、図６６が、前述したような出力テーブルの内容を示す。
【０３４３】
上述した出力テーブルは、ＲＡＭ１０３に都合よく確保するには大きすぎることがある。実際のデータベースでは、仮想フラットファイルの行数が比較的大きく（例えば、数百万）、（含むべき属性が多すぎるか、一部が比較的多数の文字を使用しているために）出力テーブルの１行にある文字が多すぎる場合は、出力テーブルが法外に大きくなることがある。この潜在的問題に対処するため、幾つかの解決法がある。
【０３４４】
その１つは、図６５のステップ４０２で、シソーラス行ＩＤ、ｘＱＡ（整数）を（マクロ）ワードＡＴ（ｘＱＡ）ではなく出力テーブルに書き込むことである。関連する全てのシソーラスを走査したら、空白でない出力テーブルの行を選択し、シソーラス行ＩＤから属性値を検索する。これにより、出力テーブルの列の幅が狭くなる。ワードＡＴ（ｘＱＡ）が往々にして、はるかに多くの文字を必要とするからである。
【０３４５】
図６７は、例４のケースで、このような出力テーブルの内容を示し、シソーラスは図１０Ａ〜図１０Ｇと同様にソートされる。
【０３４６】
代替的または累積的な別の解決法は、ＲＡＭ１０３の索引を使用して、整数アドレスを各データ・グラフまたはフラットファイル行ＩＤに関連付けることである。最初に、デフォルト・アドレスを全データ・グラフに関連付ける。その１つが、ステップ３３５でＷＸの対応するビットで初めて「１」で指定されたら（すなわち、第１のシソーラスを走査したら）、カウンタを増加させて取得した新しいアドレスに割り当てられる。このアドレスは、その後のシソーラスの走査時にこのデータ・グラフが再度指定されると、索引から検索される。この整数アドレスは、ＲＡＭ１０３に記憶された出力テーブルの行ＩＤであり、属性値または接頭語ＡＴ（ｘＱＡ）、またはそのシソーラス行ＩＤ、ｘＱＡが書き込まれた行の数が減少する。非空白行は連続し、したがって行の総数を大幅に減少させることができる。この圧縮した出力テーブルは、最終的に読み出されて、結果を表示する。
【０３４７】
図６８は、このような索引および出力テーブルの内容を示し、例４のケースではシソーラス行ＩＤを含む。
【０３４８】
図６９および図７０は、それぞれ第１のシソーラスおよびその後のシソーラスの走査時にステップ３３５を発展させる方法を示す。同じ参照番号で示したステップ４００、４０１、４０３、４０４は、図６５のそれと同じである。図６９では、ビットＷＸ（ｊ）が１であれば、カウンタ値ｍ（図５１または図５６のステップ３２０で０に初期化される）を行ｊの索引ＩＮＤ（ｊ）に割り当て（ステップ４１０）、シソーラス・ポインタｘＱＡ（またはワードＷ＝ＡＴ（ｘＱＡ））を出力テーブルの行ｊおよび列ＡＴに書き込み（ステップ４１１）、カウンタ値ｍを増加させる（ステップ４１２）。第１のシソーラスの走査が終了したら、ｍはマッチングデータ・グラフの数を表す。図７０では、ビットＷＸ（ｊ）が１の場合は、行ｊの索引ＩＮＤ（ｊ）をポインタｍ’として検索し（ステップ４１３）、シソーラス・ポインタｘＱＡ（またはワードＷ）を出力テーブルの行ｍ’および列ＡＴに書き込む（ステップ４１４）。
【０３４９】
出力テーブルは、ＳＱＬ問合せがＧＲＯＵＰ  ＢＹ、ＯＲＤＥＲ  ＢＹまたは同様の文節を有する場合、その列の内容に基づいて容易にソートされる。このようなソート作業は、複数の属性に関して階層的に実行することができる。出力テーブルを構築中に第１のソート基準が自動的に見たされるよう、階層中の最も重要な属性には、図５１または図５６に示すような第１のシソーラス走査を実行することが好ましい。以前の属性と共通の値を有する出力テーブルの各部分で、残りの属性に基づくソートを実行する。
【０３５０】
ソートは、出力テーブルの列が図６８のようにシソーラス行ＩＤ、ｘＱＡを含む場合、整数リストのソートしか含まないので、特に簡単である。
【０３５１】
特定の属性、特に数値フィールドでは、（リンク・テーブルがあれば）明示的属性値をリンク・テーブルに記憶できることが、以前に示されている。図６６、図６７または図６８に示すタイプの出力テーブルは、このような属性の列を有する必要がない。属性を表示するか、他の方法で調べる必要がある場合、その変数は、出力テーブルの非空白行（図６６〜図６７）または出力テーブル索引の有効ポインタ（図６８）に対応する行にある（すなわち、これと同じ行ＩＤを有する）リンク・テーブルから検索することができる。
【０３５２】
ＳＱＬ問合せでは、特にデータ・ウェアハウス用途で、マッチングデータ・レコードの属性値に関する計算も必要である。このような計算は、図６６、図６７または図６８に示すタイプの出力テーブルのデータから実行することができる。
【０３５３】
例５：
例４から、事故日と保険日間の時間差の（算術）平均値は、日数として要求し、表現すると仮定する。出力テーブルの非空白行ごとに、プログラムは第１列と第３列間の差を日数で計算する。この差を累積し、その結果を非空白行の数（４）で割って、所望の平均値を取得する。
【０３５４】
実際、この平均値は、１つだけのメモリ・ロケーションに減少させた出力テーブルで計算することができる。すなわち、事故日シソーラスを走査する場合、図５１または図５６のステップ３３５で、属性基準日からの日数として表現される属性値にＷＸの非ゼロ・ビット数を掛け、減少させた出力テーブルのメモリ・ロケーションに記憶されている累積変数Ｖ（ステップ３２０で、０に初期化）に加算する。次に、保険日シソーラスを走査する場合、ステップ３３５で、同じ基準日からの日数として表現される属性値にＷＸの非ゼロ・ビット数を掛け、ステップ３３５でＶから引く。最後に、結果のＶを結果ビットマップＲｅｓの非ゼロ・ビット数で割って、所望の平均値を提供する。
【０３５５】
しかし、ＲＡＭ１０３では、その種の計算のため、特に所望の量が属性値に対して直線でない場合（例えば、例５で算術平均ではなく二次または相乗平均値を要求する場合）、複数のメモリ・ロケーションを有する出力または計算テーブルが往々にして有用である。
【０３５６】
計算テーブルは出力テーブルの特殊なケースであり、上述した出力テーブルと同様の構造を有する。これは、（図６６〜図６７の出力テーブルのように）仮想フラットファイルと同じ数の行を有することができる。あるいは、図６８のそれと同じ索引に関連付けてもよい。１つのメモリ・ロケーションを有する出力テーブルの上記例と同様、行を１つだけ有してもよい。計算テーブルの各列は、実行すべき計算に使用するオペランドの値を含むためのものである。計算の複雑さに応じて、１つまたは複数の列が必要であるが、たいていの場合、１つの列で十分である。
【０３５７】
計算に関与する値を有する属性は、図５１または図５６に関して説明するように、そのシソーラスが連続的に走査される。ステップ３３５は、１つの列、計算テーブルＣＴが、および仮想フラットファイルと同じ数の行を有する場合、図７１に示すように展開することができる（索引がある場合は、図６９〜図７０のように取り扱うことができる）。図７１では、ステップ４００、４０１、４０３および４０４が、図６５のそれと同じである。ステップ４０１でビットＷＸ（ｊ）が１の場合は、ステップ４１６で、行ｊにある計算テーブルの内容ＣＴ（ｊ）をオペランドＹに割り当て、次にオペランドＹおよび現（マクロ）ワードＷ＝ＡＴ（ｘＱＡ）のファンクションｆを計算して、ステップ４１７で新しい内容ＣＴ（ｊ）として保存する。
【０３５８】
数学的ファンクションｆは、実行すべき計算、および走査中のシソーラスに基づいて計算する。再び例５に言及すると、事故日を最初に走査する場合、ファンクションｆ（Ｙ、Ｗ）は、フォーマットｙｙｙｙ  ｍｍ  ｄｄで表現された日付Ｗを基準日からの日数に変換することでよい（したがってＷのみのファンクションである）。保険日シソーラスを走査する場合、ファンクションｆ（Ｙ、Ｗ）は、同じ変換を日付Ｗに当てはめ、Ｙからの結果を引く。その後、ＣＴの非空白行の平均値（算術、二次、相乗）を計算して、所望の出力結果を提供する。計算テーブルの列からは、例えば、統計、会計、または実際の計算など、他の種類の包括的計算を実行することができる。
【０３５９】
所望の正確さが、関係する属性のうち少なくとも１つの個別ワードによって可能な正確さより低い場合は、このタイプの計算にマクロワードを使用すると有利である。
【０３６０】
仮想フラットファイルの区分
大型システムの場合は、仮想フラットファイルを、それぞれが所定数の行で構成された幾つかの部分またはブロックに区分すると、往々にして有利である。データ・グラフを、その識別子（フラットファイル行ＩＤ）に基づいてブロックに分散する。
【０３６１】
各シソーラスは、対応するシソーラス・セクションに分割することが好ましく、これによって各セクションは、対応する仮想フラットファイル・ブロックに含まれるフラットファイル行ＩＤリストを備えた項目を有する。属性に割り当てられた１つのワードを伴う完全なフラットファイル行ＩＤリストは、そのワードの対応するシソーラス・セクションの項目で表されるリストの集合体である。したがって、シソーラス項目の完全なフラットファイル行ＩＤリストは、仮想フラットファイルと同様に区分され、シソーラス・セクションに対応するサブリストに分割される。
【０３６２】
属性のシソーラス索引ファイルは、全セクションに共通でよい。セクションごとに別個の索引ファイルを設けてもよい。
【０３６３】
ブロックごとに、図３８〜図７１に関して上述したように、ＳＱＬ問合せの処理のステップ１９１から１９３（図３６）を実行する。このようにして取得した結果をマージして、応答を表示する。
【０３６４】
異なるブロックに関する問合せの処理は、順次、または並行して実行することができる。
【０３６５】
順次処理では、最適の処理速度を得るためのＲＡＭの可用性を効果的に制御することができる。ＲＡＭ回路の費用は、現在では重要だと考えられていないが、任意のマシンは特定量のＲＡＭの容量が使用可能であり、これが上述した出力または計算テーブル用にＲＡＭスペースを確保するための制約となる。制約を受ける可能性が高い場合は、仮想フラットファイルを区分すると、そのテーブルのサイズ（図６５および図６９〜図７１のｊｍａｘ）がそのまま減少する。
【０３６６】
したがって、本発明を実行するための特定のマシンは、ｊｍａｘ、すなわち、ブロック・サイズの選択に従う。仮想フラットファイル・ブロックは、選択したサイズのパラメータに基づいてサイズ決定され、対応するシソーラス・セクションは、図１９のステップ１２２から１２６に関して示したように、セクションごとに次々と構築する。
【０３６７】
このように問合せ処理エンジンのサイズを決定すると、全ての段階で最適なアルゴリズムを使用できながら、ＲＡＭ１０３とハード・ドライブ１０５の間で中間データを交換する必要がない。
【０３６８】
並行処理を使用すると、さらなる加速が達成される。問合せ処理を、仮想フラットファイル・ブロックごとに幾つかのプロセッサに分散させる。
【０３６９】
全てのブロックが同じサイズｊｍａｘを有するという特殊なケースで、並行問合せ処理エンジンで可能なアーキテクチャを図７２に示す。マッチングユニット７００の数Ｍを、通信ネットワーク７０２を通して問合せサーバ７０１に接続する。各マシン・ユニット７００は、図１８に示すタイプのプロセッサ・システムであってもよい。これは、ブロックに関連付けたシソーラス・セクションを記憶するため、ハード・ドライブなどの記憶装置７０３を有する。図９に示すタイプのリンク・テーブルを使用する場合は、仮想フラットファイルと同じ方法でこれをブロックに区分し、各ブロックを対応するマッチングユニットに記憶する。サーバ７０１がマンマシン・インタフェースを提供する。これはＳＱＬのＷＨＥＲＥ文節の問合せ基準を図３７に示すタイプの木に変換し、これが所望の出力の記述とともにＭ個のマッチングユニット７００に提供される。各ユニット７００は、図３６のステップ１９１から１９３に従って自身の部分の仕事を実行し、その応答をサーバ７０１へと戻す。後者は、様々なマッチングユニットからの結果をコンパイルし、全体的な応答をユーザに提供する。ステップ１９１の分析を実行するため、各マッチングユニット７００はそのシソーラス・セクションを使用する。
【０３７０】
あるいは、問合せ基準の分析は、サーバ７０１が大域シソーラスによって中央で実行することができ、各大域シソーラスは、全（マクロ）ワードに共通であり、Ｍ個の記憶ユニット７０３の識別子サブリストへのポインタを含むため、Ｍ個の列を有する。分析段階の最後に、ステップ１９２から１９３を実行するため、関連するポインタをマッチングユニット７００にアドレス指定する。
【０３７１】
更新サーバ７０４は、問合せサーバ７０１と同じマシンであってもよいが、これもネットワーク７０２に接続されて、様々なブロックに関するＶＤＧを生成し、維持する。これは、ＲＤＢＭＳのデータ・テーブルの変化をモニタし、シソーラス・セクションに必要な変更を実行するため、シソーラス更新命令をユニット７００に経路指示する。
【０３７２】
上述した並行システムは、データ・グラフの数が現在の最大値（図７２の図ではＭ×ｊｍａｘ）に近づく場合に、容易に実行される。それには、新しい仮想フラットファイル・ブロックを扱うために、さらなるマッチングユニットを追加する必要があり、そのサイズは、以前のブロックと同じでも異なってもよく、さらにサーバ７０１、７０４の経路指示および結果コンパイル容量を再編成する必要がある。再編成は、以前から存在したマッチングユニットには完全にトランスペアレントである。したがって、最小の費用でシステム容量を増加させることができる。システムを停止する必要もない。
【図面の簡単な説明】
【０３７３】
【図１】従来のリレーショナル・データベース・システムで通常使用するようなデータ構造の例を示す図である。
【図２】従来のリレーショナル・データベース・システムで通常使用するようなデータ構造の例を示す図である。
【図３】従来のリレーショナル・データベース・システムで通常使用するようなデータ構造の例を示す図である。
【図４】図１〜図３の例のデータ・テーブル木を表す図である。
【図５】図４の木および図１のデータで構築したデータ・グラフを示す図である。
【図６】図４の木および図２のデータで構築したデータ・グラフを示す図である。
【図７】図４の木および図３のデータで構築したデータ・グラフを示す図である。
【図８】図１〜図３のデータ・テーブルのフラットファイル表示の図である。
【図９】本発明の実施形態で使用するような連結テーブルを示す図である。
【図１０Ａ】図１〜図３のデータ・テーブルに対応するシソーラスの内容を示す図である。
【図１０Ｂ】図１〜図３のデータ・テーブルに対応するシソーラスの内容を示す図である。
【図１０Ｃ】図１〜図３のデータ・テーブルに対応するシソーラスの内容を示す図である。
【図１０Ｄ】図１〜図３のデータ・テーブルに対応するシソーラスの内容を示す図である。
【図１０Ｅ】図１〜図３のデータ・テーブルに対応するシソーラスの内容を示す図である。
【図１０Ｆ】図１〜図３のデータ・テーブルに対応するシソーラスの内容を示す図である。
【図１０Ｇ】図１〜図３のデータ・テーブルに対応するシソーラスの内容を示す図である。
【図１０Ｈ】図１〜図３のデータ・テーブルに対応するシソーラスの内容を示す図である。
【図１１Ａ】図１０Ａのシソーラスの他の表示を示す図である。
【図１１Ｇ】図１０Ｇのシソーラスの他の表示を示す図である。
【図１１Ｈ】図１０Ｈのシソーラスの他の表示を示す図である。
【図１２Ａ】図１０Ａのシソーラスの他の表示を示す図である。
【図１２Ｇ】図１０Ｇのシソーラスの他の表示を示す図である。
【図１２Ｈ】図１０Ｈのシソーラスの他の表示を示す図である。
【図１３Ａ】図１０Ａのシソーラスの他の表示を示す図である。
【図１３Ｇ】図１０Ｇのシソーラスの他の表示を示す図である。
【図１３Ｈ】図１０Ｈのシソーラスの他の表示を示す図である。
【図１４Ａ】図１０Ａのシソーラスの他の表示を示す図である。
【図１４Ｇ】図１０Ｇのシソーラスの他の表示を示す図である。
【図１４Ｈ】図１０Ｈのシソーラスの他の表示を示す図である。
【図１５】図１４Ａ、図１４Ｇおよび図１４Ｈのシソーラスに関連するデータ・コンテナに記憶されるデータを示す図である。
【図１６】図１４Ａ、図１４Ｇおよび図１４Ｈのシソーラスに関連するデータ・コンテナに記憶されるデータを示す図である。
【図１７】図１０Ａ〜図１４Ａのシソーラスの可能な別の構造を示す図である。
【図１８】本発明を実施するのに適切なコンピュータ・システムのブロック図である。
【図１９】本発明の実施形態によるデータ・グラフ作成手順を示す流れ図である。
【図２０】図１９の段階１２４に適用することができる手順を示す流れ図である。
【図２１】図２０のステップ１３６に適用することができる手順を示す流れ図である。
【図２２】図２０のステップ１３６に適用することができる手順を示す流れ図である。
【図２３】２つの連続するコード化層で図２０のステップ１３６に適用することができる別の手順を示す流れ図である。
【図２４】２つの連続するコード化層で図２０のステップ１３６に適用することができる別の手順を示す流れ図である。
【図２５】図１〜図３の例から構築したシソーラスを記憶する方法を示すテーブルである。
【図２６】図１〜図３の例から構築したシソーラスを記憶する方法を示すテーブルである。
【図２７】図１〜図３の例から構築したシソーラスを記憶する方法を示すテーブルである。
【図２８】図１〜図３の例から構築したシソーラスを記憶する方法を示すテーブルである。
【図２９】図１〜図３の例から構築したシソーラスを記憶する方法を示すテーブルである。
【図３０】図１〜図３の例から構築したシソーラスを記憶する方法を示すテーブルである。
【図３１】図１〜図３の例から構築したシソーラスを記憶する方法を示すテーブルである。
【図３２】図１〜図３の例から構築したシソーラスを記憶する方法を示すテーブルである。
【図３３】シソーラスを図１７に示すように記憶した場合に、図２０のステップ１３５および１３６を実行する代替方法を示す流れ図である。
【図３４Ａ】図３１〜図３２のテーブルの代替実施形態を示すテーブルである。
【図３４Ｂ】図３１〜図３２のテーブルの代替実施形態を示すテーブルである。
【図３４Ｃ】図３４Ａおよび図３４Ｂのテーブルの別の表示である。
【図３４Ｄ】図３４Ａおよび図３４Ｂのテーブルの別の表示である。
【図３５】図３４Ａおよび図３４Ｂで示したタイプのテーブルの管理に適用することができる手順を示す流れ図である。
【図３６】本発明の実施形態による問合せ処理手順の一般的流れ図である。
【図３７】図１〜図３の例に関する問合せ木の例を示す図である。
【図３８】図３７の問合せ木の分析によって獲得された拡張問合せ木を示す別の図である。
【図３９】問合せ木を分析する手順を示す流れ図である。
【図４０Ａ】図３９の手順に関する再帰関数の流れ図である。
【図４０Ｂ】図３９の手順に関する再帰関数の流れ図である。
【図４１】図３８に図示されたような拡張問合せ木に基づき、マッチングデータ・グラフを識別する流れ図手順である。
【図４２】図４１の手順で呼ばれる再帰関数ＦＮＯＤＥの流れ図である。
【図４３】図４２のステップ２６２で実行される手順を示す流れ図である。
【図４４】図４２のステップ２６４で実行される手順を示す流れ図である。
【図４５】図４２のステップ２６５で実行される手順を示す流れ図である。
【図４６】図４２のステップ２６５の手順の代替実施形態を示す流れ図である。
【図４７】シソーラスを図３４Ａおよび図３４Ｂで示すように記憶した場合、図４２のステップ２６５の手順の別の代替実施形態を示す流れ図である。
【図４８】図４７の手順で呼ばれる再帰関数ＦＩＬＴの流れ図である。
【図４９】シソーラスを図１７で示すように記憶した場合、図４２のステップ２６５の手順の別の代替実施形態を示す流れ図である。
【図５０】図４２の関数に使用する葉処理の変形の流れ図である。
【図５１】データベース問合せに関連する属性値を検索するために、任意の属性に関してシソーラスを走査するのに適用することができる手順を示す流れ図である。
【図５２】図５１の手順で言及される関数ＦＩＮＴＥＲの流れ図である。
【図５３】図５２のステップ３５５で実行する手順を示す流れ図である。
【図５４】図５２のステップ３５７で実行する手順を示す流れ図である。
【図５５】図５２のステップ３５８で実行する手順を示す流れ図である。
【図５６】シソーラスを図３４Ａおよび図３４Ｂで示すように記憶した場合、データベース問合せに関連する属性値を検索するために、任意の属性に関してシソーラスを走査するのに適用することができる代替手順を示す流れ図である。
【図５７】図５６の手順で呼ばれる再帰関数ＦＦＩＬＴの流れ図である。
【図５８】図２５〜図３４のテーブルと協働で記憶することができるテーブルを示す。
【図５９】図２５〜図３４のテーブルと協働で記憶することができるテーブルを示す。
【図６０】図２５〜図３４のテーブルと協働で記憶することができるテーブルを示す。
【図６１】図２５〜図３４のテーブルと協働で記憶することができるテーブルを示す。
【図６２】図５１と同様のシソーラス走査に先だって使用することができる事前フィルタリング手順を示す流れ図である。
【図６３】図６２による事前フィルタリングを考慮に入れるために適用される、図５１によるシソーラス走査手順の一部を示す流れ図である。
【図６４】シソーラスを図１７で示すように記憶した場合、図５２のステップ３５８に適用することができる代替手順を示す流れ図である。
【図６５】図５１のステップ３３５に適用することができる手順を示す流れ図である。
【図６６】問合せ応答を提供するために使用する例示としての出力テーブルの内容を示す図である。
【図６７】問合せ応答を提供するために使用する例示としての出力テーブルの内容を示す図である。
【図６８】出力テーブルで可能な別の構造を示す図である。
【図６９】図６８で示すタイプの出力テーブルを構築するために、図５１のステップ３３５に適用することができる手順を示す流れ図である。
【図７０】図６８で示すタイプの出力テーブルを構築するために、図５１のステップ３３５に適用することができる手順を示す流れ図である。
【図７１】計算テーブルによってデータベース・システムで計算を実行するために、図５１のステップ３３５に適用することができる手順を示す流れ図である。
【図７２】本発明を実施するために適切な別のコンピュータ・システムのブロック図である。
【符号の説明】
【０３７４】
１００  バス
１０１  ＣＰＵ
１０２  ＲＯＭ
１０３  ＲＡＭ
１０４  マンマシン・インタフェース
１０５  ハード・ドライブ
１０６  磁気ディスク
【図１】
2008269643.tif 000018
【図２】
2008269643.tif 000019
【図３】
2008269643.tif 000020
【図４】
2008269643.tif 000021
【図５】
2008269643.tif 000022
【図６】
2008269643.tif 000023
【図７】
2008269643.tif 000024
【図８】
2008269643.tif 000025
【図９】
2008269643.tif 000026
【図１０Ａ】
2008269643.tif 000027
【図１０Ｂ】
2008269643.tif 000028
【図１０Ｃ】
2008269643.tif 000029
【図１０Ｄ】
2008269643.tif 000030
【図１０Ｅ】
2008269643.tif 000031
【図１０Ｆ】
2008269643.tif 000032
【図１０Ｇ】
2008269643.tif 000033
【図１０Ｈ】
2008269643.tif 000034
【図１１Ａ】
2008269643.tif 000035
【図１１Ｇ】
2008269643.tif 000036
【図１１Ｈ】
2008269643.tif 000037
【図１２Ａ】
2008269643.tif 000038
【図１２Ｇ】
2008269643.tif 000039
【図１２Ｈ】
2008269643.tif 000040
【図１３Ａ】
2008269643.tif 000041
【図１３Ｇ】
2008269643.tif 000042
【図１３Ｈ】
2008269643.tif 000043
【図１４Ａ】
2008269643.tif 000044
【図１４Ｇ】
2008269643.tif 000045
【図１４Ｈ】
2008269643.tif 000046
【図１５】
2008269643.tif 000047
【図１６】
2008269643.tif 000048
【図１７】
2008269643.tif 000049
【図１８】
2008269643.tif 000050
【図１９】
2008269643.tif 000051
【図２０】
2008269643.tif 000052
【図２１】
2008269643.tif 000053
【図２２】
2008269643.tif 000054
【図２３】
2008269643.tif 000055
【図２４】
2008269643.tif 000056
【図２５】
2008269643.tif 000057
【図２６】
2008269643.tif 000058
【図２７】
2008269643.tif 000059
【図２８】
2008269643.tif 000060
【図２９】
2008269643.tif 000061
【図３０】
2008269643.tif 000062
【図３１】
2008269643.tif 000063
【図３２】
2008269643.tif 000064
【図３３】
2008269643.tif 000065
【図３４Ａ】
2008269643.tif 000066
【図３４Ｂ】
2008269643.tif 000067
【図３４Ｃ】
2008269643.tif 000068
【図３４Ｄ】
2008269643.tif 000069
【図３５】
2008269643.tif 000070
【図３６】
2008269643.tif 000071
【図３７】
2008269643.tif 000072
【図３８】
2008269643.tif 000073
【図３９】
2008269643.tif 000074
【図４０Ａ】
2008269643.tif 000075
【図４０Ｂ】
2008269643.tif 000076
【図４１】
2008269643.tif 000077
【図４２】
2008269643.tif 000078
【図４３】
2008269643.tif 000079
【図４４】
2008269643.tif 000080
【図４５】
2008269643.tif 000081
【図４６】
2008269643.tif 000082
【図４７】
2008269643.tif 000083
【図４８】
2008269643.tif 000084
【図４９】
2008269643.tif 000085
【図５０】
2008269643.tif 000086
【図５１】
2008269643.tif 000087
【図５２】
2008269643.tif 000088
【図５３】
2008269643.tif 000089
【図５４】
2008269643.tif 000090
【図５５】
2008269643.tif 000091
【図５６】
2008269643.tif 000092
【図５７】
2008269643.tif 000093
【図５８】
2008269643.tif 000094
【図５９】
2008269643.tif 000095
【図６０】
2008269643.tif 000096
【図６１】
2008269643.tif 000097
【図６２】
2008269643.tif 000098
【図６３】
2008269643.tif 000099
【図６４】
2008269643.tif 000100
【図６５】
2008269643.tif 000101
【図６６】
2008269643.tif 000102
【図６７】
2008269643.tif 000103
【図６８】
2008269643.tif 000104
【図６９】
2008269643.tif 000105
【図７０】
2008269643.tif 000106
【図７１】
2008269643.tif 000107
【図７２】
2008269643.tif 000108