(57)【要約】【課題】定数次数と対数ホップ数を実現するデータ検索方式でありながらデータの範囲検索を実現することを目的とする。【解決手段】登録・検索実行手段８１７は、検索式に合致する集合を論理識別子空間における範囲（論理識別子範囲）に変換する。左ビットシフト範囲分割手段８１６は、論理識別子範囲に属する論理識別子を担うピアに、検索メッセージ（検索要求）が行き渡るように、論理識別子範囲とともに検索メッセージを分割する。このとき、論理識別子範囲に対する左ビットシフトを実行し、論理識別子範囲における先頭ビットの違いによって、先頭ビットが同一であるような複数の論理識別子範囲を分割する。そして、メッセージ転送手段８１３は、分割された各々の論理識別子範囲を含む検索メッセージを所定のピアに転送する。このような手法を用いることで、定数次数と対数ホップ数を実現しつつオーバーレイネットワーク上での範囲検索を実現する。【選択図】図６
2008262507.tif 000002
【特許請求の範囲】
【請求項１】
ネットワーク上に配置され、他の装置と共有するデータを検索するデータ検索装置であって、
検索要求された論理識別子範囲の分割条件が成立した場合に、自身の論理識別子とサクセサの論理識別子との間の論理識別子で前記論理識別子範囲を分割する分割手段と、
前記分割手段によって得られた論理識別子範囲を含む検索要求を、該検索要求の転送先条件が成立する同一または異なる装置に転送する検索要求転送手段とを備えた
ことを特徴とするデータ検索装置。
【請求項２】
分割手段は、検索要求された論理識別子範囲の分割条件が成立した場合に、前記論理識別子範囲を該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトする左ビットシフト範囲分割処理を実行する
請求項１記載のデータ検索装置。
【請求項３】
分割手段は、
論理識別子範囲の上限値と下限値の先頭ビットを比較し、
両先頭ビットが同一である場合に、前記論理識別子範囲を左ビットシフトし、
両先頭ビットが異なる場合に、左ビットシフト範囲分割処理を実行する
請求項２記載のデータ検索装置。
【請求項４】
検索要求された論理識別子範囲をサクセサの論理識別子を境界として２つの論理識別子範囲に分割する範囲分割手段を備え、
分割手段は、あらかじめ設定された仮想ノードが自身の論理識別子とサクセサの論理識別子との間に含まれている場合に、前記範囲分割手段によって分割された２つの論理識別子範囲のうちの上位側の論理識別子範囲に対して左ビットシフト範囲分割処理を実行し、
検索要求転送手段は、検索対象の論理識別子範囲とともに仮想ノードを含む検索要求を転送する
請求項２または請求項３記載のデータ検索装置。
【請求項５】
分割手段は、
検索要求された論理識別子範囲を、自身の論理識別子とサクセサとの間の特定範囲で、前記論理識別子範囲をもとに２つの論理識別子範囲に分割する第１分割手段と、
前記第１分割手段によって分割された論理識別子範囲のうち前記特定範囲に含まれない論理識別子範囲を、前記特定範囲で、あらかじめ設定された仮想範囲をもとに分割する第２分割手段と、
前記第２分割手段によって分割された論理識別子範囲のうち前記特定範囲に含まれる論理識別子範囲を左ビットシフトするとともに、シフト回数を増加させる範囲左ビットシフト手段とを含み、
検索要求転送手段は、検索対象の論理識別子範囲とともに仮想範囲とシフト回数を含む検索要求を転送する
請求項１記載のデータ検索装置。
【請求項６】
ネットワーク上に配置された複数の端末を備え、各端末間で共有するデータを検索するデータ検索システムであって、
前記各端末は、
検索要求された論理識別子範囲の分割条件が成立した場合に、自身の論理識別子とサクセサの論理識別子との間の論理識別子で前記論理識別子範囲を分割する分割手段と、
前記分割手段によって得られた論理識別子範囲を含む検索要求を、該検索要求の転送先条件が成立する同一または異なる装置に転送する検索要求転送手段とを備えた
ことを特徴とするデータ検索システム。
【請求項７】
ネットワーク上に配置された、他の装置とデータを共有する端末の制御部が制御プログラムに従って、
検索要求された論理識別子範囲の分割条件が成立した場合に、自身の論理識別子とサクセサの論理識別子との間の論理識別子で前記論理識別子範囲を分割する分割ステップと、
前記分割ステップによって得られた論理識別子範囲を含む検索要求を、該検索要求の転送先条件が成立する同一または異なる装置に転送する検索要求転送ステップとを実行する
ことを特徴とするデータ検索方法。
【請求項８】
分割ステップにおいて、検索要求された論理識別子範囲の分割条件が成立した場合に、前記論理識別子範囲を該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトする左ビットシフト範囲分割処理を実行する
請求項７記載のデータ検索方法。
【請求項９】
分割ステップにおいて、
論理識別子範囲の上限値と下限値の先頭ビットを比較し、
両先頭ビットが同一である場合に、前記論理識別子範囲を左ビットシフトし、
両先頭ビットが異なる場合に、左ビットシフト範囲分割処理を実行する
請求項８記載のデータ検索方法。
【請求項１０】
検索要求された論理識別子範囲をサクセサの論理識別子を境界として２つの論理識別子範囲に分割する範囲分割ステップを実行し、
分割ステップにおいて、あらかじめ設定された仮想ノードが自身の論理識別子とサクセサの論理識別子との間に含まれている場合に、前記範囲分割ステップによって分割された２つの論理識別子範囲のうちの上位側の論理識別子範囲に対して左ビットシフト範囲分割処理を実行し、
検索要求転送ステップにおいて、検索対象の論理識別子範囲とともに仮想ノードを含む検索要求を転送する
請求項８または請求項９記載のデータ検索方法。
【請求項１１】
分割ステップにおいて、
検索要求された論理識別子範囲を、自身の論理識別子とサクセサとの間の特定範囲で、前記論理識別子範囲をもとに２つの論理識別子範囲に分割する第１分割ステップと、
前記第１分割ステップによって分割された論理識別子範囲のうち前記特定範囲に含まれない論理識別子範囲を、前記特定範囲で、あらかじめ設定された仮想範囲をもとに分割する第２分割ステップと、
前記第２分割ステップによって分割された論理識別子範囲のうち前記特定範囲に含まれる論理識別子範囲を左ビットシフトするとともに、シフト回数を増加させる範囲左ビットシフトステップとを実行し、
検索要求転送ステップにおいて、検索対象の論理識別子範囲とともに仮想範囲とシフト回数を含む検索要求を転送する
請求項７記載のデータ検索方法。
【請求項１２】
ネットワーク上に配置されたコンピュータが他のコンピュータと共有するデータを検索するためのデータ検索用プログラムであって、
検索要求された論理識別子範囲の分割条件が成立した場合に、自身の論理識別子とサクセサの論理識別子との間の論理識別子で前記論理識別子範囲を分割する分割処理と、
前記分割処理によって得られた論理識別子範囲を含む検索要求を、該検索要求の転送先条件が成立する同一または異なる装置に転送する検索要求転送処理とを
コンピュータに実行させるデータ検索用プログラム。
【請求項１３】
分割処理において、検索要求された論理識別子範囲の分割条件が成立した場合に、前記論理識別子範囲を該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトする左ビットシフト範囲分割処理を実行する
請求項１２記載のデータ検索用プログラム。
【請求項１４】
分割処理において、
論理識別子範囲の上限値と下限値の先頭ビットを比較し、
両先頭ビットが同一である場合に、前記論理識別子範囲を左ビットシフトし、
両先頭ビットが異なる場合に、前記論理識別子範囲を該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトする
請求項１３記載のデータ検索用プログラム。
【請求項１５】
検索要求された論理識別子範囲をサクセサの論理識別子を境界として２つの論理識別子範囲に分割する範囲分割処理をコンピュータに実行させるとともに、
分割処理において、あらかじめ設定された仮想ノードが自身の論理識別子とサクセサの論理識別子との間に含まれている場合に、前記範囲分割処理によって分割された２つの論理識別子範囲のうちの上位側の論理識別子範囲について該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトし、
検索要求転送処理において、検索対象の論理識別子範囲とともに仮想ノードを含む検索要求を転送する
請求項１３または請求項１４記載のデータ検索用プログラム。
【請求項１６】
分割処理において、
検索要求された論理識別子範囲を、自身の論理識別子とサクセサとの間の特定範囲で、前記論理識別子範囲をもとに２つの論理識別子範囲に分割する第１分割処理と、
前記第１分割処理によって分割された論理識別子範囲のうち前記特定範囲に含まれない論理識別子範囲を、前記特定範囲で、あらかじめ設定された仮想範囲をもとに分割する第２分割処理と、
前記第２分割処理によって分割された論理識別子範囲のうち前記特定範囲に含まれる論理識別子範囲を左ビットシフトするとともに、シフト回数を増加させる範囲左ビットシフト処理とを実行し、
検索要求転送処理において、検索対象の論理識別子範囲とともに仮想範囲とシフト回数を含む検索要求を転送する
請求項１２記載のデータ検索用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワークに配置された各端末で共有するデータを検索するデータ検索装置、データ検索方法およびデータ検索用プログラムに関し、特に次数が定数であるグラフを用いることを特徴としたデータ検索装置、データ検索システム、データ検索方法およびデータ検索用プログラムに関する。
【背景技術】
【０００２】
オーバレイネットワークは、既存のリンクを用いて、その上位層における目的に応じて仮想的なリンクを形成し構成するネットワークである。すなわち、コンピュータネットワークの下位層のトポロジーとは関係なく構築された上位層のネットワークをオーバレイ・ネットワークと呼ぶ。例えば、ＩＰネットワークのトポロジーとは無関係に構築されたＰ２Ｐ（Ｐｅｅｒ  ｔｏ  Ｐｅｅｒ）ネットワークなどを指す。
【０００３】
オーバレイネットワークでは、中央サーバを必要とせず、容易に柔軟な耐故障性に優れたネットワークを構築できる。ノード（ピアともいう）は自由に参加・離脱を行い、ネットワークトポロジは動的に変化する。全てのノードに対等の権限が与えられ、ネットワークに接続されている全てのノードが持つデータにアクセスすることが可能となる。
【０００４】
オーバレイネットワークにおいて、各ノードが隣接するノードの情報（ＩＰアドレス等）のみを持つ場合は、データを検索する方法として、隣接するノードに問合せ（クエリ）をリレーで渡していく方法が採られることになる。このような検索方法の場合、検索用のネットワークトポロジを維持する必要がないためアドホック性に優れ、複製を利用することで耐故障性も優れているが、検索に時間がかかるためスケーラビリティに欠ける。一方、各ノードがネットワーク上の全てのノードの情報を持っている場合は、検索時間はかからないがスケーラビリティとアドホック性の点で適切でない。このように、オーバレイネットワーク（Ｐ２Ｐネットワーク）では、要求されたデータを持つノードをどのように検索するかが重要と問題となる。
【０００５】
オーバレイネットワーク上の各ノードに経路情報として分散ハッシュテーブル（Ｄｉｓｔｒｉｂｕｔｅｄ  Ｈａｓｈ  Ｔａｂｌｅ：ＤＨＴ）を持たせることにより、膨大なデータを高速（効率的）に検索する手法が用いられている。分散ハッシュテーブルでは、データはハッシュ空間上に配置され、各ノードがある値域を担当して値域内に存在するデータを保持、管理する。所定のノードがキーを通じてデータの検索を行う場合、キーをハッシュ関でハッシュ値に変換してハッシュ空間にマッピングを行い、目的のノードとデータを取得する。
【０００６】
分散ハッシュテーブルを用いた検索アルゴリズム（ルーティングアルゴリズム）として複数のものが考えられているが、その中にＣｈｏｒｄとＫｏｏｒｄｅが存在する。Ｃｈｏｒｄは、環状のハッシュ空間上でフィンガーテーブル（Ｆｉｎｇｅｒ  Ｔａｂｌｅ；自身のノードのＩＤの１，２，４，８，・・・先のＩＤのノードの情報が登録されたテーブル）にもとづいて二分検索に似た検索を行うことでホップ数ｌｏｇ（Ｎ）の検索効率を実現したアルゴリズムである。また、Ｋｏｏｒｄｅは、Ｃｈｏｒｄのフィンガーテーブルの代わりにｄｅ  Ｂｒｕｉｊｎグラフを利用してルーティングを行うアルゴリズムである。非特許文献１には、Ｋｏｏｒｄｅによるデータ検索方法が記載されている。以下、非特許文献１に記載された従来のデータ検索方法について説明する。
【０００７】
（１）第１の従来技術について：
図１７は、第１の従来技術のデータ検索手順を示すフローチャートである。また、図１８は、ｄｅ  Ｂｒｕｉｊｎグラフを示す説明図である。第１の従来技術では、図１７に示すフローチャートに記載した手順に従って、論理識別子Ｋｅｙが与えられたデータを、図１８に示すグラフ内のどのノードが管理するかを決定する。
【０００８】
図１８はｄｅ  Ｂｒｕｉｊｎグラフと呼ばれる。ｄｅ  ＢｒｕｉｊｎグラフＤｋ（ｎ）は、集合Ｚｋ＝｛０，１，．．．，ｋ−１｝の要素からなるビット長ｎのビット列ｘが、全てのあるビット列を左ビットシフトして、最下位ビットにｘ０∈Ｚｋを加えて得られる全てのビット列に対して弧を持つグラフである。図１８に示す例では、ｋ＝２、ｎ＝４としている。
【０００９】
すなわち、ｄｅ  Ｂｒｕｉｊｎグラフでは、ｎビットの論理識別子（ノードＩＤ）を持つノードが２ｎ 個存在した場合、各々のノードｍから（２ｍ  ｍｏｄ  ２ｎ ），（２ｍ＋１  ｍｏｄ  ２ｎ ）のノードにリンクが張られる。例えば、３ビットの論理識別子がｘｙｚのノード（ＩＤ＝ｘｙｚのノード）からは、論理識別子がｙｚ０のノード（ＩＤ＝ｙｚ０のノード）と論理識別子がｙｚ１のノード（ＩＤ＝ｙｚ１のノード）に対して一方向のリンクが張られる。
【００１０】
Ｋｏｏｒｄｅでは、このようなｄｅ  Ｂｒｕｉｊｎグラフを一方向リンクを利用してルーティングを行う。例えば、３ビットの論理識別子がｘｙｚのノードから３ビットの論理識別子がａｂｃのノードにメッセージを転送するときは、論理識別子がｘｙｚ→ｙｚａ→ｚａｂ→ａｂｃのノードへ順にメッセージがルーティングされる。すなわち、終点の論理識別子と始点の論理識別子をつなげたｘｙｚａｃｂを順に左にシフトさせたノードにメッセージが転送される。
【００１１】
データの論理識別子を管理するノードを探す例として、論理識別子が１３（２進数表示で１１０１）である図１８に示すノード２１３が、論理識別子が９（２進数表示で１００１）であるデータを格納するノードを検索する場合について説明する。
【００１２】
図１７に示す処理において、ノード２１３が、論理識別子Ｋｅｙの値「１００１」を、キーシフトｋｓｈｉｆｔで探す。初期キーシフトの値は、データの論理識別子Ｋｅｙの値と同一とする。すなわち、初期キーシフトの値を「１００１」とする。まず、ノード２１３は、自身の論理識別子ｍが論理識別子Ｋｅｙと同じであるか否か判定する（ステップＳ１０１）。ノード２１３の論理識別子の値は「１１０１」であり、これは論理識別子Ｋｅｙの値「１００１」と異なることから（ステップＳ１０１のＮｏ）、ノード２１３は、キーシフトｋｓｈｉｆｔの先頭ビットｂと、論理識別子空間Ｎ（ここでは、４ビットであるため１６）とを用いて、２ｍ＋ｂ  ｍｏｄ  Ｎで表わされる論理識別子を、ノードｔとする（ステップＳ１０３）。具体的には、キーシフト「１００１」の先頭ビット１と論理識別子空間１６とを用いて、ノードｔを２×１３＋１  ｍｏｄ  １６＝１１（２進数表示で１０１１）とする。この演算は、上述したように、２進数表示ではｍのビットを左ビットシフトさせ、最下位ビットに、キーの先頭ビットを与える処理と同等である。
【００１３】
次に、ノード２１３は、キーシフトｋｓｈｉｆｔの値「１００１」を左ビットシフトさせ、キーシフトｋｓｈｉｆｔの値を「００１０」とする（ステップＳ１０４）。次に、論理識別子が１１（２進数表示で１０１１）であるノード２１１が、論理識別子Ｋｅｙの値「１００１」を、キーシフトｋｓｈｉｆｔの値「００１０」で探す処理に移行する（ステップＳ１０５）。これは、図１７に示す処理（ステップＳ１０１〜Ｓ１０５）がノード２１１に移されたことに相当し、ノード２１３にて実行したステップＳ１０５は、そのサブルーチンとして、ノード２１１にてステップＳ１０１〜Ｓ１０５の処理が実行されることとなる。
【００１４】
ノード２１１では、データの論理識別子Ｋｅｙの値「１００１」とノード２１１の自身の論理識別子「１０１１」が異なることから（ステップＳ１０１のＮｏ）、キーシフト「００１０」の先頭ビット０と論理識別子空間１６とからノードｔの値を「０１１０」とし（ステップＳ１０３）、キーシフトｋｓｈｉｆｔの値を「０１００」とする（ステップＳ１０４）。そして、ノード２１１は、論理識別子「０１１０」を持つ新たなノード２０６に処理を移行させる（ステップＳ１０５）。これにより、ノード２０６が、論理識別子Ｋｅｙの値「１００１」を、キーシフトｋｓｈｉｆｔの値「０１００」で探すこととなる。
【００１５】
ノード２０６では、データの論理識別子Ｋｅｙの値「１００１」とノード２０６の自身の論理識別子「０１１０」が異なるため（ステップＳ１０１のＮｏ）、キーシフト「０１００」の先頭ビット０と論理識別子空間１６とからノードｔの値を「１１００」とし（ステップＳ１０３）、キーシフトｋｓｈｉｆｔの値を「１０００」とする（ステップＳ１０４）。そして、ノード２０６は、論理識別子「１１００」を持つ新たなノード２１２に処理を移行させる（ステップＳ１０５）。これにより、ノード２１２が、論理識別子Ｋｅｙの値「１００１」を、キーシフトｋｓｈｉｆｔの値「１０００」で探すこととなる。
【００１６】
ノード２１２では、データの論理識別子Ｋｅｙの値「１００１」とノード２１２の自身の論理識別子「１１００」が異なるため（ステップＳ１０１のＮｏ）、キーシフト「１０００」の先頭ビット１と論理識別子空間１６とからノードｔの値を「１００１」とし（ステップＳ１０３）、キーシフトｋｓｈｉｆｔの値を「００００」とする（ステップＳ１０４）。そして、ノード２１２は、論理識別子「１００１」を持つ新たなノード２０９に処理を移行させる（ステップＳ１０５）。これにより、ノード２０９が、論理識別子Ｋｅｙの値「１００１」を、キーシフトｋｓｈｉｆｔの値「００００」で探すこととなる。
【００１７】
ノード２０９では、データの論理識別子Ｋｅｙの値「１００１」とノード２０９の自身の論理識別子「１００１」が同一であるため（ステップＳ１０１のＹｅｓ）、ノード２０９は、自身が当該論理識別子を持つデータを管理するノードであると判断する。そして、ノード２０９は、サブルーチンとして呼び出したノード２１２のステップＳ１０５の結果として論理識別子「１００１」のノードであることを示すメッセージをノード２１２に返す（ステップＳ１０６）。
【００１８】
ノード２１２のステップＳ１０６では、この結果をさらにサブルーチンとして呼び出したノード２０６に返し、ノード２０６のステップＳ１０６では、この結果をサブルーチンとして呼び出したノード２１１に返し、ノード２１１のステップＳ１０６では、この結果をサブルーチンとして呼び出したノード２１３に返す。このように、最終的に検索を実行したノード２１３に目的のノード２０９が返ることになる。
【００１９】
このような手順を取ることにより、図１８のグラフに示すように、ノードが他のノードを指す数である次数（各ノードに隣接するノードの数、すなわち各ノードがリンクしているノードの数）が一定数（２つ）でありながら、全ノード数Ｎに対して、ｌｏｇＮの転送回数（ホップ数）で、特定のデータのＫｅｙを管理するノードを発見することができる。
【００２０】
（２）第２の従来技術について：
第１の従来技術はオーバレイネットワークに関係なく、ｄｅ  Ｂｒｕｉｊｉｎグラフを用いた理論上のアルゴリズムについての説明であったが、実際には、Ｃｈｏｒｄのハッシュ空間では各ノードは間隔を持って存在しているため（すなわち、論理識別子空間１６（２の４乗）である場合に、論理識別子０〜１５の全てにノードが存在するわけではないため）、全ての論理識別子を持つノードが定義されたｄｅ  Ｂｒｕｉｊｉｎグラフは適用できない。そこで、Ｋｏｏｒｄｅではｄｅ  Ｂｒｕｉｊｉｎ上のＩＤをＣｈｏｒｄハッシュ空間上の仮想ＩＤとし、一つのノードがある区間のＩＤを担当させている。このようにオーバレイネットワークにＫｏｏｒｄｅを実装した場合の構成についても、非特許文献１に記載されている。
【００２１】
図１９は、第２の従来技術のシステム構成を示すブロック図である。また、図２０は、第２の従来技術のデータ検索手順を示すフローチャートである。また、図２１は、第２の従来技術におけるピア間でのメッセージの流れの具体例を示す説明図である。
【００２２】
図１９に示すように、第２の従来術におけるデータ検索システムは、ネットワーク３００上でのアドレスを有する複数のピア３１０，３２０，３３０から構成される。なお、ピア３１０，３２０，３３０は、それぞれ第１の従来技術におけるノードに相当する。これらのピア３１０，３２０，３３０はそれぞれ異なる論理識別子を有する。さらに、各ピア３１０，３２０，３３０は、ピア論理識別子格納部３１８と、ローカルデータ格納部３１１と、ルーティングテーブル３１２と、メッセージ転送手段３１３と、通信手段３１４と、左ビットシフト手段３１５と、先頭ビット取得手段３１６と、登録・検索実行手段３１７とを備えている。
【００２３】
ピア論理識別子格納部３１８には、オーバレイネットワークにおいてピア３１０を他のピアと識別する論理識別子が格納される。ローカルデータ格納部３１１には、オーバレイネットワーク内のピアで共有されるデータのうち、ピア３１０が管理するデータが格納される。
【００２４】
ルーティングテーブル３１２には、他ピアの論理識別子と、そのピアにアクセスするために必要なネットワーク３００上でのアドレスとが格納されている（図２１に示すテーブル５００参照）。このアドレスとしては、例えばＩｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ（ＩＰ）アドレスが用いられてもよい。
【００２５】
ルーティングテーブルには、ｄノードとｓノードが格納される。ｄノードは、各自のピアの論理識別子をｍとした場合に、論理識別子２ｍの「ｐｒｅｄｅｃｅｓｓｏｒ」に対応するノード（ピア）である。ここで、論理識別子２ｍの「ｐｒｅｄｅｃｅｓｓｏｒ」とは、図２１に示すリングの中で、論理識別子２ｍから見て反時計回りの方向に存在する最初のノード（ピア）である。このｐｒｅｄｅｃｅｓｓｏｒは、論理識別子２ｍとの間のハッシュ空間を責任領域としてデータの管理を担当する。ただし、ここでの論理識別子２ｍは、厳密には論理識別子空間のサイズをＮとした場合に、合同式ｍｏｄを用いて、２ｍ  ｍｏｄ  Ｎと表される。図２１に示す例では、ピア５１６の論理識別子が１３（２進数表示で１１０１）であるため、ｄノードは論理識別子１０（２進数表示で１０１０）のピア（ノード）５１５となる。
【００２６】
また、ｓノードは、各自のピアの論理識別子をｍとした場合に、論理識別子ｍの「ｓｕｃｃｅｓｓｏｒ」に対応するノード（ピア）である。ここで、論理識別子ｍの「ｓｕｃｃｅｓｓｏｒ」とは、図２１に示すリングの中で、論理識別子ｍから見て時計回りに存在する最初のノード（ピア）である。図２１に示す例では、ピア５１６の論理識別子が１３（２進数表示で１１０１）であるため、ｓノードは論理識別子１５（２進数表示で１１１１）のピア（ノード）５１７となる。この例では、論理識別子サイズＮが１６であるが、これを超える場合には、合同式ｍｏｄを用いて、２ｍ  ｍｏｄ  Ｎとして処理される。
【００２７】
左ビットシフト手段３１５は、Ｋｏｏｒｄｅのアルゴリズムにもとづく左ビットシフトの処理（ｍのビット列を１ビットだけ左にシフトさせ、最下位ビットにキーの先頭ビットを与える処理）を実行する。先頭ビット取得手段３１６は、キーシフトの先頭ビットを取得し、取得した先頭ビットと論理識別子空間とから仮想ノードｉを算出する処理を実行する。
【００２８】
登録・検索実行手段３１７は、データの登録および検索の処理を実行する。メッセージ転送手段３１３は、データの登録要求および検索メッセージ（検索要求）の転送処理を実行する。通信手段３１４は、ネットワーク３００を通じて他のピアとの間で検索メッセージ等を送受信する処理を実行する。
【００２９】
このような構成を有する従来のデータ検索システムは次のように動作する。
【００３０】
あるピアｍ（例えば図２１に示す論理識別子１１０１のピア５１６）の登録・検索実行手段３１７は、データの登録・検索要求が外部（例えば外部ユーザインタフェース）から与えられると、ハッシュ関数などを用いて、このデータが格納される１つの論理識別子を算出する。この論理識別子を論理識別子ｋｅｙとキーシフトｋｓｈｉｆｔとし、当該ピアの論理識別子に１を加えた値を仮想ノードｉとする。例えば“Ｆｏｏ”というデータの登録先を探す場合において、このハッシュ値が０１１１（２進数表示）となったとする。これらの値を引数として、登録・検索実行手段３１７は、メッセージ転送手段３１３を呼び出す。
【００３１】
メッセージ転送手段３１３において、図２０に示すフローチャートの各処理が実行される。上記の例では、まず、論理識別子ｋｅｙの値「０１１１」、キーシフトｋｓｈｉｆｔの値「０１１１」、仮想ノード「１１１０」がメッセージ転送手段３１３に与えられる。
【００３２】
メッセージ転送手段３１３は、論理識別子ｋｅｙがｍより大きく、ｓｕｃｃｅｓｓｏｒ以下の範囲に含まれるか否かを判定する（ステップＳ４０１）。この範囲に含まれる場合は（ステップＳ４０１のＹｅｓ）、ｓｕｃｃｅｓｓｏｒが当該論理識別子ｋｅｙを担当すると判別される。この場合は、検索要求に対する検索結果が検索元のピアに返される（ステップＳ４０２）。上記の範囲に含まれない場合は（ステップＳ４０１のＮｏ）、メッセージ転送手段３１３は、仮想ノードｉが上記の範囲（ｍより大きくｓｕｃｃｅｓｓｏｒ以下の範囲）に含まれるか否かを判定する（ステップＳ４０３）。
【００３３】
仮想ノードｉが上記の範囲に含まれない場合は（ステップＳ４０３のＮｏ）、メッセージ転送手段３１３は、当該ピアｍにて処理が実行されたときの引数と同一の引数（論理識別子ｋｅｙ、キーシフトｋｓｈｉｆｔ、仮想ノードｉ）で、当該ピアｍのｓｕｃｃｅｓｓｏｒを呼び出す（ステップＳ４０７）。これにより、ｓｕｃｃｅｓｓｏｒが、論理識別子Ｋｅｙを、キーシフトｋｓｈｉｆｔおよび仮想ノードｉで探す処理（ステップＳ４０１〜Ｓ４０７）を実行する。
【００３４】
仮想ノードｉが上記の範囲に含まれる場合は（ステップＳ４０３のＹｅｓ）、ピアｍの先頭ビット取得手段３１６は、キーシフトｋｓｈｉｆｔの先頭ビットｂと、当該ピアの論理識別子ｍを用いて、２ｍ＋ｂ  ｍｏｄ  Ｎの計算を行い、計算結果の論理識別子を仮想ノードｉとする（ステップＳ４０４）。ここで、Ｎは論理識別子空間のサイズある。
【００３５】
次に、左ビットシフト手段３１５は、キーシフトｋｓｈｉｆｔを１ビットだけ左にシフトさせる（ステップＳ４０５）。このようにして得られた論理識別子ｋｅｙとキーシフトｋｓｈｉｆｔ、仮想ノードｉを引数として、ピアｍのｄノードであるピアを呼び出す（ステップＳ４０６）。これにより、ｄノードであるピアが、論理識別子Ｋｅｙを、キーシフトｋｓｈｉｆｔおよび仮想ノードｉで探す処理（ステップＳ４０１〜Ｓ４０７）を実行する。
【００３６】
上記の例では、図２１に示すように、最初の論理識別子が「１１０１」であるピア５１６にて、論理識別子ｋｅｙの値「０１１１」、キーシフトｋｓｈｉｆｔの値「０１１１」、過疎ノードｉ「１１１０」でメッセージ転送手段３１３が呼び出される（図２１の５２１）。この場合、仮想ノードｉが範囲（１１０１，１１１１］に存在するので（ステップＳ４０３のＹｅｓ）、仮想ノードｉが「１１００」と算出され（ステップＳ４０４）、キーシフトｋｓｈｉｆｔが「１１１０」に変換されて（ステップＳ４０５）、ｄノードであるピア５１５にメッセージが転送される（ステップＳ４０６；図２１の５２２）。
【００３７】
ピア５１５においても、仮想ノードｉ「１１００」が、範囲（１０１０，１１０１］に存在するため（ステップＳ４０３のＹｅｓ）、仮想ノードｉが「１００１」と算出され（ステップＳ４０４）、キーシフトｋｓｈｉｆｔが「１１００」に変換されて（ステップＳ４０５）、ｄノードであるノード５１２にメッセージが転送される（ステップＳ４０６；図２１の５２３）。
【００３８】
ピア５１２では、論理識別子ｋｅｙの値「０１１１」が範囲（１０１０，１１０１］に存在せず（ステップＳ４０１のＮｏ）、仮想ノードｉ「１００１」も範囲（１０１０，１１０１］に存在しないため（ステップＳ４０３のＮｏ）、ピア５１２のｓｕｃｃｅｓｓｏｒであるピア５１３にメッセージが転送される（ステップＳ４０７）。このピア５１３では、論理識別子ｋｅｙの値「０１１１」が範囲（０１１０，１００１］に存在するため（ステップＳ４０１のＹｅｓ）、そのｓｕｃｃｅｓｓｏｒが論理識別子ｋｅｙの値「０１１１」を管理していると判定する。そして、ピア５１３のメッセージ転送手段３１３は、検索結果を検索元のピア５１６に返す（ステップＳ４０２）。
【００３９】
このようにして、この第２の従来技術では、ノード数が図１８に示したように論理識別子空間のサイズ分存在しない場合でも、定数次数と対数ホップ数を実現している。なお、定数次数とは全てのピアが他ピアのアドレスを認識する数は、ピアの総数によらず一定であることであり、対数ホップ数とは、あるピアからメッセージを転送して、あて先に到達するまでのホップ数が、ピアの総数ｎとしたときにＯ（ｌｏｇ（ｎ））であることを指す。
【００４０】
【非特許文献１】Ｍ．  Ｆｒａｎｓ  Ｋａａｓｈｏｅｋ  ａｎｄ  Ｄａｖｉｄ  Ｒ．  Ｋａｒｇｅｒ，“Ｋｏｏｒｄｅ：  Ａ  ｓｉｍｐｌｅ  ｄｅｇｒｅｅ−ｏｐｔｉｍａｌ  ｄｉｓｔｒｉｂｕｔｅｄ  ｈａｓｈ  ｔａｂｌｅ”
【発明の開示】
【発明が解決しようとする課題】
【００４１】
しかし、上述した従来のデータ検索方式では、完全一致検索しかできず、範囲検索ができない。従来のデータ検索方式は、データ格納先の論理識別子が一つのみであり、複数の論理識別子を含む集合を扱うことができないためである。
【００４２】
本発明は、上記のような課題を解決するためになされたものであり、定数次数と対数ホップ数を実現するデータ検索方式でありながら範囲検索ができるデータ検索装置、データ検索システム、データ検索方法およびデータ検索用プログラムを提供することを目的とする。
【課題を解決するための手段】
【００４３】
以上の目的を達成するため、本発明のデータ検索装置は、ネットワーク上に配置され、他の装置と共有するデータを検索するデータ検索装置であって、検索要求された論理識別子範囲の分割条件が成立した場合に、自身の論理識別子とサクセサの論理識別子との間の論理識別子で論理識別子範囲を分割する分割手段と、分割手段によって得られた論理識別子範囲を含む検索要求を、該検索要求の転送先条件が成立する同一または異なる装置に転送する検索要求転送手段とを備えたことを特徴とする。
【００４４】
分割手段は、検索要求された論理識別子範囲の分割条件が成立した場合に、論理識別子範囲を該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトする左ビットシフト範囲分割処理を実行するように構成されていてもよい。このような構成によれば、確実にネットワーク上におけるデータの範囲検索を実現することができる。
【００４５】
分割手段は、論理識別子範囲の上限値と下限値の先頭ビットを比較し、両先頭ビットが同一である場合に、論理識別子範囲を左ビットシフトし、両先頭ビットが異なる場合に、左ビットシフト範囲分割処理を実行するように構成されていてもよい。このような構成によれば、論理識別子範囲を先頭ビットが同一であるような複数の論理識別子範囲に確実に分割することができる。
【００４６】
検索要求された論理識別子範囲をサクセサの論理識別子を境界として２つの論理識別子範囲に分割する範囲分割手段を備え、分割手段は、あらかじめ設定された仮想ノードが自身の論理識別子とサクセサの論理識別子との間に含まれている場合に、範囲分割手段によって分割された２つの論理識別子範囲のうちの上位側の論理識別子範囲に対して左ビットシフト範囲分割処理を実行し、検索要求転送手段は、検索対象の論理識別子範囲とともに仮想ノードを含む検索要求を転送するように構成されていてもよい。このような構成によれば、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上でのデータの範囲検索を確実に実行することができる。
【００４７】
分割手段は、検索要求された論理識別子範囲を、自身の論理識別子とサクセサとの間の特定範囲で、論理識別子範囲をもとに２つの論理識別子範囲に分割する第１分割手段と、第１分割手段によって分割された論理識別子範囲のうち特定範囲に含まれない論理識別子範囲を、特定範囲で、あらかじめ設定された仮想範囲をもとに分割する第２分割手段と、第２分割手段によって分割された論理識別子範囲のうち特定範囲に含まれる論理識別子範囲を左ビットシフトするとともに、シフト回数を増加させる範囲左ビットシフト手段とを含み、検索要求転送手段は、検索対象の論理識別子範囲とともに仮想範囲とシフト回数を含む検索要求を転送するように構成されていてもよい。このような構成によれば、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上での範囲検索を実現することができるとともに、範囲検索を実行する際のオーバレイネットワーク上の各装置が扱うデータ量を削減することができる。
【００４８】
本発明のデータ検索システムは、ネットワーク上に配置された複数の端末を備え、各端末間で共有するデータを検索するデータ検索システムであって、各端末は、検索要求された論理識別子範囲の分割条件が成立した場合に、自身の論理識別子とサクセサの論理識別子との間の論理識別子で論理識別子範囲を分割する分割手段と、分割手段によって得られた論理識別子範囲を含む検索要求を、該検索要求の転送先条件が成立する同一または異なる装置に転送する検索要求転送手段とを備えたことを特徴とする。
【００４９】
本発明のデータ検索方法は、ネットワーク上に配置された、他の装置とデータを共有する端末の制御部が制御プログラムに従って、検索要求された論理識別子範囲の分割条件が成立した場合に、自身の論理識別子とサクセサの論理識別子との間の論理識別子で論理識別子範囲を分割する分割ステップと、分割ステップによって得られた論理識別子範囲を含む検索要求を、該検索要求の転送先条件が成立する同一または異なる装置に転送する検索要求転送ステップとを実行することを特徴とする。
【００５０】
分割ステップにおいて、検索要求された論理識別子範囲の分割条件が成立した場合に、論理識別子範囲を該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトする左ビットシフト範囲分割処理を実行するように構成されていてもよい。このような構成によれば、確実にネットワーク上におけるデータの範囲検索を実現することができる。
【００５１】
分割ステップにおいて、論理識別子範囲の上限値と下限値の先頭ビットを比較し、両先頭ビットが同一である場合に、論理識別子範囲を左ビットシフトし、両先頭ビットが異なる場合に、左ビットシフト範囲分割処理を実行するように構成されていてもよい。このような構成によれば、論理識別子範囲を先頭ビットが同一であるような複数の論理識別子範囲に確実に分割することができる。
【００５２】
検索要求された論理識別子範囲をサクセサの論理識別子を境界として２つの論理識別子範囲に分割する範囲分割ステップを実行し、分割ステップにおいて、あらかじめ設定された仮想ノードが自身の論理識別子とサクセサの論理識別子との間に含まれている場合に、範囲分割ステップによって分割された２つの論理識別子範囲のうちの上位側の論理識別子範囲に対して左ビットシフト範囲分割処理を実行し、検索要求転送ステップにおいて、検索対象の論理識別子範囲とともに仮想ノードを含む検索要求を転送するように構成されていてもよい。このような構成によれば、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上でのデータの範囲検索を確実に実行することができる。
【００５３】
分割ステップにおいて、検索要求された論理識別子範囲を、自身の論理識別子とサクセサとの間の特定範囲で、論理識別子範囲をもとに２つの論理識別子範囲に分割する第１分割ステップと、第１分割ステップによって分割された論理識別子範囲のうち特定範囲に含まれない論理識別子範囲を、特定範囲で、あらかじめ設定された仮想範囲をもとに分割する第２分割ステップと、第２分割ステップによって分割された論理識別子範囲のうち特定範囲に含まれる論理識別子範囲を左ビットシフトするとともに、シフト回数を増加させる範囲左ビットシフトステップとを実行し、検索要求転送ステップにおいて、検索対象の論理識別子範囲とともに仮想範囲とシフト回数を含む検索要求を転送するように構成されていてもよい。このような構成によれば、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上での範囲検索を実現することができるとともに、範囲検索を実行する際のオーバレイネットワーク上の各装置が扱うデータ量を削減することができる。
【００５４】
本発明のデータ検索用プログラムは、ネットワーク上に配置されたコンピュータが他のコンピュータと共有するデータを検索するためのデータ検索用プログラムであって、検索要求された論理識別子範囲の分割条件が成立した場合に、自身の論理識別子とサクセサの論理識別子との間の論理識別子で論理識別子範囲を分割する分割処理と、分割処理によって得られた論理識別子範囲を含む検索要求を、該検索要求の転送先条件が成立する同一または異なる装置に転送する検索要求転送処理とをコンピュータに実行させることを特徴とする。
【００５５】
分割処理において、検索要求された論理識別子範囲の分割条件が成立した場合に、論理識別子範囲を該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトする左ビットシフト範囲分割処理を実行するように構成されていてもよい。このような構成によれば、確実にネットワーク上におけるデータの範囲検索を実現することができる。
【００５６】
分割処理において、論理識別子範囲の上限値と下限値の先頭ビットを比較し、両先頭ビットが同一である場合に、論理識別子範囲を左ビットシフトし、両先頭ビットが異なる場合に、論理識別子範囲を該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトするように構成されていてもよい。このような構成によれば、論理識別子範囲を先頭ビットが同一であるような複数の論理識別子範囲に確実に分割することができる。
【００５７】
検索要求された論理識別子範囲をサクセサの論理識別子を境界として２つの論理識別子範囲に分割する範囲分割処理をコンピュータに実行させるとともに、分割処理において、あらかじめ設定された仮想ノードが自身の論理識別子とサクセサの論理識別子との間に含まれている場合に、範囲分割処理によって分割された２つの論理識別子範囲のうちの上位側の論理識別子範囲について該範囲の先頭ビットが同一であるような複数の論理識別子範囲に分割し、分割した複数の論理識別子範囲を左ビットシフトし、検索要求転送処理において、検索対象の論理識別子範囲とともに仮想ノードを含む検索要求を転送するように構成されていてもよい。このような構成によれば、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上でのデータの範囲検索を確実に実行することができる。
【００５８】
分割処理において、検索要求された論理識別子範囲を、自身の論理識別子とサクセサとの間の特定範囲で、論理識別子範囲をもとに２つの論理識別子範囲に分割する第１分割処理と、第１分割処理によって分割された論理識別子範囲のうち特定範囲に含まれない論理識別子範囲を、特定範囲で、あらかじめ設定された仮想範囲をもとに分割する第２分割処理と、第２分割処理によって分割された論理識別子範囲のうち特定範囲に含まれる論理識別子範囲を左ビットシフトするとともに、シフト回数を増加させる範囲左ビットシフト処理とを実行し、検索要求転送処理において、検索対象の論理識別子範囲とともに仮想範囲とシフト回数を含む検索要求を転送するように構成されていてもよい。このような構成によれば、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上での範囲検索を実現することができるとともに、範囲検索を実行する際のオーバレイネットワーク上の各装置が扱うデータ量を削減することができる。
【発明の効果】
【００５９】
以上のように、本発明によれば、定数次数と対数ホップ数を有するオーバレイデータ検索方式において、データの範囲検索を確実に行うことができる。範囲検索を実現するには、検索実行者が指定した検索式を満たす要素の集合（論理識別子範囲）を検索対象とする必要があるが、複数の論理識別子を含んだ範囲を適宜分割しながら、当該範囲に属する論理識別子を担うピア（ノード）に到達するように、メッセージ（検索要求）を転送できるためである。
【発明を実施するための最良の形態】
【００６０】
以下、本発明の実施の一形態を図面を参照して説明する。
【００６１】
実施の形態１．
図１は、この実施の形態１におけるデータ検索システムの構成を示すブロック図である。図１に示すように、実施の形態１におけるデータ検索システムは、ネットワーク１００上でのアドレスを有する複数のノード１１０，１２０，１３０から構成される。図１には、ネットワーク１００に接続されているノードはノード１１０，１２０，１３０だけであるが、ほかにも複数のノードがネットワーク１００に接続されている。各ノードは、例えばサーバやパーソナルコンピュータなどの計算機（端末）で実現されている。
【００６２】
図１に示すように、ノード１１０は、通信インタフェース（通信ＩＦ）１１１と、ユーザインタフェース（ユーザＩＦ）１１２と、ハードディスク（ＨＤ）１１３と、メモリ１１４と、ＣＰＵ１１５とを備えている。なお、ノード１１０以外のノード１２０，１３０も、ノード１１０と同一の構成を備えている。また、通信ＩＦ１１１やユーザＩＦ１１２などの各部の構成はバスで接続されている。
【００６３】
図１に示す構成において、通信ＩＦ１１１は、ネットワーク１００と接続され、データの送受信を制御するインタフェースである。ユーザＩＦ１１２は、ユーザに対する情報の表示や、ユーザのデータ入力を受け付けるインタフェースである。図１に示すように、ユーザＩＦ１１２は、ユーザが入力操作可能な入力部１１６と接続され、入力部１１６からのデータ入力を受け付ける。なお、図１に示す例では、ノード１１０と入力部１１６とを別構成としているが、入力部１１６がノード１１０の構成として設けられていてもよい。
【００６４】
ＨＤ１１３は、制御プログラム（データ検索用プログラム）や各種データを格納する記憶媒体（外部記憶装置）である。なお、図１に示す例では、記憶媒体としてＨＤ１１３を示しているが、光磁気ディスクなどの記憶媒体であってもよい。メモリ１１４は、ＣＰＵ１１５が直接アクセスする制御プログラムやデータを記憶する記憶装置（主記憶装置）である。ＣＰＵ１１５は、制御プログラムに従って各々の処理を実行する中央処理装置である。
【００６５】
次に、この実施の形態１におけるデータ検索システムの動作について説明する。
【００６６】
なお、この実施の形態１において、論理識別子範囲は、範囲検索対象の論理識別子の範囲である。そして、最大論理識別子とは、当該論理識別子範囲の上限値に相当する。また、最小論理識別子とは、当該論理識別子範囲の下限値に相当する。また、シフト後論理識別子範囲は、左ビットシフトされた後の論理識別子範囲である。そして、シフト後最大論理識別子は、最大論理識別子をビットシフトして得られる値である。また、シフト後最小論理識別子は、最小論理識別子をビットシフトして得られる値である。
【００６７】
図２は、この実施の形態１のデータ検索手順を示すフローチャートである。なお、図２に示すデータ検索手順は、ノードｍにおいて、論理識別子範囲ｉｄＲａｎｇｅｓを探す手順が非同期処理であるとした場合の処理手順である。
【００６８】
ユーザは、論理識別子範囲ｉｄＲａｎｇｅｓで指定される範囲のデータを取得する場合、入力部１１６を介して論理識別子範囲ｉｄＲａｎｇｅｓを指定した検索要求をノードｍ（論理識別子ｍのノード）に入力する。そして、検索要求に応じて、ノードｍにおいて図２に示すデータ検索処理が実行される。
【００６９】
図２に示すデータ検索手順が実行されると、まず、ノードｍのＣＰＵ１１５は、論理識別子範囲ｉｄＲａｎｇｅｓに含まれる論理識別子が当該ノードｍの論理識別子のみが含まれるか否かを判定する（ステップＳ７０１）。この判定は、論理識別子範囲に含まれる最大論理識別子と最小論理識別子を用いて判定される。判定結果として、ノードｍの論理識別子のみであると判定された場合は（ステップＳ７０１のＹｅｓ）、ノードｍのＣＰＵ１１５は、自身が検索要求された論理識別子範囲のデータを持つノードであると判断する。そして、ノードｍのＣＰＵ１１５は、検索要求に応じて図２に示す処理を初期に実行したノードに、ノードｍを検索結果として返す（ステップＳ７０２）。
【００７０】
なお、ここでは、図２に示す処理を初期に実行したノードが自身であるため、図２に示す処理を初期に実行したノードへのポインタ情報を省略しているが、図２に示すデータ検索処理の実行に当たっては、そのポインタ情報が引き継がれるものととし、ステップＳ７０２ではそのポインタ情報を用いて、初期のノードに対して検索結果が返される。
【００７１】
ステップＳ７０１の判定結果にて、ｍの論理識別子のみではないと判定された場合には（ステップＳ７０１のＮｏ）、ノードｍのＣＰＵ１１５は、論理識別子範囲ｉｄＲａｎｇｅｓに対して、図３のフローチャートで示される左ビットシフト範囲分割処理の手順を実行し、分割後の論理識別子範囲Ｒａｎｇｅ０と論理識別子範囲Ｒａｎｇｅ１を取得する（ステップＳ７０３）。
【００７２】
ステップＳ７０３で取得された論理識別子範囲Ｒａｎｇｅ０がＮｕｌｌでない場合には（ステップＳ７０４のＮｏ）、ノードｍのＣＰＵ１１５は、ノードｍの０側次ノードを取り出し、このノードにて、論理識別子範囲Ｒａｎｇｅ０を探す処理を非同期に実行する（ステップＳ７０５）。このステップＳ７０５の処理は、図２に示すデータ検索処理の手順と同一であり、再帰的に実行される。
【００７３】
ステップＳ７０５の処理を非同期実行後、あるいはステップＳ７０４にて論理識別子範囲Ｒａｎｇｅ０がＮｕｌｌであるとされた場合には（ステップＳ７０４のＹｅｓ）、ノードｍのＣＰＵ１１５は、論理識別子範囲Ｒａｎｇｅ１がＮｕｌｌであるか否かを判定する（ステップＳ７０６）。ここで、論理識別子範囲Ｒａｎｇｅ１がＮｕｌｌであると判定しなかった場合には（ステップＳ７０６のＮｏ）、ノードｍのＣＰＵ１１５は、ノードｍの１側次ノードを取り出し、このノードにて、論理識別子範囲Ｒａｎｇｅ１を探す処理を非同期に実行する（ステップＳ７０７）。このステップＳ７０７の処理も、図２に示すデータ検索処理の手順と同一であり、再帰的に実行される。
【００７４】
ステップＳ７０７の処理を非同期実行後、あるいはステップＳ７０６にて論理識別子範囲Ｒａｎｇｅ１がＮｕｌｌであると判定された場合には（ステップＳ７０６のＹｅｓ）、図２に示す処理が終了する。このような手順により、論理識別子範囲ｉｄＲａｎｇｅｓは逐次分割され、目的とするノードに到達すると、その結果が初期に実行したノードに返される。
【００７５】
図３は、左ビットシフト範囲分割処理の手順を示すフローチャートである。図３に示す左ビットシフト範囲分割処理において、ノードｍのＣＰＵ１１５は、論理識別子範囲ｉｄＲａｎｇｅｓが与えられると、論理識別子範囲ｉｄＲａｎｇｅｓに含まれる、ビットシフト対象の最大論理識別子とビットシフト対象の最小論理識別子とを取り出し（ステップＳ６０１）、これらの先頭ビットが同一か否か判定する（ステップＳ６０２）。
【００７６】
同一である場合に（ステップＳ６０２のＹｅｓ）、その先頭ビットが１である場合には（ステップＳ６０６のＹｅｓ）、ステップＳ６０７の処理を実行して、処理を終了する。先頭ビットが０である場合には（ステップＳ６０６のＮｏ）、ステップＳ６０８の処理を実行して、処理を終了する。
【００７７】
先頭ビットが１である場合のステップＳ６０７の処理では、ＣＰＵ１１５は、論理識別子範囲ｉｄＲａｎｇｅｓ内の論理識別子を全て左ビットシフトして、新たな論理識別子範囲Ｒａｎｇｅ１に与え、他の新たな論理識別子範囲Ｒａｎｇｅ０にはＮｕｌｌに与える。
【００７８】
先頭ビットが０である場合のステップＳ６０８の処理では、ＣＰＵ１１５は、論理識別子範囲ｉｄＲａｎｇｅｓ内の論理識別子を全て左ビットシフトして、新たな論理識別子範囲Ｒａｎｇｅ０に与え、他の新たな論理識別子範囲Ｒａｎｇｅ１にはＮｕｌｌを与える。
【００７９】
なお、Ｎｕｌｌが与えられた論理識別子範囲は実質存在しないことと同一であるため、ステップＳ６０２において先頭ビットが同一であると判定された場合は（ステップＳ６０２のＹｅｓ）、与えられた論理識別子範囲ｉｄＲａｎｇｅｓは分割されないと解釈してよい。
【００８０】
ステップＳ６０２において先頭ビットが同一でないと判定された場合には（ステップＳ６０２のＮｏ）、ＣＰＵ１１５は、論理識別子範囲ｉｄＲａｎｇｅｓに含まれるビットシフト対象の論理識別子範囲の先頭ビットが同一であるような複数集合（複数の論理識別子範囲）に分割し、これを返す。
【００８１】
すなわち、図３に示すように、ＣＰＵ１１５は、１側最小論理識別子と０側最大論理識別子を生成する（ステップＳ６０３）。ここで、１側最小論理識別子とは、先頭ビットが１でそれ以降のビットが０である論理識別子である。また、０側最大論理識別子とは、先頭ビットが０でそれ以降のビットが１である論理識別子である。
【００８２】
次に、ＣＰＵ１１５は、新たな論理識別子範囲Ｒａｎｇｅ１に１側最小論理識別子以上の論理識別子範囲ｉｄＲａｎｇｅｓを入力し、別の新たな論理識別子範囲Ｒａｎｇｅ０に０側最大論理識別子以下の論理識別子範囲ｉｄＲａｎｇｅｓを入力する（ステップＳ６０４）。このようにして、左ビットシフト範囲分割処理では、最大論理識別子と最小論理識別子の先頭ビットの違いにより論理識別子範囲を分割する。
【００８３】
そして、ＣＰＵ１１５は、新たな論理識別子範囲Ｒａｎｇｅ０，１の論理識別子をそれぞれ左ビットシフトする（ステップＳ６０５）。なお、図３に示す例では、論理識別子範囲ｉｄＲａｎｇｅｓを論理識別子範囲Ｒａｎｇｅ０，１に分割した後に左ビットシフトする処理を実行しているが、論理識別子範囲ｉｄＲａｎｇｅｓを左ビットシフトした後に論理識別子範囲Ｒａｎｇｅ０，１に分割するようにしてもよい。また、論理識別子範囲ｉｄＲａｎｇｅｓを論理識別子範囲Ｒａｎｇｅ０，１に分割すると同時に左ビットシフトする処理を実行するようにしてもよい。
【００８４】
次に、この実施の形態１におけるデータ検索システムの動作の具体例（データ検索処理の手順の具体例）について、図４および図５を用いて説明する。
【００８５】
図４は、この実施の形態１におけるｄｅ  Ｂｒｕｉｊｎグラフを示す説明図である。また、図５は、この実施の形態１における左ビットシフト範囲分割処理のアルゴリズムを視覚的に示す説明図である。
【００８６】
図４に示すように、論理識別子が与えらたノードがネットワーク内に存在するものとし、論理識別子１３（２進数表示で「１１０１」）であるノード４１３が、データの論理識別子範囲が［７，１１］であるデータを取得するものとする。
【００８７】
この論理識別子に相当するノードは、図４では、論理識別子７（２進数表示で「０１１１」）がノード４０７、論理識別子８（２進数表示で「１０００」）がノード４０８、論理識別子９（２進数表示で「１００１」）がノード４０９、論理識別子１０（２進数表示で「１０１０」）がノード４１０、論理識別子１１（２進数表示で「１０１１」）がノード４１１となる。これらのノードは、ネットワーク内に散在しているが、この実施の形態１で示した手順により、これら散在するノードからのデータ取得を可能とする。
【００８８】
図５の１２０１に記載の論理識別子範囲は、検索要求された論理識別子範囲［７，１１］であって、左ビットシフト前の最大論理識別子と左ビットシフト前の最小論理識別子のビット列を木構造で表記している。また、図５の１２０２〜１２１３に記載の論理識別子範囲は、シフト後最大論理識別子とシフト後最小論理識別子のビット列を木構造で表記している。また、図５の１２０１〜１２１３に記載の論理識別子範囲におけるＭｉｎ．以降には、ビット列に対応する最小論理識別子の値の１０進数表記と、その横の（）内にシフトが行われていない最小論理識別子の値の１０進数表記とを表記している。さらに、図５の１２０１〜１２１３に記載の論理識別子範囲におけるＭａｘ．以降には、ビット列に対応する最大論理識別子の値の１０進数表記と、その横の（）内にシフトが行われていない最大論理識別子の値の１０進数表記とを表記している。また、木構造のＲｏｏｔの左には、その木構造のビットシフト前の先頭ビットを示している。
【００８９】
まず、ノード４１３では、図５の１２０１に記載の論理識別子範囲［７，１１］を探す処理を行う。図２に示すステップＳ７０１において、ノード４１３のＣＰＵ１１５は、論理識別子範囲［７，１１］内にノード４１３の論理識別子「１１０１」のみが含まれるか否かを判定する（ステップＳ７０１）。しかし、上記の例では、ノード４１３の論理識別子「１１０１」は論理識別子範囲［７，１１］（最小論理識別子「０１１１」と最大論理識別子「１０１１」の範囲）に含まれないので、ステップＳ７０１の条件は成り立たない（ステップＳ７０１のＮｏ）。従って、ノード４１３のＣＰＵ１１５は、論理識別子範囲［７，１１］に対して、左ビットシフトを行い、論理識別子範囲［７，７］（図５の１２０３）と論理識別子範囲［８，１１］（図５の１２０２）に分割する（ステップＳ７０３）。
【００９０】
具体的には、ノード４１３のＣＰＵ１１５が図３に示した処理を実行して論理識別子範囲を複数の論理識別子範囲に分割する。すなわち、ノード４１３のＣＰＵ１１５は、論理識別子範囲［７，１１］に含まれる最大論理識別子の先頭ビットと最小論理識別子の先頭ビットとを取り出す（ステップＳ６０１）。ここでは、最大論理識別子「１０１１」の先頭ビット「１」が取り出され、最小論理識別子「０１１１」の先頭ビット「０」が取り出される。
【００９１】
そして、ＣＰＵ１１５は、最大論理識別子の先頭ビットと最小論理識別子の先頭ビットが同一であるか否かを判定する（ステップＳ６０２）。上記の例では、各々の先頭ビットが「１」と「０」であって同一でないので（ステップＳ６０２のＮｏ）、ＣＰＵ１１５は、１側最小論理識別子と０側最大論理識別子を生成する（ステップＳ６０３）。ここで、１側最小論理識別子は「１０００」であり、０側最大論理識別子は「０１１１」である。
【００９２】
次いで、ＣＰＵ１１５は、新たな論理識別子範囲Ｒａｎｇｅ１に、論理識別子範囲［７，１１］の中で１側最小論理識別子「１０００」以上の論理識別子範囲を入力し、別の新たな論理識別子範囲Ｒａｎｇｅ０に、論理識別子範囲［７，１１］の中で０側最大論理識別子「０１１１」以下の論理識別子範囲を入力する（ステップＳ６０４）。上記の例では、論理識別子範囲［７，１１］のうち、１側最小論理識別子「１０００」以上の論理識別子範囲［８，１１］が新たな論理識別子範囲Ｒａｎｇｅ１に入力される。また、論理識別子範囲［７，１１］のうち、０側最大論理識別子「０１１１」以下の論理識別子範囲［７，７］が別の新たな論理識別子範囲Ｒａｎｇｅ０に入力される。このようにして、左ビットシフト範囲分割処理では、先頭ビットの違いにより論理識別子範囲［７，１１］を論理識別子範囲［７，７］と論理識別子範囲［８，１１］に分割する。
【００９３】
そして、ノード４１３のＣＰＵ１１５は、新たな論理識別子範囲Ｒａｎｇｅ０（論理識別子範囲［７，７］）内の論理識別子を全て左ビットシフトするとともに、新たな論理識別子範囲Ｒａｎｇｅ１（論理識別子範囲［８，１１］）内の論理識別子を全て左ビットシフトする（ステップＳ６０５）。このようにして、左ビットシフトされた分割後の論理識別子範囲Ｒａｎｇｅ０（図５の１２０３）と論理識別子範囲Ｒａｎｇｅ１（図５の１２０２）を取得する。
【００９４】
次いで、ノード４１３のＣＰＵ１１５は、ステップＳ７０３で分割された新たな論理識別子範囲Ｒａｎｇｅ０（論理識別子範囲［７，７］）がＮｕｌｌであるかどうかを判定する（ステップＳ７０４）。上記の例では、論理識別子範囲Ｒａｎｇｅ０がＮｕｌｌではないので（ステップＳ７０４のＮｏ）、ＣＰＵ１１５は、ノード４１３の０側次ノードであるノード４１０にメッセージを転送して、そのノード４１０において論理識別子範囲Ｒａｎｇｅ０を検索させる（ステップＳ７０５）。
【００９５】
また、ノード４１３のＣＰＵ１１５は、ステップＳ７０３で分割された新たな論理識別子範囲Ｒａｎｇｅ１（論理識別子範囲［８，１１］）がＮｕｌｌであるかどうかを判定する（ステップＳ７０６）。この場合も、上記の例では、論理識別子範囲Ｒａｎｇｅ１がＮｕｌｌではないので（ステップＳ７０６のＮｏ）、ＣＰＵ１１５は、ノード４１３の１側次ノードであるノード４１１にメッセージを転送して、そのノード４１１において論理識別子範囲Ｒａｎｇｅ１を検索させる（ステップＳ７０７）。
【００９６】
次に、ノード４１１では、図５の１２０２に記載の論理識別子範囲［８，１１］を探す処理を行う。ノード４１３から論理識別子範囲［８，１１］の範囲検索要求を受け付けたノード４１１は、論理識別子範囲［８，１１］に自身のノードの論理識別子「１０１１」のみが含まれるかどうかを判定する（ステップＳ７０１）。
【００９７】
論理識別子範囲［８，１１］はノード４１１の論理識別子「１０１１」のみを含むものではないため（ステップＳ７０１のＮｏ）、ノード４１１のＣＰＵ１１５は、論理識別子範囲［８，１１］に対して、左ビットシフトを行い、複数の論理識別子範囲に分割する処理（図３に示す左ビットシフト範囲分割処理）を実行する（ステップＳ７０３）。しかし、ここでは、論理識別子範囲も上限値と下限値の先頭ビットが同一であるため、２つには分割されない。
【００９８】
具体的には、ノード４１１のＣＰＵ１１５は、論理識別子範囲［８，１１］に含まれる最大論理識別子の先頭ビットと最小論理識別子の先頭ビットとを取り出す（ステップＳ６０１）。ここでは、図５の論理識別子範囲１２０２に示すように、最大論理識別子「０１１０」の先頭ビット「０」が取り出され、最小論理識別子「００００」の先頭ビット「０」が取り出される。
【００９９】
そして、ＣＰＵ１１５は、最大論理識別子の先頭ビットと最小論理識別子の先頭ビットが同一であるか否かを判定する（ステップＳ６０２）。上記の例では、各々の先頭ビットがいずれも「０」であって同一である（ステップＳ６０２のＹｅｓ）。従って、ＣＰＵ１１５は、先頭ビットが「０」であると判定し（ステップＳ６０６のＮｏ）、論理識別子範囲（図５の１２０２）内の論理識別子を左ビットシフトする処理を実行し、左ビットシフトした論理識別子範囲を新たな論理識別子範囲Ｒａｎｇｅ０に入力し、別の新たな論理識別子範囲Ｒａｎｇｅ１にＮｕｌｌを入力する（ステップＳ６０８）。
【０１００】
その後、ノード４１１のＣＰＵ１１５は、ビットシフトのみ行われた新たな論理識別子範囲Ｒａｎｇｅ０（図５の１２０４）がＮｕｌｌであるかどうかを判定する（ステップＳ７０４）。このとき、論理識別子範囲Ｒａｎｇｅ０はＮｕｌｌではないので（ステップＳ７０４のＮｏ）、ＣＰＵ１１５は、ノード４１１の０側次ノードであるノード４０６にメッセージを転送して、そのノード４０６において論理識別子範囲Ｒａｎｇｅ０を検索させる（ステップＳ７０５）。
【０１０１】
なお、ノード４１１のＣＰＵ１１５は、新たな論理識別子範囲Ｒａｎｇｅ１に対してもＮｕｌｌであるかどうかを判定するが（ステップＳ７０６）、論理識別子範囲Ｒａｎｇｅ１はＮｕｌｌであるため（ステップＳ７０６のＹｅｓ）、ステップＳ７０７の処理を実行しない。
【０１０２】
次に、ノード４１０では、図５の１２０３に記載の論理識別子範囲［７，７］を探す処理を行う。ノード４１３から論理識別子範囲［７，７］の範囲検索要求を受け付けたノード４１０は、論理識別子範囲［７，７］に自身のノードの論理識別子「１０１０」のみが含まれるかどうかを判定する（ステップＳ７０１）。
【０１０３】
論理識別子範囲［７，７］はノード４１０の論理識別子「１０１０」のみを含むものではないため（ステップＳ７０１のＮｏ）、ノード４１０のＣＰＵ１１５は、論理識別子範囲［７，７］に対して、左ビットシフトを行い、複数の論理識別子範囲に分割する処理（図３に示す左ビットシフト範囲分割処理）を実行する（ステップＳ７０３）。しかし、ここでは、論理識別子範囲も上限値と下限値の先頭ビットが同一であるため、２つには分割されない。
【０１０４】
具体的には、ノード４１０のＣＰＵ１１５は、論理識別子範囲［７，７］に含まれる最大論理識別子の先頭ビットと最小論理識別子の先頭ビットとを取り出す（ステップＳ６０１）。ここでは、図５の論理識別子範囲１２０３に示すように、最大論理識別子と最小論理識別子はいずれも「１１１０」であり、その先頭ビット「１」が取り出される。
【０１０５】
そして、ＣＰＵ１１５は、最大論理識別子の先頭ビットと最小論理識別子の先頭ビットが同一であるか否かを判定する（ステップＳ６０２）。上記の例では、各々の先頭ビットがいずれも「１」であって同一である（ステップＳ６０２のＹｅｓ）。従って、ＣＰＵ１１５は、先頭ビットが「１」であると判定し（ステップＳ６０６のＹｅｓ）、論理識別子範囲（図５の１２０３）内の論理識別子を左ビットシフトする処理を実行し、左ビットシフトした論理識別子範囲を新たな論理識別子範囲Ｒａｎｇｅ１に入力し、別の新たな論理識別子範囲Ｒａｎｇｅ０にＮｕｌｌを入力する（ステップＳ６０７）。
【０１０６】
その後、ノード４１０のＣＰＵ１１５は、ビットシフトのみ行われた新たな論理識別子範囲Ｒａｎｇｅ１（図５の１２０５）がＮｕｌｌであるかどうかを判定する（ステップＳ７０６）。このとき、論理識別子範囲Ｒａｎｇｅ１はＮｕｌｌではないので（ステップＳ７０６のＮｏ）、ＣＰＵ１１５は、ノード４１０の１側次ノードであるノード４０５にメッセージを転送して、そのノード４０５において論理識別子範囲Ｒａｎｇｅ１を検索させる（ステップＳ７０７）。
【０１０７】
なお、ノード４１０のＣＰＵ１１５は、新たな論理識別子範囲Ｒａｎｇｅ０に対してもＮｕｌｌであるかどうかを判定するが（ステップＳ７０４）、論理識別子範囲Ｒａｎｇｅ０はＮｕｌｌであるため（ステップＳ７０４のＹｅｓ）、ステップＳ７０５の処理を実行しない。
【０１０８】
次に、ノード４０６では、図５の１２０４に記載の論理識別子範囲［８，１１］を探す処理を行う。図２に示すステップＳ７０１において、ノード４０６のＣＰＵ１１５は、論理識別子範囲［８，１１］内にノード４０６の論理識別子「０１１０」のみが含まれるか否かを判定する（ステップＳ７０１）。しかし、上記の例では、論理識別子範囲［８，１１］はノード４０６の論理識別子「０１１０」のみを含むものではないので（ステップＳ７０１のＮｏ）、ノード４０６のＣＰＵ１１５は、論理識別子範囲［８，１１］に対して、左ビットシフトを行い、論理識別子範囲［８，９］（図５の１２０７）と論理識別子範囲［１０，１１］（図５の１２０６）に分割する（ステップＳ７０３）。
【０１０９】
具体的には、ノード４０６のＣＰＵ１１５が図３に示した処理を実行して論理識別子範囲を複数の論理識別子範囲に分割する。すなわち、ノード４０６のＣＰＵ１１５は、論理識別子範囲［８，１１］に含まれる最大論理識別子の先頭ビットと最小論理識別子の先頭ビットとを取り出す（ステップＳ６０１）。ここでは、最大論理識別子「１０００」の先頭ビット「１」が取り出され、最小論理識別子「００００」の先頭ビット「０」が取り出される。
【０１１０】
そして、ＣＰＵ１１５は、最大論理識別子の先頭ビットと最小論理識別子の先頭ビットが同一であるか否かを判定する（ステップＳ６０２）。上記の例では、各々の先頭ビットが「１」と「０」であって同一でないので（ステップＳ６０２のＮｏ）、ＣＰＵ１１５は、１側最小論理識別子と０側最大論理識別子を生成する（ステップＳ６０３）。
【０１１１】
ここで、１側最小論理識別子は「１０１０」（１０進数表記で「１０」）となる。すなわち、図５の１２０４に記載の論理識別子範囲は以前に２回ビットシフトされている（シフトカウントが「２」である）。２回のビットシフトで取り出された（はじき出された）値はそれぞれ「１」と「０」である（図５の１２０２で「１」が取り出され、図５の１２０４で「０」が取り出されている）。このことから、ビットシフトされる前の１側の論理識別子範囲の値は「１０１＊」（「＊」は「０」または「１」）となる。従って、１側最小論理識別子は「１０１０」となる。
【０１１２】
また、０側最大論理識別子は「１００１」（１０進数表記で「９」）となる。すなわち、図５の１２０４に記載の論理識別子範囲は以前に２回ビットシフトされている（シフトカウントが「２」である）。２回のビットシフトで取り出された（はじき出された）値はそれぞれ「１」と「０」である（図５の１２０２で「１」が取り出され、図５の１２０４で「０」が取り出されている）。このことから、ビットシフトされる前の０側の論理識別子範囲の値は「１００＊」（「＊」は「０」または「１」）となる。従って、０側最大論理識別子は「１００１」となる。
【０１１３】
次いで、ＣＰＵ１１５は、新たな論理識別子範囲Ｒａｎｇｅ１に、論理識別子範囲［８，１１］の中で１側最小論理識別子「１０１０」以上の論理識別子範囲を入力し、別の新たな論理識別子範囲Ｒａｎｇｅ０に、論理識別子範囲［８，１１］の中で０側最大論理識別子「１００１」以下の論理識別子範囲を入力する（ステップＳ６０４）。上記の例では、論理識別子範囲［８，１１］のうち、１側最小論理識別子「１０１０」以上の論理識別子範囲［１０，１１］が新たな論理識別子範囲Ｒａｎｇｅ１に入力される。また、論理識別子範囲［８，１１］のうち、０側最大論理識別子「１００１」以下の論理識別子範囲［８，９］が別の新たな論理識別子範囲Ｒａｎｇｅ０に入力される。このようにして、左ビットシフト範囲分割処理では、先頭ビットの違いにより論理識別子範囲［８，１１］を論理識別子範囲［８，９］と論理識別子範囲［１０，１１］に分割する。
【０１１４】
そして、ノード４０６のＣＰＵ１１５は、新たな論理識別子範囲Ｒａｎｇｅ０（論理識別子範囲［８，９］）内の論理識別子を全て左ビットシフトするとともに、新たな論理識別子範囲Ｒａｎｇｅ１（論理識別子範囲［１０，１１］）内の論理識別子を全て左ビットシフトする（ステップＳ６０５）。このようにして、左ビットシフトされた分割後の論理識別子範囲Ｒａｎｇｅ０（図５の１２０７）と論理識別子範囲Ｒａｎｇｅ１（図５の１２０６）を取得する。
【０１１５】
次いで、ノード４０６のＣＰＵ１１５は、ステップＳ７０３で分割された新たな論理識別子範囲Ｒａｎｇｅ０（論理識別子範囲［８，９］）がＮｕｌｌであるかどうかを判定する（ステップＳ７０４）。上記の例では、論理識別子範囲Ｒａｎｇｅ０がＮｕｌｌではないので（ステップＳ７０４のＮｏ）、ＣＰＵ１１５は、ノード４０６の０側次ノードであるノード４１２にメッセージを転送して、そのノード４１２において論理識別子範囲Ｒａｎｇｅ０を検索させる（ステップＳ７０５）。
【０１１６】
また、ノード４０６のＣＰＵ１１５は、ステップＳ７０３で分割された新たな論理識別子範囲Ｒａｎｇｅ１（論理識別子範囲［１０，１１］）がＮｕｌｌであるかどうかを判定する（ステップＳ７０６）。この場合も、上記の例では、論理識別子範囲Ｒａｎｇｅ１がＮｕｌｌではないので（ステップＳ７０６のＮｏ）、ＣＰＵ１１５は、ノード４０６の１側次ノードであるノード４１３にメッセージを転送して、そのノード４１３において論理識別子範囲Ｒａｎｇｅ１を検索させる（ステップＳ７０７）。
【０１１７】
以降は同様に、論理識別子範囲［８，９］はノード４１２にて論理識別子範囲［８，８］（図５の１２１２）と論理識別子範囲［９，９］（図５の１２１１）に分割されて、それぞれノード４０８とノード４０９に転送される。論理識別子範囲［１０，１１］もノード４１３にて論理識別子範囲［１０，１０］（図５の１２１０）と論理識別子範囲［１１，１１］（図５の１２０９）に分割され、それぞれノード４１０とノード４１１に転送される。
【０１１８】
一方、ノード４０５に転送された論理識別子範囲［７，７］は、上限値と下限値の先頭ビットは常に同一なので（ステップＳ６０２のＹｅｓ）、論理識別子範囲分割はされず、論理識別子範囲が図５の１２０５から図５の１２０８、図５の１２０８から図５の１２１３というように左ビットシフトを受けながら、ノード４０５からノード４１１へ、ノード４１１からノード４０７へと転送される。
【０１１９】
ノード４０７、ノード４０８、ノード４０９、ノード４１０、ノード４１１に至った論理識別子範囲は、各ノードの論理識別子範囲のみを含むため（図２のステップＳ７０１のＹｅｓ）、各ノードのＣＰＵ１１５は結果を初期に要求を出したノード４１３に返す（ステップＳ７０２）。
【０１２０】
以上に説明したように、この実施の形態１では、検索対象の論理識別子範囲に属する論理識別子を担うノードに、検索メッセージが行き渡るように、先頭ビットの違いによって論理識別子範囲を分割しながら、左ビットシフトを実行し、論理識別子範囲を分割する手法を用いることで、定数次数と対数ホップ数を実現しつつグラフ上での範囲検索を実現することができる。
【０１２１】
実施の形態２．
上記の実施の形態１はオーバレイネットワークに関係なく、ｄｅ  Ｂｒｕｉｊｉｎグラフを用いた理論上の範囲検索のアルゴリズムについての説明であったが、実際には、Ｃｈｏｒｄのハッシュ空間では各ノードは間隔を持って存在しているため（すなわち、例えば論理識別子空間１６（２の４乗）である場合に、論理識別子０〜１５の全てにノードが存在するわけではないため）、全ての論理識別子を持つノードが定義されたｄｅ  Ｂｒｕｉｊｉｎグラフは適用できない。そこで、この実施の形態２ではｄｅ  Ｂｒｕｉｊｉｎ上の論理識別子（ＩＤ）をＣｈｏｒｄハッシュ空間上の仮想ＩＤとし、一つのノードがある区間のＩＤを担当させている。
【０１２２】
図６は、この実施の形態２におけるデータ検索システムの構成を示すブロック図である。図６に示すように、この実施の形態２におけるデータ検索システムは、ネットワーク８００上でのアドレスを有する複数のピア８１０，８２０，８３０から構成される。図６には、ネットワーク８００に接続されているピアはピア８１０，８２０，８３０だけであるが、ほかにも複数のピアがネットワーク８００に接続されている。各ピアは、プログラム制御により動作するサーバなどのコンピュータ（中央処理装置；プロセッサ；データ処理装置）で構成されている（コンピュータのハードウェア構成は図１に示した構成と同様である）。なお、この実施の形態において、ピアとノードとは同義としている。
【０１２３】
図１に示すように、ピア８１０は、ピア論理識別子格納部８１８、ローカルデータ格納部８１１、ルーティングテーブル８１２、メッセージ転送手段８１３、通信手段８１４、範囲分割手段８１５、左ビットシフト範囲分割手段８１６、登録・検索実行手段８１７を備えている。なお、ピア８１０以外のピア８２０，８３０も、ピア８１０と同一の構成を備えている。
【０１２４】
ピア８１０を構成する格納部（ローカルデータ格納部８１１、ルーティングテーブル８１２、ピア論理識別子格納部８１８）には、それぞれ概略つぎのようなデータが格納されている。
【０１２５】
ピア論理識別子格納部８１８には、オーバレイネットワークでの当該ピア（例えばピア８１０）の論理識別子（ノードＩＤともいう）が格納されている。論理識別子はオーバレイネットワーク上における各ピアを識別するための識別子である。
【０１２６】
ローカルデータ格納部８１１には、全ピアで共有するデータ（コンテンツ）のうち当該ピア（例えばピア８１０）が担当するデータが格納される。各ピアがどの部分のデータを担当（管理）するかは、ピア論理識別子格納部８１８に格納された各ピアの論理識別子によって異なる。
【０１２７】
ルーティングテーブル８１２は、各ピアがルーティングを行うときに参照するテーブルである。ルーティングテーブル８１２には、他のピアの論理識別子と、ネットワーク８００上でのアドレス（例えば、Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ（ＩＰ）アドレス）の組が複数格納されている。このルーティングテーブルの管理方式（すなわち、全ピアの中から、どのピアの論理識別子とネットワークアドレスの組を持つか）は、非特許文献１に記載のＫｏｏｒｄｅと同一である。上述したように、ルーティングテーブル８１２には、当該ピアの論理識別子の２倍のｐｒｅｄｅｃｅｓｓｏｒの論理識別子とアドレスの組、および当該ピアのｓｕｃｃｅｓｓｏｒの論理識別子とアドレスの組が格納される。
【０１２８】
ピア８１０を構成する手段（メッセージ転送手段８１３、通信手段８１４、範囲分割手段８１５、左ビットシフト範囲分割手段８１６、登録・検索実行手段８１７）は、それぞれ概略つぎのように動作する。
【０１２９】
範囲分割手段８１５は、与えられた論理識別子範囲を、ルーティングテーブル８１２に格納されたピアの論理識別子を境界値として分割する。この場合、例えば、論理識別子範囲にピアの論理識別子が含まれる場合には、最小論理識別子とピアの論理識別子とから決定される論理識別子範囲と、ピアの論理識別子と最大論理識別子とから決定される論理識別子範囲とに分割される。このとき、シフト後最大論理識別子やシフト後最長論理識別子範囲も同時に分割する。
【０１３０】
左ビットシフト範囲分割手段８１６は、与えられた論理識別子範囲について左ビットシフトを行うとともに、左ビットシフト前の先頭ビットによって異なる複数の論理識別子範囲を出力する。この手順は、図３に示した実施の形態１における左ビットシフト範囲分割処理の手順と同一である。
【０１３１】
登録・検索実行手段８１７は、データの登録および検索の処理を実行する。例えば、登録・検索実行手段８１７は、外部プログラムから検索要求があった場合に呼ばれ、検索条件に応じて論理識別子範囲を生成し、これをメッセージ転送手段に渡し、返ってきた検索結果を外部プログラムに与える役割を担う。
【０１３２】
メッセージ転送手段８１３は、データの登録要求および検索メッセージ（検索要求）の転送処理を実行する。メッセージ転送先の決定には、メッセージ内に含まれる論理識別子範囲が用いられる。この論理識別子範囲には、最大論理識別子と最小論理識別子、およびシフト後最大論理識別子、シフト後最小論理識別子が格納されている。
【０１３３】
通信手段８１４は、他ピアのネットワーク８００上でのアドレスを指定して、ネットワーク８００上にメッセージを送受信する処理を担う。これにより、あるピアのメッセージ転送手段８１３によって他のピアのメッセージ転送手段８１３を呼び出すことが可能となる。
【０１３４】
次に、この実施の形態２におけるデータ検索システムの動作について説明する。
【０１３５】
図７は、この実施の形態２のデータ検索システムの全体動作を示すフローチャートである。図７に示す処理において、まず、ピアｍにて登録・実行処理部８１７が、検索式Ｑｕｅｒｙを含んだ検索要求を受け付け、検索式Ｑｕｅｒｙに対応する論理識別子範囲リストＲａｎｇｅｓに変換して取得する（ステップＳ１００１）。なお、検索要求は、例えば検索要求者（ユーザ）の入力部（図１の１１６）の操作に応じてピアｍの登録・検索実行手段８１７に入力される。
【０１３６】
次に、ピアｍの登録・検索実行手段８１７は、検索結果を格納するリストＲｅｓｕｌｔｓを初期化し（ステップＳ１００２）、他ピアからの検索結果メッセージ（受信結果）をこのリストＲｅｓｕｌｔｓに格納するプロセスの起動を行う（ステップＳ１００２）。
【０１３７】
次に、ピアｍの登録・検索実行手段８１７は、検索結果を待つ最大時間をタイムアウト（Ｔｉｍｅｏｕｔ）としてタイマに設定する（ステップＳ１００３）。そして、ピアｍの登録・検索実行手段８１７は、仮想ノードｉを設定する（ステップＳ１００４）。好適には、この仮想ノードｉの論理識別子はピアｍとｓｕｃｃｅｓｓｏｒのピアの間から任意に選ばれる。
【０１３８】
次いで、ピアｍの登録・検索実行手段８１７は、ステップＳ１００１で得られた論理識別子範囲リストと仮想ノードｉを引数として、メッセージ転送手段８１３を非同期に呼び出す（ステップＳ１００５）。これにより、メッセージ転送手段８１３において、図８に示すフローチャートの各処理が実行される。
【０１３９】
その後、ピアｍの登録・検索実行手段８１７は、論理子範囲リスト内の全ての論理識別子に対する検索結果が得られたか、あるいはＴｉｍｅｏｕｔが０以下となるまで、待機し（待ち続け）（ステップＳ１００６）、一定時間（Ｉｎｔｅｒｖａｌ）毎にタイマの値を減算していく（ステップＳ１００７）。
【０１４０】
待ち条件を抜けた後（論理識別子範囲リスト内の全ての論理識別子に対する検索結果を得られたとき、あるいはタイマがタイムアウトしたとき）は、ピアｍの登録・検索実行手段８１７は、他ピアから送信された検索結果が格納されている結果リストＲｅｓｕｌｔｓを、検索要求者に対して提供する（ステップＳ１００８）。
【０１４１】
図８は、この実施の形態２のデータ検索手順を示すフローチャートである。ピアｍにおいて、メッセージ転送手段８１３は、論理識別子範囲ｉｄＲａｎｇｅｓを仮想ノードｉで探す要求を受けると（図７のステップＳ１００５）、論理識別子範囲ｉｄＲａｎｇｅｓをＳｕｃｃｅｓｓｏｒの論理識別子ｓとともに範囲分割手段８１５に渡す。範囲分割手段８１５は、論理識別子範囲ｉｄＲａｎｇｅｓをＳｕｃｃｅｓｓｏｒの論理識別子ｓで２つの論理識別子範囲ＬｏｗＲａｎｇｅｓとＨｉｇｈＲａｎｇｅｓに分割する（ステップＳ９０１）。そして、範囲分割手段８１５は、分割した２つの論理識別子範囲ＬｏｗＲａｎｇｅｓとＨｉｇｈＲａｎｇｅｓをメッセージ転送手段８１３に渡す。
【０１４２】
メッセージ転送手段８１３は、論理識別子範囲ＬｏｗＲａｎｇｅｓがＮｕｌｌであるか否か判定する（ステップＳ９０２）。論理識別子範囲ＬｏｗＲａｎｇｅｓがＮｕｌｌでない場合には（ステップＳ９０２のＮｏ）、メッセージ転送手段８１３は、ローカルデータ格納部８１１において、論理識別子範囲ＬｏｗＲａｇｅｓに含まれるシフト前の論理識別子をもとに、これと対応するデータ（論理識別子範囲ＬｏｗＲａｎｇｅに対応する検索式に合致するデータ）を検索する（ステップＳ９０３）。そして、検索した検索結果を検索実行者に渡す。
【０１４３】
次いで、メッセージ転送手段８１３は、論理識別子範囲ＨｉｇｈＲａｎｇｅｓがＮｕｌｌであるか否か判定する（ステップＳ９０４）。論理識別子範囲ＨｉｇｈＲａｎｇｅがＮｕｌｌである場合には（ステップＳ９０４のＹｅｓ）、このピアｍでの検索処理の実行を終了する。論理識別子範囲ＨｉｇｈＲａｎｇｅｓがＮｕｌｌでない場合には（ステップＳ９０４のＮｏ）、メッセージ転送手段８１３は、仮想ノードｉが（ｍ，ｓ］に含まれるか否かを判定する（ステップＳ９０５）。（ｍ，ｓ］は、ｍ（ピアｍの論理識別子）よりも大きくｓ（Ｓｕｃｃｅｓｓｏｒの論理識別子）以下であることを示している。
【０１４４】
仮想ノードｉが（ｍ，ｓ］の範囲に含まれない場合は（ステップＳ９０５のＮｏ）、メッセージ転送手段８１３は、ピアｓ（Ｓｕｃｃｅｓｓｏｒ）に同一の論理識別子範囲ｉｄＲａｎｇｅｓと仮想ノードｉを引数としてメッセージ転送手段８１３を呼び出す（ステップＳ９１１）。これにより、ピアｓ（Ｓｕｃｃｅｓｓｏｒ）において、論理識別子範囲ｉｄＲａｎｇｅｓを仮想ノードｉで探す処理（図８に示す処理）が実行される。そして、このピアｍでの検索処理の実行を終了する。
【０１４５】
仮想ノードｉが（ｍ，ｓ］の範囲に含まれる場合は（ステップＳ９０５のＹｅｓ）、メッセージ転送手段８１３は、左ビットシフト範囲分割手段８１６に論理識別子範囲ＨｉｇｈＲａｎｇｅｓを渡す。左ビットシフト範囲分割手段８１６は、左ビットシフトを行い、論理識別子範囲ＨｉｇｈＲａｎｇｅｓを２つの論理識別子範囲Ｒａｎｇｅ０とＲａｎｇｅ１に分割する処理を実行する（ステップＳ９０６）。なお、左ビットシフト範囲分割手段８１６による論理識別子範囲を分割する手順は、図３に示した実施の形態１における左ビットシフト範囲分割処理の手順と同一である。左ビットシフト範囲分割手段８１６は、分割した２つの論理識別子範囲Ｒａｎｇｅ０，Ｒａｎｇｅ１をメッセージ転送手段８１３に渡す。
【０１４６】
次いで、メッセージ転送手段８１３は、論理識別子範囲Ｒａｎｇｅ０がＮｕｌｌであるか否か判定する（ステップＳ９０７）。論理識別子範囲Ｒａｎｇｅ０がＮｕｌｌでない場合には（ステップＳ９０７のＮｏ）、メッセージ転送手段８１３は、ピアｄ（Ｐｒｅｄｅｃｅｓｓｏｒ）のメッセージ転送手段８１３を、論理識別子範囲Ｒａｎｇｅ０、仮想ノード２×ｉ（ｍｏｄ  Ｎ）、すなわち仮想ノードｉを左ビットシフトして得られる値で呼び出す（ステップＳ９０８）。これにより、ピアｄ（Ｐｒｅｄｅｃｅｓｓｏｒ）において、論理識別子範囲Ｒａｎｇｅ０を仮想ノード２×ｉ（ｍｏｄ  Ｎ）で探す処理（図８に示す処理）が実行される。
【０１４７】
さらに、メッセージ転送手段８１３は、論理識別子範囲Ｒａｎｇｅ１がＮｕｌｌであるか否か判定する（ステップＳ９０９）。論理識別子範囲Ｒａｎｇｅ１がＮｕｌｌでない場合には（ステップＳ９０９のＮｏ）、メッセージ転送手段８１３は、ピアｄのメッセージ転送手段８１３を、論理識別子範囲Ｒａｎｇｅ１、仮想ノード２×ｉ＋１（ｍｏｄ  Ｎ）、すなわち仮想ノードｉを左ビットシフトして、最下位ビットを１とした値で呼び出す（ステップＳ９１０）。これにより、ピアｄ（Ｐｒｅｄｅｃｅｓｓｏｒ）において、論理識別子範囲Ｒａｎｇｅ１を仮想ノード２×ｉ＋１（ｍｏｄ  Ｎ）で探す処理（図８に示す処理）が実行される。そして、処理を終了する。
【０１４８】
次に、この実施の形態２におけるデータ検索システムの動作の具体例（データ検索処理の手順の具体例）について、図９および図１０を用いて説明する。
【０１４９】
図９は、この実施の形態２におけるピア間でのメッセージの流れの具体例を示す説明図である。また、図１０は、この実施の形態２における左ビットシフト範囲分割処理のアルゴリズムを視覚的に示す説明図である。
【０１５０】
図９において、オーバレイネットワーク上に参加している複数のピアを示す。論理識別子１３であるピア１３１６が、検索式Ｑｕｅｒｙとして｛７≦温度≦１１｝を実行するものとし、温度という属性は論理識別子範囲と対応するものとする。
【０１５１】
この場合、ピア１３１６の登録・検索実行手段８１７は、検索式Ｑｕｅｒｙから対応する論理識別子範囲ｉｄＲａｎｇｅｓを算出し、論理識別子範囲［７，１１］が得られる（ステップＳ１００１）。次に、登録・検索実行手段８１７は、結果リストＲｅｓｕｌｔｓを初期化して、他ピアからの結果を受け付けるプロセスを立ち上げ（ステップＳ１００２）、タイマにタイムアウトを設定した後に（ステップＳ１００３）、仮想ノードｉを設定する（ステップＳ１００４）。
【０１５２】
仮想ノードｉは任意の値でもよいが、好適には自身の論理識別子よりも大きくＳｕｃｃｅｓｓｏｒの論理識別子以下の論理識別子であり、かつ、その下位ビットに宛先の論理識別子の先頭ビットをより長く含める。この場合、論理識別子１１１０と論理識別子１１１１が前者の条件を満たすため、この中で、可能な限り長く、宛先の論理識別子の先頭ビットを下位ビットに持つように左ビットシフト範囲分割を行ってよい。
【０１５３】
図１０に示す論路識別子範囲１４０１は、左ビットシフト範囲分割（図３に示した処理）により、［８，１１］である論理識別子範囲１４０２と［７，７］である論理識別子範囲１４０３に分割される。前者の論理識別子範囲［８，１１］のシフト前先頭ビットは１であり、後者の論理識別子範囲［７，７］のシフト前先頭ビットは０である。さらにピア１３１６にて左ビットシフト範囲分割をすることも可能であるが、後者の論理識別子範囲［７，７］をさらに左ビットシフト範囲分割すると、上記条件である論理識別子１１１０と論理識別子１１１１の下位から２ビット目に０（シフト前先頭ビット）であるものは存在しないので、さらなる左ビットシフト範囲分割は行わない。一方、前者の論理識別子範囲［８，１１］はさらにピア１３１６にて左ビットシフト分割を行うことが可能である。
【０１５４】
図１０に示す論理識別子範囲１４０２（論理識別子範囲［８，１１］）に対して左ビットシフト範囲分割を行うと、先頭ビットとして０が得られ、論理識別子範囲１４０４（論理識別子範囲［８，１１］）が得られる。ここで、さらなる左ビットシフト範囲分割は不可能であるため、これ以上の分割は行わない。
【０１５５】
以上から、ピア１３１６におけるステップＳ１００５では、論理識別子範囲［８，１１］を仮想ノード「１１１０」で探し（図９の１３２１）、さらに論理識別子範囲［７，７］を仮想ノード「１１１０」で探す（図９の１３２２）。
【０１５６】
ピア１３１６において、登録・検索実行手段８１７は、メッセージ転送手段８１３を呼び出して、論理識別子範囲［８，１１］を仮想ノード「１１１０」で探す（ステップＳ１００５）。これにより、メッセージ転送手段８１３によって図８に示した処理が実行される。
【０１５７】
ピア１３１６のメッセージ転送手段８１３は、まず、論理識別子範囲［８，１１］をピア１３１６のＳｕｃｃｅｓｓｏｒであるピア１３１７の論理識別子１５（「１１１１」）とともに範囲分割手段８１５に渡す。範囲分割手段８１５は、ピア１３１６のＳｕｃｃｅｓｓｏｒであるピア１３１７の論理識別子１５を境界値として、論理識別子範囲［８，１１］の分割を行うが（ステップＳ９０１）、この論理識別子範囲［８，１１］に論理識別子「１５」は含まれないため、ここでは論理識別子範囲ＬｏｗＲａｎｇｅｓにＮｕｌｌを入力し、論理識別子範囲ＨｉｇｈＲａｎｇｅｓに［８，１１］を入力する。そのため、ステップＳ９０２の判定結果がＹｅｓとなり、ステップＳ９０４の判定結果がＮｏとなる。そして、メッセージ転送手段８１３は、仮想ノード「１１１０」が（１１０１，１１１１］の範囲に含まれるか否かの判定を行う（ステップＳ９０５）。
【０１５８】
仮想ノード「１１１０」は（１１０１，１１１１］の範囲に含まれるので（ステップＳ９０５のＹｅｓ）、メッセージ転送手段８１３は、左ビットシフト範囲分割手段８１６に対して、当該論理識別子範囲［８，１１］を左ビットシフトして、２つの論理識別子範囲Ｒａｎｇｅ０とＲａｎｇｅ１に分割する処理を実行させる（ステップＳ９０６）。この結果、Ｒａｎｇｅ０には論理識別子範囲［８，９］（図１０の１４０７）が格納され、Ｒａｎｇｅ１には論理識別子範囲［１０，１１］（図１０の１４０６）が格納される。
【０１５９】
そして、メッセージ転送手段８１３は、論理識別子範囲Ｒａｎｇｅ０はＮｕｌｌであるか否か判定する（ステップＳ９０７）。このとき、論理識別子範囲Ｒａｎｇｅ０（［８，９］）はＮｕｌｌでないので（ステップＳ９０７のＮｏ）、メッセージ転送手段８１３は、ピア１３１６のｄノード（Ｐｒｅｄｅｃｅｓｓｏｒ）であるピア１３１５のメッセージ転送手段８１３を、論理識別子範囲［８，９］、仮想ノード「１１００」で呼び出す（ステップＳ９０８）。これは、図９の１３２３に対応する。これにより、ピア１３１５において、論理識別子範囲［８，９］を仮想ノード「１１００」で探す処理（図８に示す処理）が実行される。
【０１６０】
また、メッセージ転送手段８１３は、論理識別子範囲Ｒａｎｇｅ１はＮｕｌｌであるか否か判定する（ステップＳ９０９）。このとき、論理識別子範囲Ｒａｎｇｅ１（［１０，１１］）はＮｕｌｌでないので（ステップＳ９０９のＮｏ）、メッセージ転送手段８１３は、ピア１３１６のｄノード（Ｐｒｅｄｅｃｅｓｓｏｒ）であるピア１３１５のメッセージ転送手段８１３を、論理識別子範囲［１０，１１］、仮想ノード「１１０１」で呼び出す（ステップＳ９１０）。これは、図９の１３２４に対応する。これにより、ピア１３１５において、論理識別子範囲［１０，１１］を仮想ノード「１１０１」で探す処理（図８に示す処理）が実行される。
【０１６１】
また、ピア１３１６において、論理識別子範囲［７，７］を仮想ノード「１１１０」で探す場合も同様に、登録・検索実行手段８１７は、メッセージ転送手段８１３を呼び出して、図８に示した処理を実行させる（ステップＳ１００５）。
【０１６２】
ピア１３１６のメッセージ転送手段８１３は、まず、論理識別子範囲［７，７］をピア１３１６のＳｕｃｃｅｓｓｏｒであるピア１３１７の論理識別子１５（「１１１１」）とともに範囲分割手段８１５に渡す。範囲分割手段８１５は、ピア１３１６のＳｕｃｃｅｓｓｏｒであるピア１３１７の論理識別子１５を境界値として、論理識別子範囲［７，７］の分割を行うが（ステップＳ９０１）、この論理識別子範囲［７，７］に論理識別子「１５」は含まれないため、ここでは論理識別子範囲ＬｏｗＲａｎｇｅｓにＮｕｌｌを入力し、論理識別子範囲ＨｉｇｈＲａｎｇｅｓに［７，７］を入力する。そのため、ステップＳ９０２の判定結果がＹｅｓとなり、ステップＳ９０４の判定結果がＮｏとなる。そして、メッセージ転送手段８１３は、仮想ノード「１１１０」が（１１０１，１１１１］の範囲に含まれるか否かの判定を行う（ステップＳ９０５）。
【０１６３】
仮想ノード「１１１０」は（１１０１，１１１１］の範囲に含まれるので（ステップＳ９０５のＹｅｓ）、メッセージ転送手段８１３は、左ビットシフト範囲分割手段８１６に対して、当該論理識別子範囲［７，７］を左ビットシフトして、２つの論理識別子範囲Ｒａｎｇｅ０とＲａｎｇｅ１に分割する処理を実行させる（ステップＳ９０６）。ここでは、分割されずに左ビットシフトのみ行われ（図３のステップＳ６０２，Ｓ６０６，Ｓ６０７参照）、Ｒａｎｇｅ０にＮｕｌｌが格納され、Ｒａｎｇｅ１に論理識別子範囲［７，７］（図１０の１４０５）が格納される。
【０１６４】
そして、メッセージ転送手段８１３は、論理識別子範囲Ｒａｎｇｅ０はＮｕｌｌであるか否か判定する（ステップＳ９０７）。このとき、論理識別子範囲Ｒａｎｇｅ０はＮｕｌｌであるので（ステップＳ９０７のＹｅｓ）、ステップＳ９０８の処理を実行せずに、メッセージ転送手段８１３は、論理識別子範囲Ｒａｎｇｅ１はＮｕｌｌであるか否か判定する（ステップＳ９０９）。このとき、論理識別子範囲Ｒａｎｇｅ１（［７，７］）はＮｕｌｌでないので（ステップＳ９０９のＮｏ）、メッセージ転送手段８１３は、ピア１３１６のｄノード（Ｐｒｅｄｅｃｅｓｓｏｒ）であるピア１３１５のメッセージ転送手段８１３を、論理識別子範囲［７，７］、仮想ノード「１１０１」で呼び出す（ステップＳ９１０）。これは、図９の１３２５に対応する。これにより、ピア１３１５において、論理識別子範囲［７，７］を仮想ノード「１１０１」で探す処理（図８に示す処理）が実行される。
【０１６５】
ピア１３１５において、論理識別子範囲［８，９］（図１０の１４０７）を仮想ノード「１１００」で探す処理、論理識別子範囲［１０，１１］（図１０の１４０６）を仮想ノード「１１０１」で探す処理、および論理識別子範囲［７，７］（図１０の１４０５）を仮想ノード「１１０１」で探す処理が行われる。
【０１６６】
これらの処理のいずれにおいても、まず、ピア１３１５の範囲分割手段８１５が、ピア１３１５のＳｕｃｃｅｓｓｏｒの論理識別子１３（「１１０１」）を境界値として分割する（ステップＳ９０１）。ここでは、論理識別子範囲［１０，１１］だけが、論理識別子範囲［１０，１０］（図１０の１４１０）と論理識別子範囲［１１，１１］（図１０の１４０９）に分割される。そして、ステップＳ９０３において、ピア１３１５のメッセージ転送手段８１３がＳｕｃｃｅｓｓｏｒであるピア１３１６にこの範囲［１１，１１］のデータをローカルデータ格納部８１１から取得するように要求する。
【０１６７】
この分割で残った論理識別子範囲［７，７］（図１０の１４０５）、論理識別子範囲［８，９］（図１０の１４０７）、論理識別子範囲［１０，１０］（図１０の１４１０）は、それぞれ、左ビットシフト範囲分割手段８１６によって左ビット範囲分割が行われる。
【０１６８】
すなわち、論理識別子範囲［７，７］（図１０の１４０５）は論理識別子範囲［７，７］（図１０の１４０８）に変換され、論理識別子範囲［８，９］（図１０の１４０７）は論理識別子範囲［８，８］（図１０の１４１２）と論理識別子範囲［９，９］（図１０の１４１１）に分割され、論理識別子範囲［１０，１０］（図１０の１４１０）は論理識別子範囲［１０，１０］（図１０の１４１３）に変換される。
【０１６９】
これらの論理識別子範囲は、ステップＳ９０８あるいはステップＳ９１０において、ピア１３１５のｄノード（ｐｒｅｄｅｃｅｓｓｏｒ）であるピア１３１２に転送される。すなわち、仮想ノード「１０１１」での論理識別子範囲［７，７］の検索を要求するメッセージがピア１３１２に転送され（図９の１３２９）、仮想ノード「１０００」での論理識別子範囲［８，８］の検索を要求するメッセージがピア１３１２に転送され、仮想ノード「１００１」での論理識別子範囲［９，９］の検索を要求するメッセージがピア１３１２に転送され、仮想ノード「１０１０」での論理識別子範囲「１０，１０］の検索を要求するメッセージがピア１３１２に転送される。
【０１７０】
ピア１３１２では、いずれの範囲もピア１３１２の論理識別子３（２進数表示で「００１１」）とそのＳｕｃｃｅｓｓｏｒの論理識別子６（２進数表示で「０１１０」）には含まれず、同様に、仮想ノードも含まれないため（ステップＳ９０５のＮｏ）、ステップＳ９１１にて、全てＳｕｃｃｅｓｓｏｒであるピア１３１３に転送される（図９の１３３０〜１３３３）。
【０１７１】
ピア１３１３では、当該ピア１３１３の論理識別子６（２進数表示で「０１１０」）と、このピア１３１３のＳｕｃｃｅｓｓｏｒであるピア１３１４の論理識別子９（２進数表示で「１００１」）との間に、論理識別子範囲［７，７］（図１０の１３３３）、論理識別子範囲［８，８］（図１０の１３３２）、論理識別子範囲［９，９］（図１０の１３３１）が含まれるため、ピア１３１３はピア１３１４に対してこれらの範囲をローカルデータ格納部８１１から探して、検索実行者であるピア１３１６に返すように指示する（ステップＳ９０３）。残った範囲である［１０，１０］（図１０の１３３０）については、その仮想ノードがＳｕｃｃｅｓｓｏｒとの間に存在しないため、ステップＳ９１１にてピア１３１３はＳｕｃｃｅｓｓｏであるピア１３１４に論理識別子範囲［１０，１０］を転送する（図９の１３３４）。
【０１７２】
ピア１３１４では、当該ピア１３１４の論理識別子９（２進数表示で「１００１」）と、このピア１３１４のＳｕｃｃｅｓｓｏｒであるピア１３１５の論理識別子１０（２進数表示で「１０１０」）との間に、論理識別子範囲［１０，１０］（図１０の１３３４）が含まれるため、ピア１３１４はピア１３１５に対してこの範囲［１０，１０］をローカルデータ格納部８１１から探して、検索実行者であるピア１３１６に返すように指示する（ステップＳ９０３）。
【０１７３】
以上により、全ての論理識別子範囲ｉｄＲａｎｇｅｓ（［７，１１］）の検索結果がピア１３１６に返される（ステップＳ１００６）。そして、ピア１３１６の登録・検索実行手段８１７は、他ピアから送信された検索結果が格納されている結果リストＲｅｓｕｌｔｓを検索要求者に対して提供する（ステップＳ１００８）。
【０１７４】
以上に説明したように、この実施の形態２では、検索式に合致する集合を論理識別子空間における範囲に変換し、この論理識別子範囲に属する論理識別子を担うピアに、検索メッセージが行き渡るように、論理識別子範囲とともに検索メッセージを分割する。このとき、論理識別子範囲に対する左ビットシフトを実行し、先頭ビットの違いによって、論理識別子範囲を分割する。このような手法を用いることで、ｄｅ  Ｂｒｕｉｊｎグラフ上での範囲検索と同様に、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上での範囲検索を実現することができる。
【０１７５】
実施の形態３．
上記の実施の形態２は、ｄｅ  Ｂｒｕｉｊｉｎ上の論理識別子（ＩＤ）をＣｈｏｒｄハッシュ空間上の仮想ＩＤとし、論理識別子範囲の先頭ビットの違いにより、新たな仮想ＩＤを生成しつつ論理識別子範囲を分割していた。しかし、この場合、大きなハッシュ空間（ＩＤ空間）を用いる場合には、ビット数が多くなり、管理する仮想ＩＤの数も多くなる。そこで、この実施の形態３では、複数の仮想ＩＤを集合として、すなわち仮想範囲（仮想論理識別子範囲）として管理することにより、ピアが扱うデータ量を削減する。
【０１７６】
図１１は、この実施の形態３におけるデータ検索システムの構成を示すブロック図である。図１１に示すように、この実施の形態３におけるデータ検索システムは、、ネットワーク２０００上でのアドレスを有する複数のピア２０１０，２０２０，２０３０から構成される。図１１には、ネットワーク２０００に接続されているピアはピア２０１０，２０２０，２０３０だけであるが、ほかにも複数のピアがネットワーク２０００に接続されている。各ピアは、プログラム制御により動作するサーバなどのコンピュータ（中央処理装置；プロセッサ；データ処理装置）で構成されている（コンピュータのハードウェア構成は図１に示した構成と同様である）。なお、この実施の形態において、ピアとノードとは同義としている。
【０１７７】
図１１に示すように、ピア２０１０は、ピア論理識別子格納部２０１８、ローカルデータ格納部２０１１、ルーティングテーブル２０１２、メッセージ転送手段２０１３、通信手段２０１４、検索範囲左ビットシフト手段２０１５、範囲分割手段Ａ２０１６、範囲分割手段Ｂ２０１７、登録・検索実行手段２０１９を備えている。なお、ピア２０１０以外のピア２０２０，２０３０も、ピア２０１０と同一の構成を備えている。
【０１７８】
ピア２０１０を構成する格納部（ローカルデータ格納部２０１１、ルーティングテーブル２０１２、ピア論理識別子格納部２０１８）は、上記の実施の形態２と同じ構成であるため、説明を省略する。
【０１７９】
また、ピア２０１０を構成する通信手段２０１４、および登録・検索実行手段２０１９も、上記の実施の形態２と同じ構成であるため、説明を省略する。
【０１８０】
ピア２０１０を構成する検索範囲左ビットシフト手段２０１５、範囲分割手段Ａ２０１６、および範囲分割手段Ｂ２０１７は、それぞれ概略つぎのように動作する。
【０１８１】
これらの手段では、検索対象を検索範囲として定義する。検索範囲には、仮想範囲と、論理識別子範囲と、シフト回数とが含まれる（図１６６の１９２０参照）。このようにして、この実施の形態３では、実施の形態２において個別に扱っていた仮想ノードを集合として扱い、扱うデータ量を削減する。
【０１８２】
検索範囲左ビットシフト手段２０１５は、シフト回数を増加させ、仮想範囲の上限値および下限値を更新する処理を実行する。仮想範囲の上限値は、仮想範囲の上限値を左ビットシフトし、下位ビットに論理識別子範囲の上限値あるいは下限値の先頭ビットを取り出して割り当てる。なお、検索範囲左ビットシフト手段２０１５が実行する処理の詳細については図１５を参照して後述する。
【０１８３】
範囲分割手段Ａ２０１６は、検索範囲内の仮想範囲を、与えられた範囲に属する否かで分割する。その際、検索範囲内の論理識別子範囲についても分割する。なお、範囲分割手段Ａ２０１６が実行する処理の詳細については図１４を参照して後述する。
【０１８４】
範囲分割手段Ｂ２０１７は、検索範囲内の論理識別子範囲を、与えられた範囲に属する否かで分割する。その際、検索範囲内の仮想識別子範囲についても分割する。なお、範囲分割手段Ｂ２０１７が実行する処理の詳細については図１３を参照して後述する。
【０１８５】
次に、この実施の形態３におけるデータ検索システムの動作について説明する。
【０１８６】
この実施の形態３のデータ検索システムの全体動作は、上記の実施の形態２のデータ検索システムの全体動作（図７）と略同様である。ただし、この実施の形態３では、ピアｍにて論理識別子範囲を探す（検索する）方式が異なる。すなわち、この実施の形態３では、図７のステップＳ１００４における「ピアｍにて論理識別子範囲ｉｄＲａｎｇｅｓを仮想ノードｉで探す」処理の代わりに、図１２に示す「ピアｍにて検索範囲集合ｑＲａｎｇｅｓを探す」処理が行われる。なお、この実施の形態３では、図７における仮想ノードの初期化（図７のステップＳ１００３）の代わりに「検索範囲（仮想範囲と論理識別子範囲を含む）の初期化」が行われる。
【０１８７】
図１２は、この実施の形態３のデータ検索手順を示すフローチャートである。ピアｍにおいて、メッセージ転送手段２０１３は、登録・検索実行手段２０１９からの検索範囲集合ｑＲａｎｇｅｓを探す要求を受けると、発見検索範囲集合ｆｏｕｎｄＲａｎｇｅｓ、未発見検索範囲集合ＮｏｔＦｏｕｎｄＲａｎｇｅｓ、ピアｄ転送検索範囲集合ｄＲａｎｇｅｓ、ピアｓ転送検索範囲集合ｓＲａｎｇｅｓを初期化する（ステップＳ１６０１）。
【０１８８】
そして、メッセージ転送手段２０１３は、検索範囲集合ｑＲａｎｇｅｓ内の各検索範囲ｑＲａｎｇｅを、ピアｍとピアｓ（Ｓｕｃｃｅｓｓｏｒ）の論理識別子の範囲（ｍ，ｓ］とともに範囲分割手段Ｂ２０１７に渡し、各検索範囲ｑＲａｎｇｅに対して、ステップＳ１６０３の処理を繰り返し実行させる（ステップＳ１６０２）。
【０１８９】
範囲分割手段Ｂ２０１７は、検索範囲ｑＲａｎｇｅを、ピアｍとピアｓの論理識別子の範囲（ｍ，ｓ］で、論理識別子範囲をもとに範囲内検索範囲ｉｎＲａｎｇｅと範囲外検索範囲ｏｕｔＲａｎｇｅに分割する（ステップ１６０３）。そして、範囲分割手段Ｂ２０１７は、範囲内検索範囲ｉｎＲａｎｇｅと範囲外検索範囲ｏｕｔＲａｎｇｅをメッセージ転送手段２０１３に返す。
【０１９０】
メッセージ転送手段２０１３は、範囲分割手段Ｂ２０１７から各検索範囲ｑＲａｎｇｅに対する各範囲内検索範囲ｉｎＲａｎｇｅを順次取得し、範囲分割手段Ｂ２０１７から各検索範囲ｑＲａｎｇｅに対する各範囲外検索範囲ｏｕｔＲａｎｇｅを順次取得する。各々の範囲内検索範囲ｉｎＲａｎｇｅの集合が範囲内検索範囲集合ｉｎＲａｎｇｅＳｅｔであり、各々の範囲外検索範囲ｏｕｔＲａｎｇｅの集合が範囲外検索範囲集合ｏｕｔＲａｎｇｅｓである。
【０１９１】
メッセージ転送手段２０１３は、検索範囲集合ｑＲａｎｇｅｓ内の検索範囲ｑＲａｎｇｅに対して得られた範囲内検索範囲集合ｉｎＲａｎｇｅＳｅｔと範囲外検索範囲集合ｏｕｔＲａｎｇｅｓを、それぞれ、発見検索範囲集合ｆｏｕｎｄＲａｎｇｅｓと未発見検索範囲集合ＮｏｔＦｏｕｎｄＲａｎｇｅｓに追加（格納）する（ステップＳ１６０４）。
【０１９２】
次いで、メッセージ転送手段２０１３は、未発見検索範囲集合ＮｏｔＦｏｕｎｄＲａｎｇｅｓ内の未発見検索範囲ＮｏｔＦｏｕｎｄＲａｎｇｅを、ピアｍとピアｓの論理識別子の範囲（ｍ、ｓ］とともに範囲分割手段Ａ２０１６に渡し、各未発見検索範囲ＮｏｔＦｏｕｄＲａｎｇｅに対して、ステップＳ１６０６の処理を繰り返し実行させる（ステップＳ１６０５）。
【０１９３】
範囲分割手段Ａ２０１６は、未発見検索範囲ＮｏｔＦｏｕｄＲａｎｇｅを、ピアｍとピアｓの論理識別子の範囲（ｍ，ｓ］で、仮想範囲をもとに範囲内検索範囲ｉｎＲａｎｇｅと範囲外検索範囲ｏｕｔＲａｎｇｅに分割する（ステップＳ１６０６）。そして、範囲分割手段Ａ２０１６は、範囲内検索範囲ｉｎＲａｎｇｅと範囲外検索範囲ｏｕｔＲａｎｇｅをメッセージ転送手段２０１３に返す。
【０１９４】
メッセージ転送手段２０１３は、範囲分割手段Ａ２０１６から各未発見検索範囲ＮｏｔＦｏｕｎｄＲａｎｇｅに対する各範囲内検索範囲ｉｎＲａｎｇｅを順次取得し、範囲分割手段Ａ２０１６から各未発見検索範囲ＮｏｔＦｏｕｎｄＲａｎｇｅに対する各範囲外検索範囲ｏｕｔＲａｎｇｅを順次取得する。各々の範囲内検索範囲ｉｎＲａｎｇｅの集合が範囲内検索範囲集合ｉｎＲａｎｇｅｓであり、各々の範囲外検索範囲ｏｕｔＲａｎｇｅの集合が範囲外検索範囲集合ｏｕｔＲａｎｇｅｓである。
【０１９５】
次いで、メッセージ転送手段２０１３は、範囲内検索範囲集合ｉｎＲａｎｇｅｓ内の要素ｉｎＲａｎｇｅを検索範囲左ビットシフト手段２０１５に順次渡し、ステップＳ１６０８の処理を繰り返し実行させる（ステップＳ１６０７）。
【０１９６】
検索範囲左ビットシフト手段２０１５は、範囲内検索範囲ｉｎＲａｎｇｅに対して、左ビットシフトの処理を実行する（ステップＳ１６０８）。そして、左ビットシフト後の範囲内検索範囲をメッセージ転送手段２０１３に返す。
【０１９７】
メッセージ転送手段２０１３は、範囲内検索範囲集合ｉｎＲａｎｇｅｓと範囲外検索範囲集合ｏｕｔＲａｎｇｅｓを、それぞれ、ピアｄ転送検索範囲集合ｄＲａｎｇｅｓとピアｓ転送検索範囲集合ｓＲａｎｇｅｓに追加（格納）する（ステップＳ１６０９）。
【０１９８】
次いで、メッセージ転送手段２０１３は、発見検索範囲集合ｆｏｕｎｄＲａｎｇｅｓの要素数が０でなければ（ステップＳ１６１０のＮ）、ピアｓにてローカルデータから範囲ｆｏｕｎｄＲａｎｇｅｓを探させる（ステップＳ１６１１）。
【０１９９】
また、メッセージ転送手段２０１３は、ピアｄ転送検索範囲集合ｄＲａｎｇｅｓの要素数が０でなければ（ステップＳ１６１２のＮ）、ピアｄにてｄＲａｎｇｅｓを探させる（ステップＳ１６１３）。同様に、ピアｓ転送検索範囲集合ｓＲａｎｇｅｓの要素数が０でなければ（ステップＳ１６１４のＮ）、ピアｓにてｓＲａｎｇｅｓを探させる（ステップＳ１６１５）。そして、処理を終了する。
【０２００】
次に、範囲分割手段Ｂ２０１７が実行する処理（ステップＳ１６０３）について説明する。図１３は、この実施の形態３の範囲分割手段Ａが実行する処理を示すフローチャートである。なお、検索範囲ｑＲａｎｇｅは、仮想検索範囲ｉＲａｎｇｅと論理識別子範囲ｋＲａｎｇｅとシフト回数ｃとから構成されている。
【０２０１】
範囲分割手段Ｂ２０１７は、まず、検索範囲ｑＲａｎｇｅ中で、範囲Ｒａｎｇｅ（自身の論理識別子とＳｕｃｃｅｓｓｏｒの論理識別子の間の範囲）に含まれる範囲を範囲内仮想範囲集合ｉｎＫｅｙＲａｎｇｅｓに格納し、含まれない範囲を範囲外仮想範囲集合ｏｕｔＫｅｙＲａｎｇｅｓに格納する（ステップＳ１８０１）。そして、範囲分割手段Ｂ２０１７は、範囲内検索範囲集合ｉｎＱｒａｎｇｅｓと範囲外検索範囲集合ｏｕｔＱＲａｎｇｅｓを初期化する（ステップＳ１８０２）。
【０２０２】
次いで、範囲分割手段Ｂ２０１７は、範囲内仮想範囲集合ｉｎＫｅｙＲａｎｇｅｓと範囲外仮想範囲集合ｏｕｔＫｅｙＲａｎｇｅｓ内の各仮想範囲ｅａｃｈＫｅｙＲａｎｇｅに対して、ステップＳ１８０４〜Ｓ１８０９の処理を繰り返し実行する（ステップＳ１８０３）。
【０２０３】
範囲分割手段Ｂ２０１７は、仮想範囲ｅａｃｈＫｅｙＲａｎｇｅの上限値の先頭から（全ビット長−シフト回数ｃ）ビットを上位に、論理識別子範囲ｋＲａｎｇｅの上限値を（全ビット長−シフト回数ｃ）回右ビットシフトしたビット列を下位に持つビット列を新たな仮想論理識別子範囲の上限値（最大仮想論理識別子）ＮｅｗＩｍｇＲａｎｇｅＭａｘとする（ステップＳ１６０４）。
【０２０４】
また、範囲分割手段Ｂ２０１７は、仮想範囲ｅａｃｈＫｅｙＲａｎｇｅの下限値の先頭から（全ビット長−シフト回数ｃ）ビットを上位に、論理識別子範囲ｋＲａｎｇｅの上限値を（全ビット長−シフト回数ｃ）回右ビットシフトしたビット列を下位に持つビット列を新たな仮想論理識別子範囲の下限値（最小仮想論理識別子）ＮｅｗＩｍｇＲａｎｇｅＭｉｎとする（ステップＳ１６０５）。
【０２０５】
そして、範囲分割手段Ｂ２０１７は、最大仮想論理識別子ＮｅｗＩｍｇＲａｎｇｅＭａｘと最小仮想論理識別子ＮｅｗＩｍｇＲａｎｇｅＭｉｎから、新たな仮想論理識別子範囲ＮｅｗＩｍｇＲａｎｇｅを作成し、これと仮想範囲ｅａｃｈＫｅｙＲａｎｇｅとシフト回数ｃから、新たな検索範囲ＮｅｗＱＲａｎｇｅを作成する（ステップＳ１８０６）。
【０２０６】
次いで、範囲分割手段Ｂ２０１７は、仮想範囲ｅａｃｈＫｅｙＲａｎｇｅが範囲内仮想範囲集合ｉｎＫｅｙＲａｎｇｅｓに属するかどうかを判定する（ステップＳ１８０７）。仮想範囲ｅａｃｈＫｅｙＲａｎｇｅが範囲内仮想範囲集合ｉｎＫｅｙＲａｎｇｅｓに属すると判定した場合は（ステップＳ１８０７のＹ）、範囲内検索範囲集合ｉｎＱＲａｎｇｅｓに新たな検索範囲ＮｅｗＱＲａｎｇｅを登録する（ステップＳ１８０８）。一方、仮想範囲ｅａｃｈＫｅｙＲａｎｇｅが範囲内仮想範囲集合ｉｎＫｅｙＲａｎｇｅｓに属さないと判定した場合は（ステップＳ１８０７のＮ）、範囲外検索範囲集合ｏｕｔＫｅｙＲａｎｇｅｓに新たな検索範囲ＮｅｗＱＲａｎｇｅを登録する（ステップＳ１８０９）。
【０２０７】
そして、範囲分割手段Ｂ２０１７は、範囲内検索範囲集合ｉｎＱＲａｎｇｅｓと範囲外検索範囲集合ｏｕｔＱＲａｎｇｅｓをメッセージ転送手段２０１３に返す（ステップＳ１８１０）。範囲内検索範囲集合ｉｎＱＲａｎｇｅｓがメッセージ転送手段２０１３によって範囲内検索範囲集合ｉｎＲａｎｇｅＳｅｔとして取得され、範囲外検索範囲集合ｏｕｔＱＲａｎｇｅｓがメッセージ転送手段２０１３によって範囲外検索範囲集合ｏｕｔＲａｎｇｅｓとして取得される。
【０２０８】
次に、範囲分割手段Ａ２０１６が実行する処理（ステップＳ１６０６）について説明する。図１４は、この実施の形態３の範囲分割手段Ｂが実行する処理を示すフローチャートである。なお、検索範囲ｑＲａｎｇｅは、仮想検索範囲ｉＲａｎｇｅと論理識別子範囲ｋＲａｎｇｅとシフト回数ｃとから構成されている。
【０２０９】
範囲分割手段Ａ２０１６は、まず、検索範囲ｑＲａｎｇｅ中で、範囲Ｒａｎｇｅ（自身の論理識別子とＳｕｃｃｅｓｓｏｒの論理識別子の間の範囲）に含まれる範囲を範囲内仮想範囲集合ｉｎＩｍｇＲａｎｇｅｓに格納し、含まれない範囲を範囲外仮想範囲集合ｏｕｔＩｍｇＲａｎｇｅｓに格納する（ステップＳ１７０１）。そして、範囲分割手段Ａ２０１６は、範囲内検索範囲集合ｉｎＱｒａｎｇｅｓと範囲外検索範囲集合ｏｕｔＱＲａｎｇｅｓを初期化する（ステップＳ１７０２）。
【０２１０】
次いで、範囲分割手段Ａ２０１６は、範囲内仮想範囲集合ｉｎＩｍｇＲａｎｇｅｓと範囲外仮想範囲集合ｏｕｔＩｍｇＲａｎｇｅｓ内の各仮想範囲ｅａｃｈＩｍｇＲａｎｇｅに対して、ステップＳ１７０４〜Ｓ１７０９の処理を繰り返し実行する（ステップＳ１７０３）。
【０２１１】
範囲分割手段Ａ２０１６は、仮想範囲ｅａｃｈＩｍｇＲａｎｇｅの上限値を（全ビット長−シフト回数ｃ）回左ビットシフトし、下位の（全ビット長−シフト回数ｃ）ビットに１を並べたビット列と、論理識別子範囲ｋＲａｎｇｅの上限値を比較し、小さい方を新たな論理識別子範囲の上限値（最大論理識別子）ＮｅｗＲａｎｇｅＭａｘとする（ステップＳ１７０４）。
【０２１２】
また、範囲分割手段Ａ２０１６は、仮想範囲ｅａｃｈＩｍｇＲａｎｇｅの下限値を（全ビット長−シフト回数ｃ）回左ビットシフトし、下位の（全ビット長−シフト回数ｃ）ビットに０を並べたビット列と、論理識別子範囲ｋＲａｎｇｅの下限値を比較し、大きい方を新たな論理識別子範囲の下限値（最小論理識別子）ＮｅｗＲａｎｇｅＭｉｎとする（ステップＳ１７０５）。
【０２１３】
そして、範囲分割手段Ａ２０１６は、最大論理識別子ＮｅｗＲａｎｇｅＭａｘと最小論理識別子ＮｅｗＲａｎｇｅＭｉｎから、新たな論理識別子範囲ＮｅｗＲａｎｇｅを作成し、これと仮想範囲ｅａｃｈＩｍｇＲａｎｇｅとシフト回数ｃから、新たな検索範囲ＮｅｗＱＲａｎｇｅを作成する（ステップＳ１７０６）。
【０２１４】
次いで、範囲分割手段Ａ２０１６は、仮想範囲ｅａｃｈＩｍｇＲａｎｇｅが範囲内仮想範囲集合ｉｎＩｍｇＲａｎｇｅｓに属するかどうかを判定する（ステップＳ１７０７）。仮想範囲ｅａｃｈＩｍｇＲａｎｇｅが範囲内仮想範囲集合ｉｎＩｍｇＲａｎｇｅｓに属すると判定した場合は（ステップＳ１７０７のＹ）、範囲内検索範囲集合ｉｎＱＲａｎｇｅｓに新たな検索範囲ＮｅｗＱＲａｎｇｅを登録する（ステップＳ１７０８）。一方、仮想範囲ｅａｃｈＩｍｇＲａｎｇｅが範囲内仮想範囲集合ｉｎＩｍｇＲａｎｇｅｓに属さないと判定した場合は（ステップＳ１７０７のＮ）、範囲外検索範囲集合ｏｕｔＱＲａｎｇｅｓに新たな検索範囲ＮｅｗＱＲａｎｇｅを登録する（ステップＳ１７０９）。
【０２１５】
そして、範囲分割手段Ａ２０１６は、範囲内検索範囲集合ｉｎＱＲａｎｇｅｓと範囲外検索範囲集合ｏｕｔＱＲａｎｇｅｓをメッセージ転送手段２０１３に返す（ステップＳ１７１０）。範囲内検索範囲集合ｉｎＱＲａｎｇｅｓがメッセージ転送手段２０１３によって範囲内検索範囲集合ｉｎＲａｎｇｅｓとして取得され、範囲外検索範囲集合ｏｕｔＱＲａｎｇｅｓがメッセージ転送手段２０１３によって範囲外検索範囲集合ｏｕｔＲａｎｇｅｓとして取得される。
【０２１６】
次に、検索範囲左ビットシフト手段２０１５が実行する処理（ステップＳ１６０８）について説明する。図１５は、この実施の形態３の検索範囲左ビットシフト手段が実行する処理を示すフローチャートである。なお、検索範囲ｑＲａｎｇｅは、仮想検索範囲ｉＲａｎｇｅと論理識別子範囲ｋＲａｎｇｅとシフト回数ｃとから構成されている。
【０２１７】
まず、検索範囲左ビットシフト手段２０１５は、シフト回数ｃを増やす（ステップＳ２１０１）。次いで、検索範囲左ビットシフト手段２０１５は、仮想範囲ｉＲａｎｇｅの上限値ｉＭａｘ（最大仮想論理識別子）に、それを左ビットシフトし下位ビットに、論理識別子範囲ｋＲａｎｇｅの上限値ｋＭａｘ（最大論理識別子）の先頭からｃビット目を加えたビット列を与える（ステップＳ２１０２）。次に、検索範囲左ビットシフト手段２０１５は、仮想範囲ｉＲａｎｇｅの上限値ｉＭａｘ（最大仮想論理識別子）に、それを左ビットシフトし下位ビットに、論理識別子範囲ｋＲａｎｇｅの上限値ｋＭａｘ（最大論理識別子）の先頭からｃビット目を加えたビット列を与える（ステップＳ２１０３）。そして、処理後の値をメッセージ転送手段２０１３に返す。
【０２１８】
次に、この実施の形態３におけるデータ検索システムの動作の具体例（データ検索処理の手順の具体例）について、図１６を用いて説明する。
【０２１９】
図１６は、この実施の形態３におけるピア間でのメッセージの流れの具体例を示す説明図である。
【０２２０】
図１６において、オーバレイネットワーク上に参加している複数のピアを示す。論理識別子１３であるピア１９１６が、検索式Ｑｕｅｒｙとして｛７≦温度≦１１｝を実行するものとし、温度という属性は論理識別子範囲と対応するものとする。この例は、図９に示した例と同様である。
【０２２１】
この場合、ピア１９１６の登録・検索実行手段２０１９は、検索式Ｑｕｅｒｙから対応する論理識別子範囲ｉｄＲａｎｇｅｓを算出し、論理識別子範囲［７，１１］が得られる。次に、登録・検索実行手段２０１９は、結果リストＲｅｓｕｌｔｓを初期化して、他ピアからの結果を受け付けるプロセスを立ち上げ、タイマにタイムアウトを設定する（ステップＳ１００１〜Ｓ１００３参照）。その後に、検索範囲集合ｑＲａｎｇｅｓ（図１６の１９２０）を初期化する。
【０２２２】
検索範囲集合の初期化は、検索式から導かれる論理識別子範囲集合ｉｄＲａｎｇｅｓ内の論理識別子範囲ｉｄＲａｎｇｅを、検索範囲の論理識別子範囲（図１６の１９２０の右欄）に設定し、シフト回数ｃ（図１６の１９２０の左欄）を０とすれば、仮想論理識別子範囲（図１６の１９２０の中欄）は任意の値でもよいが、好適には、仮想論理識別子範囲は、自身の論理識別子（図１６に示す例では１３）よりも大きくＳｕｃｃｅｓｓｏｒの論理識別子（図１６に示す例では１５）以下の範囲に属し、かつその上限値である仮想範囲上限値の下位ビットにｉｄＲａｎｇｅの上限値の先頭ビットを多く持ち、下限値である仮想範囲下限値の下位ビットにｉｄＲａｎｇｅの下限値の先頭ビットを多く持たせる。ここでは、ピア１９１６がシフト回数２、仮想範囲［１４，１４］、論理識別子範囲[８，１１]である検索範囲１９２１と、シフト回数１、仮想範囲［１４，１４］、論理識別子範囲[７，７]である検索範囲１９２２の２つの検索範囲に初期化される。
【０２２３】
図１６において、ピア１９１６は、ピア１９１６の論理識別子１５より大きくサクセサ（ピアｓ）の論理識別子１５以下の範囲（１３，１５］を用いて、検索範囲１９２１と検索範囲１９２２をそれぞれ論理識別子範囲（検索範囲１９２１，１９２２の右欄）をもとに範囲分割する（ステップＳ１６０３）。それぞれその論理識別子範囲は（１３，１５］に含まれないため、未発見検索範囲集合に格納される（ステップＳ１６０４）。
【０２２４】
次に、ピア１９１６は、この未発見検索範囲集合に含まれる検索範囲１９２１と検索範囲１９２２のそれぞれについて、ピア１９１６の論理識別子１５より大きくサクセサ（ピアｓ）の論理識別子１５以下の範囲（１３，１５］を用いて、仮想範囲を元に範囲分割を行う（ステップＳ１６０６）。それぞれの仮想範囲はいずれも［１４，１４］であり、この範囲に含まれるため、範囲内検索範囲集合に格納される。ピア１９１６は、この集合内の検索範囲に対して、左ビットシフトを行うことで（ステップＳ１６０８）、図１６に示す検索範囲１９２３、検索範囲１９２４を得る。そして、これらはｄノード転送検索範囲集合に格納される（ステップＳ１６０９）。発見検索範囲集合とｓノード転送検索範囲集合の要素数は０であるが（ステップＳ１６１０のＹ、ステップＳ１６１４のＹ）、ｄノード検索範囲集合には、検索範囲１９２３、検索範囲１９２４が格納されているため（ステップＳ１６１２のＮ）、ピア１９１６は、これをｄノードであるピア１９１５に転送し、ピア１９１５で検索範囲１９２３、検索範囲１９２４を含む検索範囲集合を探させる（ステップＳ１６１３）。
【０２２５】
次に、ピア１９１５は、検索範囲１９２３、検索範囲１９２４を含む検索範囲集合を探すピア１９１５は、ピア１９１５の論理識別子１０より大きくサクセサ（ピアｓ）の論理識別子１３以下の範囲（１０，１３］で、論理識別子範囲をもとに範囲分割を行う（ステップＳ１６０３）。検索範囲１９２３の論理識別子範囲は［８，１１］であるため、範囲内検索範囲集合としてその論識別子範囲に［１１，１１］を含む検索範囲１９２５が格納され、範囲外検索範囲集合としてその論理識別子範囲に［８，１０］を含む検索範囲１９２６と論理識別子範囲が［７，７］である検索範囲１９２４が格納される。検索範囲１９２５は発見検索範囲集合に格納され、検索範囲１９２６および検索範囲１９２４は未発見検索範囲集合に格納される（ステップＳ１６０４）。
【０２２６】
そして、ピア１９１５は、この未発見検索範囲集合に属する検索範囲１９２６および検索範囲１９２４のそれぞれは、ピア１９１５の論理識別子１０より大きくサクセサ（ピアｓ）の論理識別子１３以下の範囲（１０，１３］を用いて、仮想範囲をもとに範囲分割される（ステップＳ１６０６）。それぞれの仮想範囲が［１２，１３］と［１３，１３］であることから、これらは範囲内検索範囲集合に格納され、左ビットシフトされて、検索範囲１９２６、１９２７となる（ステップＳ１６０８）。ピア１９１５は、そのサクセサ（ｓノード）であるピア１９１６に対して、発見検索範囲集合に格納された検索範囲１９２５をローカル検索するように指示する（ステップＳ１６１１）。また、ｄノードであるピア１９１２に対して、検索範囲１９２６と検索範囲１９２７を転送する（ステップＳ１６１３）。
【０２２７】
次に、検索範囲１９２６と検索範囲１９２７を受け付けたピア１９１２は、ピア１９１２の論理識別子３より大きくサクセサ（ピアｓ）の論理識別子６以下の範囲（３，６］で、論理識別子範囲をもとに範囲分割を行う（ステップＳ１６０３）。検索範囲１９２６と検索範囲１９２７の論理識別子範囲はそれぞれ［８，１１］と［１１，１１］であるため、いずれも範囲外検索範囲集合に格納される。また、同範囲で仮想範囲に基づく範囲分割が実行されるが（ステップＳ１６０６）、ここでもその仮想範囲が［８，１０］と［７，７］であるため、ｓノード転送検索範囲集合に格納され（ステップＳ１６０９）、ｓノードであるピア１９１３に転送される（ステップＳ１６１５）。
【０２２８】
次に、検索範囲１９２８と検索範囲１９２７を受け付けたピア１９１３は、ピア１９１３の論理識別子６より大きくサクセサ（ピアｓ）の論理識別子９以下の範囲（６，９］で、論理識別子範囲をもとに範囲分割を行う（ステップＳ１６０３）。検索範囲１９２８の論理識別子範囲は［８，１０］であるため、その論理識別子範囲が［１０，１０］である検索範囲１９３０と、その論理識別子範囲が［８，９］である検索範囲１９３１に分割され、検索範囲１９３０は範囲外検索範囲集合に格納され、検索範囲１９３１は範囲内検索範囲集合に格納される。また、検索範囲１９２９の論理識別子範囲は［１１，１１］であるため、範囲内検索範囲集合に格納される。検索範囲１９３１と検索範囲１９２９は発見検索範囲集合に格納されるため（ステップＳ１６０４）、これらの範囲がピア１９１３のサクセサ（ピアｓ）であるピア１９１４でローカル検索される（ステップＳ１６１１）。また、検索範囲１９３１については、サクセサ（ピアｓ）であるピア１９１４に検索指示される（ステップＳ１６１５）。
【０２２９】
次に、検索範囲１９３０を受け付けたピア１９１４は、ピア１９１４の論理識別子９より大きくサクセサ（ピアｓ）の論理識別子１０以下の範囲（９，１０］で、論理識別子範囲をもとに範囲分割を行う（ステップＳ１６０３）。検索範囲１９３０は（９，１０］に含まれるため、発見検索範囲集合に格納され（ステップＳ１６０４）、サクセサであるピア１９１５でローカル検索される（ステップＳ１６１１）。
【０２３０】
以上に説明したように、この実施の形態３では、検索式に合致する集合を論理識別子空間における範囲に変換し、この論理識別子範囲に属する論理識別子を担うピアに、検索メッセージが行き渡るように、論理識別子範囲とともに検索メッセージを分割する。このとき、検索対象の論理識別子範囲に対する左ビットシフトの実行、あるいはシフト回数の増加を行い、それと同時に仮想範囲の上限値および下限値を左ビットシフトさせつつ下位ビットに論理識別子範囲の上限値および下限値のシフト回数ビット目のビットを割り当てる。このような手法を用いることで、ｄｅ  Ｂｒｕｉｊｎグラフ上での範囲検索と同様に、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上での範囲検索を実現することができる。さらに、複数の仮想ＩＤ（仮想ノード）を集合（仮想論理識別子範囲）として管理することにより、範囲検索を実行する際のオーバレイネットワーク上の各ピアが扱うデータ量を削減することができる。
【０２３１】
上記の実施の形態２，３において、ピアは、例えばサーバやパーソナルコンピュータなどの計算機（端末）で実現されている。また、各ピアにおいて、ＣＰＵなどの制御部がハードディスクなどの記憶手段に記憶されているプログラム（データ検索用プログラム）に従って実施の形態２，３で説明した処理を実行することにより各構成部（手段）が実現される。また、各ピアにおいて、格納部、テーブルなどはハードディスクなどの記憶手段で実現される。
【０２３２】
また、上記の実施の形態２，３において、各ピア（各ノード）にデータ（例えば図６、図１１に示すローカルデータ格納部８１１に格納されるデータ）を格納する処理については、Ｋｏｏｒｄｅのアルゴリズムに従って行われるものとする。
【産業上の利用可能性】
【０２３３】
本発明は、広域でデータを共有するリレーショナルデータベースに適用できる。また、特定の属性データが発生した際に通知を受けることを可能とする広域メッセージ通知サービスにも適用できる。特に、Ｒａｄｉｏ  Ｆｒｅｑｕｅｎｃｙ  Ｉｄｅｎｔｉｆｉｅｒ（ＲＦＩＤ）データの格納といった用途や、システム運用管理におけるログの格納といった用途や、メールやＷｅｂページの格納、Ｓｏｃｉａｌ  Ｎｅｔｗｏｒｋ  Ｓｅｒｖｉｃｅ（ＳＮＳ）データの格納などにも適用可能である。また、メッセージ通知システムとしては、株価通知システムや、温度などのＲＦＩＤデータ値の変化を検知するといった用途にも利用可能である。
【図面の簡単な説明】
【０２３４】
【図１】この実施の形態１におけるデータ検索システムの構成を示すブロック図である。
【図２】この実施の形態１のデータ検索手順を示すフローチャートである。
【図３】左ビットシフト範囲分割処理の手順を示すフローチャートである。
【図４】この実施の形態１におけるｄｅ  Ｂｒｕｉｊｎグラフを示す説明図である。
【図５】この実施の形態１における左ビットシフト範囲分割処理のアルゴリズムを視覚的に示す説明図である。
【図６】この実施の形態２におけるデータ検索システムの構成を示すブロック図である。
【図７】この実施の形態２のデータ検索システムの全体動作を示すフローチャートである。
【図８】この実施の形態２のデータ検索手順を示すフローチャートである。
【図９】この実施の形態２におけるピア間でのメッセージの流れの具体例を示す説明図である。
【図１０】この実施の形態２における左ビットシフト範囲分割処理のアルゴリズムを視覚的に示す説明図である。
【図１１】この実施の形態３におけるデータ検索システムの構成を示すブロック図である。
【図１２】この実施の形態３のデータ検索手順を示すフローチャートである。
【図１３】この実施の形態３の範囲分割手段Ａが実行する処理を示すフローチャートである。
【図１４】この実施の形態３の範囲分割手段Ｂが実行する処理を示すフローチャートである。
【図１５】この実施の形態３の検索範囲左ビットシフト手段が実行する処理を示すフローチャートである。
【図１６】この実施の形態３におけるピア間でのメッセージの流れの具体例を示す説明図である。
【図１７】第１の従来技術のデータ検索手順を示すフローチャートである。
【図１８】ｄｅ  Ｂｒｕｉｊｎグラフを示す説明図である。
【図１９】第２の従来技術のシステム構成を示すブロック図である。
【図２０】第２の従来技術のデータ検索手順を示すフローチャートである。
【図２１】第２の従来技術におけるピア間でのメッセージの流れの具体例を示す説明図である。
【符号の説明】
【０２３５】
１１０，１２０，１３０  ノード
１１５  ＣＰＵ
８１０，８２０，８３０  ピア
８１１  ローカルデータ格納部
８１２  ルーティングテーブル
８１３  メッセージ転送手段
８１４  通信手段
８１５  範囲分割手段
８１６  左ビットシフト範囲分割手段
８１７  登録・検索実行手段
２０１０，２０２０，２０３０  ピア
２０１１  ローカルデータ格納部
２０１２  ルーティングテーブル
２０１３  メッセージ転送手段
２０１４  通信手段
２０１５  検索範囲左ビットシフト手段
２０１６  範囲分割手段Ａ
２０１７  範囲分割手段Ｂ
２０１８  ピア論理識別子格納部
２０１９  登録・検索実行手段
【図１】
2008262507.tif 000003
【図２】
2008262507.tif 000004
【図３】
2008262507.tif 000005
【図４】
2008262507.tif 000006
【図５】
2008262507.tif 000007
【図６】
2008262507.tif 000008
【図７】
2008262507.tif 000009
【図８】
2008262507.tif 000010
【図９】
2008262507.tif 000011
【図１０】
2008262507.tif 000012
【図１１】
2008262507.tif 000013
【図１２】
2008262507.tif 000014
【図１３】
2008262507.tif 000015
【図１４】
2008262507.tif 000016
【図１５】
2008262507.tif 000017
【図１６】
2008262507.tif 000018
【図１７】
2008262507.tif 000019
【図１８】
2008262507.tif 000020
【図１９】
2008262507.tif 000021
【図２０】
2008262507.tif 000022
【図２１】
2008262507.tif 000023