(57)【特許請求の範囲】
【請求項１】
ＸＭＬデータをフィルタリング処理するための分岐ＸＰａｔｈ式を処理するＸＰａｔｈ式処理装置であって、
前記ＸＰａｔｈ式処理装置は、ＸＰａｔｈ式格納手段と、パス抽出手段と、共有化インデックス構築手段と、共有化バッファ管理手段と、ＸＰａｔｈ式処理手段と、を有し、
前記ＸＰａｔｈ式格納手段は、入力された複数の分岐ＸＰａｔｈ式を記憶手段に格納し、
前記パス抽出手段は、前記ＸＰａｔｈ式格納手段により前記記憶手段に格納された分岐ＸＰａｔｈ式ごとに、
分岐ＸＰａｔｈ式の述語の条件を満たしたときに返すパスをターゲットパスの絶対パスとし、
分岐ＸＰａｔｈ式の一番左にある述語のコンテキストパスをターゲットパスのスコープパスとし、
相対パスで表現されている述語と述語のコンテキストパスとを結合して述語の絶対パスとし、
述語のコンテキストパスを述語のスコープパスとして、それぞれ抽出し、
前記共有化インデックス構築手段は、
前記パス抽出手段により抽出された前記ターゲットパスの絶対パスからＴＡＮ（Target Absolute Node）を生成し、
前記パス抽出手段により抽出された前記ターゲットパスのスコープパスからＴＳＮ（Target Scope Node）を生成し、
前記パス抽出手段により抽出された前記述語の絶対パスからＰＡＮ（Predicate Absolute Node）を生成し、
前記パス抽出手段により抽出された前記述語のスコープパスからＰＳＮ（Predicate Scope Node）を生成し、
同じ分岐ＸＰａｔｈ式から抽出される前記ＴＡＮおよび前記ＴＳＮの組のうちのパスが一致する組が複数存在するときには、それらの組を１つの組へと統合し、
同じ分岐ＸＰａｔｈ式から抽出される前記ＰＡＮおよび前記ＰＳＮの組のうちのパスが一致する組が複数存在するときには、それらの組を１つの組へと統合し、
前記ＴＳＮおよび前記ＰＳＮをＳＮ（Scope Node）とし、パスが一致するＳＮが複数存在するときには、それらを１つのＳＮへと統合し、
抽出元の前記分岐ＸＰａｔｈ式から生成され、ノードの組み合わせにより、前記分岐ＸＰａｔｈ式を表現することができ、同じ抽出元の分岐ＸＰａｔｈ式から抽出される前記ＴＡＮと当該ＴＡＮが示す絶対パスに対応するスコープパスに該当する前記ＳＮとをリンクで接続し、前記同じ抽出元の分岐ＸＰａｔｈ式から抽出される前記ＰＡＮと当該ＰＡＮが示す絶対パスに対応するスコープパスに該当する前記ＳＮとをリンクで接続し、前記同じ抽出元の分岐ＸＰａｔｈ式から抽出される前記ＴＡＮと前記ＰＡＮとを、その同じ抽出元の分岐ＸＰａｔｈ式で示されている論理和または論理積を表す論理記号で接続することで、複数の分岐ＸＰａｔｈ式から１つの共有化インデックスを構築し、
前記共有化バッファ管理手段は、入力されたＸＭＬデータの構成要素ごとにその出現順序に従って順番に番号を割り当てた共有化バッファを、前記共有化インデックスの前記ＴＡＮごとに構築するとともに、その各ＴＡＮの共有化バッファに各ＴＡＮが示すターゲットパスの範囲分のＸＭＬデータを格納し、
前記ＸＰａｔｈ式処理手段は、
入力された前記ＸＭＬデータをＳＡＸパーサで構文解析することにより、コールバック関数を発生させ、
前記共有化インデックスの前記ＳＮが示すスコープパスの終了が前記コールバック関数により通知されると、
前記共有化インデックスにおける、前記通知された前記ＳＮからリンクで接続される前記ＰＡＮが示す述語の真偽判定を行い、
前記述語の真偽判定を行った前記ＰＡＮからリンクで接続される前記ＴＡＮについて、そのＴＡＮにリンクする前記ＰＡＮの判定結果が偽であるときには、そのＴＡＮの共有化バッファから前記ＳＮが示すスコープパスの範囲分のＸＭＬデータを削除するとともに、前記通知された前記ＳＮからリンクで接続される全ての前記ＰＡＮに対して前記述語の真偽判定を行った後に、前記通知された前記ＳＮからリンクで接続される全ての前記ＴＡＮについて、そのＴＡＮの共有化バッファからそのＴＡＮが示すターゲットパスの範囲分のＸＭＬデータのうちの削除されなかった範囲分のＸＭＬデータをフィルタリング結果として出力することを特徴とするＸＰａｔｈ式処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＸＰａｔｈ式処理装置に関する。
【背景技術】
【０００２】
ＸＭＬ（Extensible Markup Language）は、ネットワーク上で交換可能な標準的なデータ記述方式を提供する技術であり、現在ｎｅｗｓＭＬなどをはじめとして広く使われている。ＸＰａｔｈ（XML Path Language）式は、ＸＭＬデータの一部を特定するための記述方式を提供する技術であり、ＸＭＬデータに対するクエリや変換などにおいて重要な役割を果たしている。
【０００３】
ＸＭＬデータとその中の一部分を表しているＸＰａｔｈ式とを入力としたときに、ＸＰａｔｈ式により指定された部分を抽出する技術が注目を集めている。例えば、ｎｅｗｓＭＬは、ニュース記事やそれに関連した画像、動画、音声などをウェッブ端末、携帯電話、テレビ（データ放送）等、さまざまな端末に送ることができる。このとき、ｎｅｗｓＭＬの受け側（利用者）は、ＸＰａｔｈ式を配信サーバに登録しておくことで膨大な情報の中から、必要な情報のみを得ることができる。
【０００４】
なお、ＸＰａｔｈは、Ｗ３Ｃ（The World Wide Web Consortium）が勧告した標準規格で、ＸＭＬ文書の中の特定の要素を指し示す記述方法を定めている。ＸＰａｔｈは、ＸＳＬＴ（XML Stylesheet Language Transformations）やＸＰｏｉｎｔｅｒ（XML Pointer Language）で使われる位置指定の記述方式を独立させたものである。ＸＰａｔｈは、ハイパーリンクなどに使われる人為的に付加されたアンカーによる指定とは異なり、ＸＭＬデータを表す木構造をたどって文書内のあらゆる要素や属性にアクセスする手段を提供する。なお、ＸＰａｔｈ式は、ＸＰａｔｈの規格に従った実際の式である。
【０００５】
ＸＭＬデータのパース（Parse）処理は、ＤＯＭ（Document Object Model）またはＳＡＸ（Simple API for XML）に分類される。ＤＯＭとは、ＸＭＬが木で表現できることに注目し処理を行う技術である。ＤＯＭ（ＸＭＬを内部木で表現したもの）に対して走査を行うことで、分岐処理に対応することができる。ただし、ＤＯＭでは巨大なＸＭＬに対しても内部木（以下、ＤＯＭ木）を作らなければならないために、メモリ使用量が膨大となる。また、ニュース配信や株価配信のように逐次的なデータ（時系列データなど）として送られてリアルタイム処理を必要とする場合には、ＤＯＭ木を用いたＸＰａｔｈ式処理は不可能である。
【０００６】
一方、ＳＡＸは、前記のＤＯＭの弱点であるリアルタイム性とメモリ使用量削減を狙った技術である。ＤＯＭでは、ＸＭＬを木として表現することで、ＸＰａｔｈ式を与えられたときに走査することで検索およびフィルタリング処理を行った。一方ＳＡＸを用いた場合には、ＸＭＬをあくまでも文書を上から下へ走査することしかできないために、ＤＯＭと同じようには、ＸＰａｔｈ式処理を行うことができない。
【０００７】
そこで、ＳＡＸを用いたＸＰａｔｈ式処理技術としては、ＮＦＡ（Nondeterministic Finite Automaton）を利用した方法やＤＦＡ（Deterministic Finite Automaton）を利用した方法がある。ＮＦＡとＤＦＡとは完全に独立したものではなく、それぞれ一長一短がある。ＮＦＡは、１つのＸＰａｔｈ式に対して１つのオートマトンを構築する。複数のＸＰａｔｈ式が与えられたときには、いくつものオートマトンを構築する必要がある。ＤＦＡは、ＮＦＡから構築される。それぞれの長所短所を表１に示す。
【表１】
0004519028.tif 000002
【０００８】
ＮＦＡやＤＦＡが作成されると入力されたＸＭＬの中でどの部分がＸＰａｔｈ式に一致するかを判断することが可能となる。ＮＦＡを利用した方法は、１つのＸＰａｔｈ式に対して１つのＮＦＡを作成する。この方法は、ＸＰａｔｈ式が多くなると処理速度が著しく劣化する特徴がある（非特許文献２）。ＤＦＡを利用した方法は、前記ＮＦＡを変換することで実現できる。ＤＦＡは、ＸＰａｔｈ式が多くなっても処理速度が一定のまま高速に維持できるという特徴がある。ただし、変換の際にメモリ利用量が膨大になるという欠点も有する。
【０００９】
遅延型ＤＦＡ（ｌａｚｙＤＦＡ）と呼ばれる手法は、非決定オートマトンからＤＦＡヘすぐに変換を行うことをせず、ＸＭＬが入力された際に利用されるオートマトンのみを変換することで高速な処理を実現している（非特許文献１）。
【００１０】
前記のＳＡＸを利用したＸＰａｔｈ式処理装置を拡張し、１つのＸＰａｔｈ式に対して複数の検索条件に対応した技術が分岐ＸＰａｔｈ式処理装置である（非特許文献３、特許文献１）。このシステムでは、複数の分岐ＸＰａｔｈ式を１つずつ処理している。つまり、１つのＸＰａｔｈ式に対して、１つの検索インデックスを構築しているということである。検索インデックスは、ＸＰａｔｈ式の数と同じだけ存在するので、ＸＰａｔｈ式が増加すればするほど線形に処理時間が増加することが知られている。
【特許文献１】特開２００５−１３５１９９号公報
【非特許文献１】T.J.Green,G.Miklau,M.Onizuka,D.Suciu著、“Processing XML Streams with Deterministic Automata”、In Proceeding of ICDT(2003).
【非特許文献２】Y.Diao,P.Fischer and M.Franklin著、“Yfilter:Efficient and scalable filtering of xml documents”、In Proceedings of the ICDE(2002).
【非特許文献３】M.Onizuka著、“Light-weight XPath processing of XML stream with deterministic automata”、CIKM(2003).
【発明の開示】
【発明が解決しようとする課題】
【００１１】
前記した分岐ＸＰａｔｈ式処理装置は、複数の条件を処理するにあたりＮＦＡを用いたために、登録されるＸＰａｔｈ式が増加するに従って、ＸＰａｔｈ式に含まれる条件を判定する処理が増加してしまい、性能が著しく劣化するという問題がある。実運用上では複数の条件を指定する必要性が高いため、この性能劣化は分岐ＸＰａｔｈ式処理装置におけるボトルネックとなっている。
【００１２】
そこで、本発明は、前記した問題を解決し、ＸＭＬデータをフィルタリング処理するための検索条件を示す分岐ＸＰａｔｈ式が複数存在するときに、フィルタリング処理を高速化し、かつメモリ使用量を削減することができるように、分岐ＸＰａｔｈ式を処理する手段を提供することを主な目的とする。
【課題を解決するための手段】
【００１３】
前記課題を解決するために、本発明は、
ＸＭＬデータをフィルタリング処理するための分岐ＸＰａｔｈ式を処理するＸＰａｔｈ式処理装置であって、
前記ＸＰａｔｈ式処理装置は、ＸＰａｔｈ式格納手段と、パス抽出手段と、共有化インデックス構築手段と、共有化バッファ管理手段と、ＸＰａｔｈ式処理手段と、を有し、
前記ＸＰａｔｈ式格納手段は、入力された複数の分岐ＸＰａｔｈ式を記憶手段に格納し、
前記パス抽出手段は、前記ＸＰａｔｈ式格納手段により前記記憶手段に格納された分岐ＸＰａｔｈ式ごとに、
分岐ＸＰａｔｈ式の述語の条件を満たしたときに返すパスをターゲットパスの絶対パスとし、
分岐ＸＰａｔｈ式の一番左にある述語のコンテキストパスをターゲットパスのスコープパスとし、
相対パスで表現されている述語と述語のコンテキストパスとを結合して述語の絶対パスとし、
述語のコンテキストパスを述語のスコープパスとして、それぞれ抽出し、
前記共有化インデックス構築手段は、
前記パス抽出手段により抽出された前記ターゲットパスの絶対パスからＴＡＮ（Target Absolute Node）を生成し、
前記パス抽出手段により抽出された前記ターゲットパスのスコープパスからＴＳＮ（Target Scope Node）を生成し、
前記パス抽出手段により抽出された前記述語の絶対パスからＰＡＮ（Predicate Absolute Node）を生成し、
前記パス抽出手段により抽出された前記述語のスコープパスからＰＳＮ（Predicate Scope Node）を生成し、
同じ分岐ＸＰａｔｈ式から抽出される前記ＴＡＮおよび前記ＴＳＮの組のうちのパスが一致する組が複数存在するときには、それらの組を１つの組へと統合し、
同じ分岐ＸＰａｔｈ式から抽出される前記ＰＡＮおよび前記ＰＳＮの組のうちのパスが一致する組が複数存在するときには、それらの組を１つの組へと統合し、
前記ＴＳＮおよび前記ＰＳＮをＳＮ（Scope Node）とし、パスが一致するＳＮが複数存在するときには、それらを１つのＳＮへと統合し、
抽出元の前記分岐ＸＰａｔｈ式から生成され、ノードの組み合わせにより、前記分岐ＸＰａｔｈ式を表現することができ、同じ抽出元の分岐ＸＰａｔｈ式から抽出される前記ＴＡＮと当該ＴＡＮが示す絶対パスに対応するスコープパスに該当する前記ＳＮとをリンクで接続し、前記同じ抽出元の分岐ＸＰａｔｈ式から抽出される前記ＰＡＮと当該ＰＡＮが示す絶対パスに対応するスコープパスに該当する前記ＳＮとをリンクで接続し、前記同じ抽出元の分岐ＸＰａｔｈ式から抽出される前記ＴＡＮと前記ＰＡＮとを、その同じ抽出元の分岐ＸＰａｔｈ式で示されている論理和または論理積を表す論理記号で接続することで、複数の分岐ＸＰａｔｈ式から１つの共有化インデックスを構築し、
前記共有化バッファ管理手段は、入力されたＸＭＬデータの構成要素ごとにその出現順序に従って順番に番号を割り当てた共有化バッファを、前記共有化インデックスの前記ＴＡＮごとに構築するとともに、その各ＴＡＮの共有化バッファに各ＴＡＮが示すターゲットパスの範囲分のＸＭＬデータを格納し、
前記ＸＰａｔｈ式処理手段は、
入力された前記ＸＭＬデータをＳＡＸパーサで構文解析することにより、コールバック関数を発生させ、
前記共有化インデックスの前記ＳＮが示すスコープパスの終了が前記コールバック関数により通知されると、
前記共有化インデックスにおける、前記通知された前記ＳＮからリンクで接続される前記ＰＡＮが示す述語の真偽判定を行い、
前記述語の真偽判定を行った前記ＰＡＮからリンクで接続される前記ＴＡＮについて、そのＴＡＮにリンクする前記ＰＡＮの判定結果が偽であるときには、そのＴＡＮの共有化バッファから前記ＳＮが示すスコープパスの範囲分のＸＭＬデータを削除するとともに、前記通知された前記ＳＮからリンクで接続される全ての前記ＰＡＮに対して前記述語の真偽判定を行った後に、前記通知された前記ＳＮからリンクで接続される全ての前記ＴＡＮについて、そのＴＡＮの共有化バッファからそのＴＡＮが示すターゲットパスの範囲分のＸＭＬデータのうちの削除されなかった範囲分のＸＭＬデータをフィルタリング結果として出力することを特徴とする。
【００１４】
これにより、フィルタリング処理を高速化しかつメモリ使用量を削減することができる。
【発明の効果】
【００２７】
本発明によれば、複数の分岐ＸＰａｔｈ式が入力される場合に、分岐ＸＰａｔｈ式に関する条件判断やコールバック呼び出しの回数を減らすように共有化インデックスを構築することによって、フィルタリングの高速化を行うことができる。
【発明を実施するための最良の形態】
【００２８】
以下に、本発明が適用されるＸＰａｔｈ式処理システムの一実施形態について、図面を参照して詳細に説明する。
【００２９】
まず、本実施形態の概要を説明する。最初にＸＰａｔｈ式に関する説明を行い、その後にＸＭＬに関する説明を行う。
【００３０】
/bib/book[contains(title/text(),‘XML')][.//author=‘Bob'][publication<=1999]    …式１
式１などのＸＰａｔｈ式は、ＸＭＬ文書の中の特定の要素を指し示す記述方法を定めている。ＸＰａｔｈ式の基本的な記述の仕方はＵＮＩＸ（登録商標）のファイルシステムに似ていて、文書木構造の頂点となるルートノードを「／」で表し、以下、「／」で区切って要素をたどっていく。ａ要素の中のｂという値を参照するには「／ａ／ｂ」と記述する。ノードのデータ型やノードの種類、名前空間（XML namespace）の扱いなどについても規定があり、これらを使用して条件式や演算などを含んだ複雑な位置指定を行うこともできる。
【００３１】
ＸＭＬ文書の中の特定の要素を指し示すパスは、絶対パス（Absolute Path）または相対パス（Comparative Path）の形式で表現される。絶対パスとは、ルートノードから記述されているようなＸＰａｔｈ式である。絶対パスは、あるノードを指し示す上で完全な情報を持ったＸＰａｔｈ式であり、絶対パスを用いることで検索対象ノードの等価性を完全に判断すること、つまり絶対パスと絶対パスとが同じか否かを判定することが可能となる。一方、相対パスは、ある着目するノード（コンテキストとも呼ばれる）から見た相対的な位置を示すパスである。
【００３２】
１つのＸＰａｔｈ式からは、１つのターゲットパス（Target Path）および１つ以上の述語（Predicate）が抽出される。ターゲットパスは、分岐ＸＰａｔｈ式が条件を満たした場合に、返されるべきＸＭＬの部分を示したパスである。ターゲットパスは、ＸＰａｔｈ式の括弧［…］で囲まれた部分を除く部分を抽出することにより得られる。
【００３３】
一方、述語は、ＸＰａｔｈ式中に存在する条件部であり、ＸＰａｔｈ式の括弧［…］で囲まれている。１つの述語は、１つの括弧［…］に対応する。なお、分岐ＸＰａｔｈ式は、述語を複数持ったＸＰａｔｈ式である。なお、本実施形態は、後記するように、１つ以上の分岐ＸＰａｔｈ式を１つの共有化インデックスに変換することによって、分岐ＸＰａｔｈ式を高効率で処理することを特徴とする。
【００３４】
次に、ターゲットパスおよび述語について、絶対パスおよびスコープパス（ＳＰ：Scope Path）を定義する。スコープパスは、述語の絶対パスやターゲットパスが有効であることを示すための絶対パスである。述語の絶対パスやターゲットパスがコールバック関数によって呼び出されたとしても、その時点で対応するスコープパスに含まれていない場合には、述語の絶対パスやターゲットパスの真偽判断、出力判断を行うことができない。
【表２】
0004519028.tif 000003
【００３５】
ターゲットパスの絶対パス（ＴＡＰ：Target Absolute Path）は、前記したように、ＸＰａｔｈ式の括弧［…］で囲まれた部分を除く部分を抽出することにより得られる。ターゲットパスのスコープパス（ＴＳＰ：Target Scope Path）は、ＸＰａｔｈ式の一番ルート側にある述語の前までの絶対パス、つまり、分岐ＸＰａｔｈ式の一番左にある述語のコンテキストパスとする。
【００３６】
述語の絶対パス（ＰＡＰ：Predicate Absolute Path）は、述語に含まれるＸＰａｔｈ式（述語の相対パス）と、後記する述語のスコープパスとを結合することにより、得られる。述語のスコープパス（ＰＳＰ：Predicate Scope Path）は、コンテキストパスとすることで構築できる。コンテキストパスとは、述語内に含まれる相対パスで表現されたＸＰａｔｈ式がどのような状況において有効であるかを示している。実際には、分岐ＸＰａｔｈ式の先頭からその述語までの分岐ＸＰａｔｈ式を解析、取得する。得られた分岐ＸＰａｔｈ式から述語を全て抜いたものがコンテキストパスとなる。
【００３７】
次に、ＸＭＬおよびそのＸＭＬに対してＸＰａｔｈ式を適用するＳＡＸベースのフィルタリング処理に関する説明を行う。なお、ＸＭＬの詳細については、例えば、文献「中山幹敏,奥井康弘著、“改訂版標準ＸＭＬ完全解説(上)(下)”、技術評論社(2001).」に詳しい。
【００３８】
図１は、ＳＡＸフィルタとユーザアプリケーションとの関係を示す説明図である。まず、ＳＡＸのコールバック関数について説明する。ＳＡＸは、前記のように、ＸＭＬデータを解析するときに木を構成しない。よって、ＸＭＬデータの解析処理を行う際には、コールバック関数を用いた手法がとられている。
【００３９】
ＳＡＸフィルタにＸＭＬデータが入力されると、上から順に読み込まれる。ｂｉｂが認識されると、ＳＡＸ装置はユーザアプリケーション上にあるstartElement関数を呼び出す。この際、startElement関数の引数には、ｂｉｂを入れておくことで、ユーザアプリケーション側ではｂｉｂという情報を取得することができる。このように、フィルタ装置がユーザアプリケーションの関数を呼び出すことをコールバックと呼ぶ。コールバック関数には、表３のようなものがある。
【表３】
0004519028.tif 000004
【００４０】
図２（ａ）は、ＸＭＬデータの一例を示している。文献用のＸＭＬでありｂｉｂタグの下にｂｏｏｋタグがある。ｂｏｏｋタグの下には、ｔｉｔｌｅ（タイトル）タグ、ａｕｔｈｏｒ（著者）タグ、ｐｕｂｌｉｃａｔｉｏｎ（発行年）タグ、ｐｒｉｃｅ（価格）タグがある。このような、ＸＭＬに対して、発行年が１９９９年以前であり、タイトルにＸＭＬを含み、著者がＢｏｂであるような条件に一致したｂｏｏｋ要素を抽出するＸＰａｔｈ式は、式１のように記すことができる。
【００４１】
図２（ａ）のＸＭＬに式１のＸＰａｔｈ式を適用した場合に期待される返値は、図２（ｂ）に示したものとなる。注意してほしいのは、ｂｏｏｋタグに含まれる部分が返されていることである。/bib/bookという記述が述語の条件を満たしたときに返されるタグ名を示している。この/bib/bookが前記したＴＡＰである。それぞれの述語のＰＳＰは、述語にいたるまでのパスをつなげたものであるので、/bib/bookとなる。
【００４２】
次に、式２について考える。
/bib/book[contains(title/text(),‘XPath')][publication=2000]/authors    …式２
式２は、タイトルが「ＸＰａｔｈ」という文字列を含んでおり、発行年が２０００年であるような本の著者を取得するというものである。このＸＰａｔｈ式を図２（ａ）のＸＭＬに適用させた場合の返値は、図２（ｃ）のようになる。このときのＴＡＰは、/bib/book/authorsとなる。ＰＳＰは、/bib/bookである。
【００４３】
図３に示すＸＰａｔｈ式処理システムは、ＸＰａｔｈ式登録装置１１０、パス抽出装置１６０、共有化インデックス構築装置１５０、共有化バッファ管理装置１８０、ＸＰａｔｈ式処理装置１９０、共有化インデックス検索装置１４０、および、分岐無ＸＰａｔｈ式処理装置２００を含む。ＸＰａｔｈ式処理システムの記憶手段は、ＸＰａｔｈ式格納装置１２０のＸＰａｔｈ式、入力される解析対象となるＸＭＬデータ１３０、および、ＸＭＬデータ１３０から生成される共有化バッファ１７０を格納する。このＸＰａｔｈ式処理システムを構成する計算機の台数は、図３に示す台数に限定されず、１台に集約するなど様々な構成を取ることができる。
【００４４】
ＸＰａｔｈ式処理システムの各装置は、演算処理を行う際に用いられる記憶手段としてのメモリと、前記演算処理を行う演算処理装置とを少なくとも備えるコンピュータとして構成される。なお、メモリは、ＲＡＭ（Random Access Memory）などにより構成される。演算処理は、ＣＰＵ（Central Processing Unit）によって構成される演算処理装置が、メモリ上のプログラムを実行することで、実現される。以下、各装置の詳細を説明する。
【００４５】
図３において、破線の矢印はデータフローを示す。ＸＰａｔｈ式処理システムにＸＭＬデータ１３０が入力されると、ＸＰａｔｈ式処理装置１９０へ転送される。ＸＰａｔｈ式処理装置１９０では、入力されたＸＭＬデータ１３０を分岐無ＸＰａｔｈ式処理装置２００へ出力する。分岐無ＸＰａｔｈ式処理装置２００によって、入力されたＸＭＬデータ１３０が解析されて、共有化インデックス装置１５０において登録された分岐無ＸＰａｔｈ式に対する結果がＸＰａｔｈ式処理装置１９０へ送られてくる。このとき、分岐無ＸＰａｔｈ式処理装置２００は、ＳＡＸベースでＸＭＬデータ１３０を処理するために、返値に対して順番をつけることが可能となる。
【００４６】
図３において、実線の矢印は機能呼び出し関係を示しており、利用するほうから利用されるほうへと向きを描いている。ＸＰａｔｈ式処理装置１９０は、分岐無ＸＰａｔｈ式処理装置２００の結果を共有化バッファ管理装置１８０へ送る。このとき、コールバック関数を利用してデータを送ることになる。
【００４７】
ＸＰａｔｈ式登録装置１１０は、入力された分岐ＸＰａｔｈ式をＸＰａｔｈ式格納装置１２０に登録する。パス抽出装置１６０は、ＸＰａｔｈ式格納装置１２０を呼び出して分岐ＸＰａｔｈ式を取得し、その分岐ＸＰａｔｈ式から各パス（ＴＡＰ，ＴＳＰ，ＰＡＰ，ＰＳＰ）を抽出する。以下、パスの抽出処理を詳細に説明する。
【００４８】
パス抽出装置１６０は、分岐ＸＰａｔｈ式をターゲットパスおよび述語に分解し、それぞれの絶対パス（ＡＰ）を構築する。パス抽出装置１６０は、分岐ＸＰａｔｈ式から述語を除きつなぎ合わせてＴＡＰを構築し、分岐ＸＰａｔｈ式から述語を取り出して述語に含まれる相対パスおよび述語までのパスをつなぎ合わせてＰＡＰを構築する。なお、構築された絶対パスは、分岐無しＸＰａｔｈ式であるためそれ自体のフィルタ処理は、分岐無ＸＰａｔｈ式処理装置２００を用いて行うことができる。
【００４９】
そして、パス抽出装置１６０は、ＴＳＰはターゲットパス自身とし、ＰＳＰは述語のコンテキストパスとすることで、それぞれＳＰを構築する。なお、述語のコンテキストパスとは、述語内に含まれる相対パスで表現されたＸＰａｔｈ式がどのような状況において有効であるかを示している。実際には、分岐ＸＰａｔｈ式の先頭からその述語までの分岐ＸＰａｔｈ式を解析、取得する。得られた分岐ＸＰａｔｈ式から述語を全て抜いたものがコンテキストパスとなる。
【００５０】
なお、分岐ＸＰａｔｈ式の処理では、分岐無しＸＰａｔｈ式の処理とは異なり、出力するか否かの判断が述語の真偽判定までできないので、出力の可能性のあるデータをバッファすることが必要になる。図４は、ＴＡＮが持つバッファ構造の一例を示す説明図である。まず、入力されたストリームＸＭＬの中で、出力される可能性のあるＸＭＬデータ１３０を基本バッファへ格納する。複数の分岐ＸＰａｔｈ式に対して、それぞれがどのようなバッファを持つかについては、基本バッファヘの参照情報を用いて構築する。つまり、複数の分岐ＸＰａｔｈ式に対してただひとつのバッファ実体を持たせることを可能とし、メモリ使用量を抑えることが可能となる。
【００５１】
共有化インデックス構築装置１５０は、パス抽出装置１６０が抽出した各パスを用いて、共有化インデックスを構築する。共有化インデックスは、述語群の論理積や論理和、述語に対応する絶対パスをノードとし、それぞれのノード間の関係をリンクとするグラフである。共有化インデックスにおける分岐ＸＰａｔｈ式の述語は、分解された述語群の論理積や論理和を用いて表現されている。
【００５２】
なお、共有化インデックスでは、複数の分岐ＸＰａｔｈ式から部分的に等しいノードやリンクが共有化される。複数の分岐ＸＰａｔｈ式が入力され、それぞれが共有化インデックスを持つ場合には、ストリームが入力された場合に同様の処理を行う場合が比較的多く存在する。同様の処理を行う部分を共有化、つまり、複数の分岐ＸＰａｔｈ式の共有化インデックスの共有化を行い、共有化インデックスを構築する。共有化インデックスを用いて、一括して複数の分岐ＸＰａｔｈ式を処理することが可能となる。
【００５３】
具体的には、共有化インデックス構築装置１５０は、複数の分岐ＸＰａｔｈ式が入力された場合に、まず、最初の分岐ＸＰａｔｈ式に対して共有化インデックスを構築する。次に、別の分岐ＸＰａｔｈ式は、パス抽出装置１６０と共有化インデックス構築装置１５０とによって解析される。このとき、共有化インデックス構築装置１５０は、最初の分岐ＸＰａｔｈ式の共有化インデックスに対して走査を行い、共有化インデックス中に別の分岐ＸＰａｔｈ式の共有化インデックスと同様の処理を行う部分がある場合には、最初の分岐ＸＰａｔｈ式の共有化インデックスを利用する。全ての分岐ＸＰａｔｈ式に対して順次このように共有化インデックスを構築する。以下、共有化インデックスを構成するノードを説明する。なお、分岐無ＸＰａｔｈ式処理装置２００は、入力された各パスから後記する各ノードが保持する返値を出力する。
【表４】
0004519028.tif 000005
【００５４】
ＴＡＮ（Target Absolute Node）は、ＴＡＰに対応するノードである。ＴＳＮ（Target Scope Node）は、ＴＳＰに対応するノードである。ＰＡＮ（Predicate Absolute Node）は、ＰＡＰに対応するノードである。ＰＳＮ（Predicate Scope Node）は、ＰＳＰに対応するノードである。そして、絶対パスに対応するノード（ＡＮ：Absolute path Node）は、ＴＡＮおよびＰＡＮであり、スコープパスに対応するノード（ＳＮ：Scope path Node）は、ＴＳＮおよびＰＳＮである。なお、共有化インデックスは、前記したノードの他に、論理ノード（ＬＮ：Logical Node）を含めてもよい。なお、ＬＮは、ＴＡＮ、ＰＡＮ、および、ＬＮを論理演算子（and，or）によって結合するノードである。
【００５５】
ここで、一致する複数のパスの組（ＴＡＰおよびＴＳＰ）は、１つのノードの組（ＴＡＮおよびＴＳＮ）に統合することができる。同様に、一致する複数のパスの組（ＰＡＰおよびＰＳＰ）は、１つのノードの組（ＰＡＮおよびＰＳＮ）に統合することができる。さらに、パスが一致する複数のＳＰ（ＴＳＰまたはＰＳＰ）は、１つのＳＮに統合することができる。これにより、パスの個数よりもノードの個数のほうが少なくなることが期待され、それに伴い述語のノードに関する比較回数およびＴＡＰ，ＰＡＰに対するコールバック関数の呼び出し回数も少なくなることが期待される。
【００５６】
共有化バッファ管理装置１８０は、分岐ＸＰａｔｈ式のターゲットパスに対して結果を構築する際に必要となるバッファを共有化した共有化バッファ１７０を構築する。つまり、共有化バッファ管理装置１８０は、入力されたＸＭＬデータ１３０が分岐ＸＰａｔｈ式に適合する可能性がある場合に、１つの基本バッファを用意して入力ＸＭＬデータ１３０をバッファリングする。複数の分岐ＸＰａｔｈ式を処理する場合には、それぞれの分岐ＸＰａｔｈ式に関するバッファは実際のＸＭＬデータ１３０を持たずに、基本バッファの区間アドレスを保持する。こうすることで、大きなバッファをそれぞれの分岐ＸＰａｔｈ式に対して用意する必要がなくなるため、メモリの使用量を軽減させることが可能となる。
【００５７】
ＸＰａｔｈ式処理装置１９０は、分岐ＸＰａｔｈ式のフィルタリング処理を行う。つまり、ＸＰａｔｈ式処理装置１９０は、分岐無ＸＰａｔｈ処理装置２００からのコールバック関数を受けて、分岐ＸＰａｔｈ式のフィルタリング処理を行い、その結果を出力する。ＸＰａｔｈ式処理装置１９０は、共有化インデックス検索装置１４０および共有化バッファ管理装置１８０を利用する。具体的には、ＸＰａｔｈ式処理装置１９０は、入力されたＸＭＬデータ１３０をＳＡＸパーサおよびオートマトンを用いて処理し、コールバック関数を用いて実施されるスコープパスの終了が通知された直後に、ターゲットパスに対する述語の真偽判定を行い、複数の分岐ＸＰａｔｈ式を一括してフィルタリング処理する。
【００５８】
分岐無ＸＰａｔｈ式処理装置２００は、既存技術のＳＡＸベースのＸＰａｔｈ式処理装置となっており（非特許文献１、非特許文献２参照）、ターゲットパスや述語、スコープパスの分岐無しＸＰａｔｈ式を登録し、ストリームのＸＭＬデータ１３０を入力するとコールバック関数を通じて、分岐無しＸＰａｔｈ式に対する結果を返す。
【００５９】
分岐無ＸＰａｔｈ式処理装置２００は、次のような複数の分岐無しＸＰａｔｈ式を高速に処理することができることが知られている。このＸＰａｔｈは、述語を含んでいないが、分岐ＸＰａｔｈ式を分解して登録することが可能である。ＳＡＸのコールバック関数による返値と述語の条件とを比較することで、分岐ＸＰａｔｈ式はストリームＸＭＬデータ１３０が述語に適合するかどうかを決定することが可能となる。
/bib/book
/bib/book/title
/bib/book/publication
【００６０】
図５は、パス抽出装置によるパス抽出処理の実行例を示す説明図であり、式３〜式５のＸＰａｔｈ式が入力されたときの出力を示している。それぞれの分岐ＸＰａｔｈ式に対して、結果が出力される。
/bib/book[price<=21OO][publication<=2000]/authors[author='Bob']    …式３
/bib/book[price<=21OO][publication<=2000]/authors/author    …式４
/bib[book/price=21OO][book/publication<=2000]/book/authors/author    …式５
式３に対しては、まず、分岐ＸＰａｔｈ式から全ての述語を抜いた後記のようなＸＰａｔｈ式をＴＡＰとする。
/bib/book/authors
【００６１】
次に、一番ルート側にある述語
[price<=2100]
の前までのＸＰａｔｈ式をＴＳＰとする。次に、後記の全ての述語について考える。
[price<=2100]
[publication<=2000]
[author='Bob']
それぞれ、述語が出現する直前までのＸＰａｔｈ式は、
/bib/book
/bib/book
/bib/book/authors
となり、それぞれのＰＳＰ（＝コンテキストパス）とする。述語の相対パスは、後記のようになる。
price
publication
author
【００６２】
前記の相対パスとスコープパスを結合したＸＰａｔｈ式が後記のようなＰＡＰとなる。
/bib/book/price
/bib/book/publication
/bib/book/authors/author
【００６３】
式４に関しては、式３とほぼ同様であるため、省略する。式５に対しても同様に、まず、分岐ＸＰａｔｈ式から全ての述語を抜いた次のようなＸＰａｔｈ式をＴＡＰとする。
/bib/book/authors/author
次に、一番ルート側にある述語
[book/price=2100]
の前までのＸＰａｔｈ式をＴＳＰとする。つまり、
/bib
となる。
【００６４】
次に、次の全ての述語について考える。
[book/price=2100]
[book/publication<=2000]
それぞれ、述語が出現する直前までのＸＰａｔｈ式は、
/bib
/bib
となり、それぞれのＰＳＰ（＝コンテキストパス）とする。述語の相対パスは、次のようになる。
book/price
book/publication
【００６５】
前記の相対パスとスコープパスを結合したＸＰａｔｈ式が次のようなＰＡＰとなる。
/bib/book/price
/bib/book/publication
/bib/book/authors/author
式３および式５のＰＡＰは等しいが、ＰＳＰが変わっていることに注意してほしい。
【００６６】
図６は、共有化インデックスの構築処理の実行例を示す説明図である。図６には、２つのＸＰａｔｈ式（式３、式４）から共有化インデックスを構築した場合の模式図を示している。四角の枠は、ＴＡＮ（ＴＡＮ１，ＴＡＮ２）、ＰＡＮ（ＰＡＮ１，ＰＡＮ２，ＰＡＮ３）（述語の条件部も共有化のためにノードとして表現している）、ＳＮ（ＳＮ１，ＳＮ２）、ＬＮ（ＬＮ１，ＬＮ２）を示している。また、ノード間をつなぐ線は、２つのノードがリンクされていることを示している。ＬＮ１はノード「<=2100」およびノード「<=2000」の親ノードに相当し、ＬＮ２はＬＮ１の親ノードに相当する。
【００６７】
注目してほしいことは、式３および式４において、[price<=2100][publication<=2000]の条件判断を共有化していることである。具体例においては、簡単のため２つのＸＰａｔｈ式のみを挙げているが、実用上登録されるＸＰａｔｈ式は、数万〜数十万単位で登録される。よって、このように処理が同じである場合には、それを１つに統合することにより共有化を図ることができる。また、共有化インデックスを利用しない場合には、同じ意味を持ったインデックスを重複して作成することになるため、不必要なメモリを使うことになる。つまり、共有化インデックスを用いると使用メモリ量の削減を図ることができる。
【００６８】
表５は、共有化バッファ１７０の構築処理の実行例を示す説明図である。コールバック関数によって呼び出される順番が、カウンタ列に入っている数字に対応する。このカウンタ列に入っている数字は、共有化バッファ１７０におけるインデックスを示しており、この数字を利用することで、各ＸＰａｔｈ式に対するバッファを行うことが可能となる。ＸＭＬデータ１３０の格納個数がＸＰａｔｈ式の数となっていた方式に比べ、ＸＰａｔｈ式の数に関係なく１つの共有化バッファ１７０を格納するだけで済む。
【表５】
0004519028.tif 000006
【００６９】
図４は、ＴＡＮが持つバッファ構造の一例を示す説明図である。バッファは、(start、end)という区間を表現する形で積み上げていく。バッファする区間は、述語に影響を受け複数持つべき場合があるので、図４のようにスタックを用いて管理する。１つ目の<book>が出現したときのカウンタは、２である。１つ目の</book>が出現するのは、２３である。２つ目の<book>が出現したときのカウンタは、２４である。２つ目の</book>が出現するのは、４２である。このようにして、出力するべきバッファを共有化バッファ１７０のアドレスとして保持することで、バッファ処理にかかるメモリ使用量を大幅に削減することが可能となる。
【００７０】
図７は、後記するフィルタリング処理のサブルーチン「ＰＡＮ処理」の実行例を示す説明図である。この説明図は、図６で示されている共有化インデックスに対して、図２（ｂ）のＸＭＬデータ１３０が入力されたときを想定する。図８は、後記するフィルタリング処理のサブルーチン「ＳＮ処理」の実行例を示す説明図である。この説明図は、図２（ａ）のＸＭＬデータ１３０に対して実行した一例を示す。
【００７１】
図９は、分岐ＸＰａｔｈ式を分割しターゲットパスおよび述語の絶対パスおよびそれぞれのスコープパスの構築処理を示すフローチャートである。３つのＸＰａｔｈ式（式３、式４、式５）を考える。以下では、これらのＸＰａｔｈ式をもとにして説明を行う。
【００７２】
まず、パス抽出装置１６０は、複数の分岐ＸＰａｔｈ式を入力し（Ｓ１０２）、全てのＸＰａｔｈ式を処理したなら（Ｓ１０４，Ｙｅｓ）、処理を終了する（Ｓ１０６）。つまり、入力された分岐ＸＰａｔｈ式の数だけ、それぞれの分岐ＸＰａｔｈ式に対応する変数Ｐ，変数Ｔの組み合わせを出力する。
【００７３】
次に、パス抽出装置１６０は、全てのＸＰａｔｈ式を処理していないなら（Ｓ１０４，Ｎｏ）、分岐ＸＰａｔｈ式のＰＡＰおよびＰＳＰを格納できる変数Ｐ、ならびに、ＴＡＰおよびＴＳＰを格納できる変数Ｔを、分岐ＸＰａｔｈ式１つに対して１つずつ用意する（Ｓ１０８）。分岐ＸＰａｔｈ式から述語を全て抜いたものをＴＡＰとして変数Ｔに追加し（Ｓ１１０）、分岐ＸＰａｔｈ式のルートから見て、一番最初に出現した述語までのコンテキストパスをＴＳＰとして、変数Ｔに追加する（Ｓ１１２）。
【００７４】
そして、パス抽出装置１６０は、全ての述語を処理していないなら（Ｓ１１４，Ｎｏ）、選択されている述語についてのＰＡＰおよびＰＳＰを変数Ｐに追加する（Ｓ１１６）。具体的には、述語までの分岐ＸＰａｔｈ式から全ての述語を抜いたものをＰＳＰとして変数Ｐに追加し、ＰＳＰと述語に含まれている相対パスを単純に結合したパスをＰＡＰとして、変数Ｐに追加する。全ての述語を処理したなら（Ｓ１１４，Ｙｅｓ）、処理をＳ１０４に戻す。
【００７５】
図１０および図１１は、共有化インデックスの構築処理を示すフローチャートである。共有化インデックスにおいて、そのノードは、共有化インデックスをグラフ構造で表したときの節点として定義される。共有化インデックスのリンクは、ノード間をエッジ（辺）で結合したものである。述語が複数存在する場合には、それらの述語はａｎｄまたはｏｒで結合される。ＬＮとは、この述語の結合を表現するために用いることができる。
【００７６】
まず、共有化インデックス構築装置１５０は、全ての分岐ＸＰａｔｈ式について、分岐ＸＰａｔｈ式から抽出される各パス（ＴＡＰ，ＴＳＰ，ＰＡＰ，ＰＳＰ）を入力し（Ｓ２０２）、全ての分岐ＸＰａｔｈ式を処理したなら（Ｓ２０４，Ｙｅｓ）、その時点で構築されている共有化インデックスを出力して、終了する（Ｓ２０６）。
【００７７】
次に、共有化インデックス構築装置１５０は、全ての分岐ＸＰａｔｈ式を処理していないなら（Ｓ２０４，Ｎｏ）、ＴＡＰからＴＡＮを作成し（Ｓ２０８）、ＴＡＮとリンクするＴＳＮが共有化インデックスに存在しないなら（Ｓ２１０，Ｎｏ）、ＴＳＮを作成する（Ｓ２１２）。なお、ＴＡＮは、分岐ＸＰａｔｈ式に含まれる全ての述語について、ＬＮを用いた木構造により、述語の持つ条件を判断しバッファの出力を行うものである。
【００７８】
そして、共有化インデックス構築装置１５０は、ＴＡＮとＴＳＮとをリンクし（Ｓ２１４）、ＬＮを保持するための変数Ｐを用意する（Ｓ２１６）。変数Ｐは、１つのＬＮをルートとして持つような木構造を構築するために利用される。
【００７９】
さらに、共有化インデックス構築装置１５０は、変数Ｐに含まれるのは、ただ１つのＬＮなら（図１１のＳ２１８，Ｙｅｓ）、その１つのＬＮをルートとして持つような木構造を構築できたことになり、ＬＮとＴＡＮとをリンクし（図１０のＳ２２０）、処理をＳ２０４に戻す。これにより、１つの分岐ＸＰａｔｈ式を共有化インデックスへ組み込むことができたことになる。
【００８０】
そして、共有化インデックス構築装置１５０は、変数Ｐに含まれるのがただ１つのＬＮでないとき（図１１のＳ２１８，Ｎｏ）、選択された分岐ＸＰａｔｈ式の全ての述語に対して処理が完了しておらず（Ｓ２２２，Ｎｏ）、ＰＡＮが存在しないなら（Ｓ２２４，Ｎｏ）、ＰＡＮを作成し、変数Ｐに追加する（Ｓ２２６）。
【００８１】
さらに、共有化インデックス構築装置１５０は、ＰＳＮが存在しないなら（Ｓ２２８，Ｎｏ）、ＰＳＮを作成する（Ｓ２３０）。そして、共有化インデックス構築装置１５０は、ＰＳＮとＰＡＮとをリンクし（Ｓ２３２）、処理をＳ２１８に戻す。
【００８２】
そして、共有化インデックス構築装置１５０は、Ｓ２２２またはＳ２２４の条件を満たし、既に存在する共有化インデックス中に同じＬＮを持つ述語が存在しないなら（Ｓ２３４，Ｎｏ）、変数Ｐに新たに作成したＰＡＮを追加し（Ｓ２３６）、処理をＳ２１８に戻す。新たに作成したＰＡＮは、論理演算子と、ＰＡＮと、変数Ｐに含まれるＰＡＮまたはＬＮから任意にひとつ選択したノードと、を格納するノードである。一方、述語が存在するなら（Ｓ２３４，Ｙｅｓ）、存在したＬＮを変数Ｐに追加し、そのＬＮに格納されているＬＮおよびＰＡＮを変数Ｐから削除し（Ｓ２３８）、処理をＳ２１８に戻す。
【００８３】
図１２は、共有化バッファ１７０の構築処理を示すフローチャートである。
【００８４】
まず、共有化バッファ管理装置１８０は、分岐無ＸＰａｔｈ式処理装置２００のコールバックにより（Ｓ３０２）、処理が起動される。次に、共有化バッファ管理装置１８０は、endDocument()の呼び出しにより（Ｓ３０４，Ｙｅｓ）、終了する（Ｓ３２２）。
【００８５】
そして、共有化バッファ管理装置１８０は、endDocument()の呼び出しではなく（Ｓ３０４，Ｎｏ）、新しいＸＭＬドキュメントが入力された場合には、startDocument()の呼び出しにより（Ｓ３０６，Ｙｅｓ）、バッファの順番を示すカウンタ変数Cを用意し、C＝０で初期化する（Ｓ３０８）。
【００８６】
さらに、共有化バッファ管理装置１８０は、startDocument()の呼び出しではなく（Ｓ３０６，Ｎｏ）、startElement(var)の呼び出しにより（Ｓ３１０，Ｙｅｓ）、カウンタCをインクリメントし、カウンタCおよび引数varで与えられたデータの組を共有化バッファ１７０に追加する（Ｓ３１２）。
【００８７】
そして、共有化バッファ管理装置１８０は、startElement(var)の呼び出しではなく（Ｓ３１０，Ｎｏ）、endElement(var)の呼び出しにより（Ｓ３１４，Ｙｅｓ）、カウンタCをインクリメントし、カウンタCおよび引数varで与えられたデータの組を共有化バッファ１７０に追加する（Ｓ３１６）。
【００８８】
さらに、共有化バッファ管理装置１８０は、endElement(var)の呼び出しではなく（Ｓ３１４，Ｎｏ）、character(var)の呼び出しにより（Ｓ３１８，Ｙｅｓ）、カウンタCをインクリメントし、カウンタCおよび引数varで与えられたデータの組を共有化バッファ１７０に追加する（Ｓ３２０）。character(var)の呼び出しではないときは（Ｓ３１８，Ｎｏ）、処理をＳ３０２に戻す。
【００８９】
図１３は、共有化インデックスと共有化バッファ１７０を用いてフィルタリングする処理を示すフローチャートである。
【００９０】
まず、共有化インデックス検索装置１４０は、分岐無ＸＰａｔｈ式処理装置２００のコールバックにより（Ｓ４０２）、処理が起動され、全てのコールバックを処理したなら（Ｓ４０４，Ｙｅｓ）、終了する（Ｓ４０６）。ＸＰａｔｈ式処理装置１９０は、共有化バッファ管理装置１８０と同様に、コールバック関数を利用して分岐無ＸＰａｔｈ式処理装置２００の処理結果を受け渡す。
【００９１】
次に、共有化インデックス検索装置１４０は、全てのコールバックを処理していないとき（Ｓ４０４，Ｎｏ）、コールバックに対して、全ＴＡＮを処理していないなら（Ｓ４０８，Ｎｏ）、未処理であるＴＡＮを引数として、サブルーチン「ＴＡＮ処理」を実行する（Ｓ４１０）。
【００９２】
そして、共有化インデックス検索装置１４０は、全ＴＡＮを処理し（Ｓ４０８，Ｙｅｓ）、コールバックに対して、全ＰＡＮを処理していないなら（Ｓ４１２，Ｎｏ）、未処理であるＰＡＮを引数として、サブルーチン「ＰＡＮ処理」を実行する（Ｓ４１４）。
【００９３】
さらに、共有化インデックス検索装置１４０は、全ＰＡＮを処理し（Ｓ４１２，Ｙｅｓ）、コールバックに対して、全ＳＮを処理していないなら（Ｓ４１６，Ｎｏ）、未処理であるＳＮを引数として、サブルーチン「ＳＮ処理」を実行する（Ｓ４１８）。全ＳＮを処理したなら（Ｓ４１６，Ｙｅｓ）、処理をＳ４０４に戻す。
【００９４】
図１４は、サブルーチン「ＴＡＮ処理」を示すフローチャートである。
【００９５】
まず、共有化インデックス検索装置１４０は、分岐無ＸＰａｔｈ式処理装置２００のコールバックにより（Ｓ５０２）、処理が起動され、全てのコールバック関数呼び出しが終了したなら（Ｓ５０４，Ｙｅｓ）、終了する（Ｓ５０６）。
【００９６】
次に、共有化インデックス検索装置１４０は、全てのコールバック関数呼び出しが終了していないなら（Ｓ５０４，Ｎｏ）、startDocument()の呼び出しにより（Ｓ５０８，Ｙｅｓ）、カウンタCを用意してC＝０で初期化する（Ｓ５１０）。
【００９７】
そして、共有化インデックス検索装置１４０は、startDocument()の呼び出しではなく（Ｓ５０８，Ｎｏ）、startElement(var)の呼び出しにより（Ｓ５１２，Ｙｅｓ）、カウンタCをインクリメントする（Ｓ５１４）。さらに、共有化インデックス検索装置１４０は、startElement(var)の呼び出しではなく（Ｓ５１２，Ｎｏ）、endElement(var)の呼び出しにより（Ｓ５１６，Ｙｅｓ）、カウンタCをインクリメントする（Ｓ５１８）。そして、共有化インデックス検索装置１４０は、endElement(var)の呼び出しではなく（Ｓ５１６，Ｎｏ）、character(var)の呼び出しにより（Ｓ５２０，Ｙｅｓ）、カウンタCをインクリメントする（Ｓ５２２）。
【００９８】
なお、startElement、endElement、character関数では、共有化バッファ管理装置１８０と同じカウンタ値を持たせるために変数Ｃに対するインクリメントを行っている。これにより、該当するＸＰａｔｈ式のバッファを行うにあたって、共有化バッファ１７０の持つカウンタ値を持ってバッファリングすることが可能となる。
【００９９】
さらに、共有化インデックス検索装置１４０は、character(var)の呼び出しではなく（Ｓ５２０，Ｎｏ）、startContext()の呼び出しにより（Ｓ５２４，Ｙｅｓ）、バッファを追加し、スタートアドレスにカウンタCの値+１を代入する（Ｓ５２６）。
【０１００】
そして、共有化インデックス検索装置１４０は、startContext()の呼び出しではなく（Ｓ５２４，Ｎｏ）、endContext()の呼び出しにより（Ｓ５２８，Ｙｅｓ）、バッファのエンドアドレスにカウンタCの値を代入する（Ｓ５３０）。このときは、endContext関数が呼び出されたときのカウンタの値までバッファすることになる。endContext()の呼び出しではないなら（Ｓ５２８，Ｎｏ）、処理をＳ５０２に戻す。
【０１０１】
図１５は、サブルーチン「ＰＡＮ処理」を示すフローチャートである。ここでは、共有化インデックスを用いて、述語の条件に適合している分岐ＸＰａｔｈ式が何であるかを決定していく。
【０１０２】
まず、共有化インデックス検索装置１４０は、分岐無ＸＰａｔｈ式処理装置２００のコールバックにより（Ｓ６０２）、処理が起動され、全てのコールバック関数呼び出しが終了したなら（Ｓ６０４，Ｙｅｓ）、終了する（Ｓ６０６）。
【０１０３】
次に、共有化インデックス検索装置１４０は、全てのコールバック関数呼び出しが終了しておらず（Ｓ６０４，Ｎｏ）、character(var)の呼び出しでなく（Ｓ６０８，Ｎｏ）、startContext()の呼び出しなら（Ｓ６１０，Ｙｅｓ）、述語の持つ条件を検査することを示すフラグEVALにtureをセットする（Ｓ６１２）。ＰＡＮが分岐無ＸＰａｔｈ式処理装置２００から、startContext、endContext関数を通じて呼び出された場合には、条件を評価するかどうかを決定する。startContextでは、述語の絶対パスが評価されるべき区間に入ったことを示している。
【０１０４】
そして、共有化インデックス検索装置１４０は、startContext()の呼び出しでなく（Ｓ６１０，Ｎｏ）、endContext()の呼び出しにより（Ｓ６１４，Ｙｅｓ）、述語の持つ条件を検査することを示すフラグEVALにfalseをセットする（Ｓ６１６）。endContextでは、述語の絶対パスが評価されるべき区間から外れたことを示している。それぞれの状態をＥＶＡＬフラグによって表す。処理をＳ６０４に戻す。
【０１０５】
さらに、共有化インデックス検索装置１４０は、character(var)の呼び出しがあり（Ｓ６０８，Ｙｅｓ）、EVAL＝false（Ｓ６１８，Ｙｅｓ）またはＰＡＮが持つ全ての条件を処理した（Ｓ６２０，Ｙｅｓ）なら処理をＳ６０４に戻し、EVAL＝falseでなく（Ｓ６１８，Ｎｏ）、ＰＡＮが持つ全ての条件を処理していないなら（Ｓ６２０，Ｎｏ）、以下の処理を行う。
【０１０６】
つまり、共有化インデックス検索装置１４０は、条件を満たすcharacter関数の引数ｖａｒが述語ノードの条件を満たしているかどうかを評価し（Ｓ６２２）、条件を満たしていない（Ｓ６２２，Ｎｏ）なら、条件を満たしていないノードの親ノードヘリンクを通じて条件を満たしていないことを通知し（Ｓ６２４）、通知された親ノードは、その通知により自分の状態が変化した場合には、さらに上位の親ノードヘ通知を行う。一方、条件を満たしている（Ｓ６２２，Ｙｅｓ）なら、条件を満たしたノードの親ノード（演算子ノード）ヘリンクを通じて条件を満たしたこと（条件部が真であること）を通知し（Ｓ６２６）、通知された側の親ノードは、さらに親ノードヘと通知を行う。Ｓ６１８に処理を戻す。
【０１０７】
図１６は、サブルーチン「ＳＮ処理」を示すフローチャートである。具体的には、スコープパスを用いて、ターゲットパスの出力管理、述語の評価が偽である場合のターゲットパスのノードに格納されているバッファからの削除、共有化インデックスの保持情報クリアを行うためのフローチャートが示されている。簡単のため、次の分岐ＸＰａｔｈ式を考える。
/bib/book[price<=2100][publication<=2000]/authors/author
複数の分岐ＸＰａｔｈ式がある場合においても、それぞれの分岐ＸＰａｔｈ式に対して、共有化インデックスと共有化バッファ１７０とを用いて同様に処理することが可能となる。
【０１０８】
まず、共有化インデックス検索装置１４０は、分岐無ＸＰａｔｈ式処理装置２００のコールバックにより（Ｓ７０２）、処理が起動され、全てのコールバック関数呼び出しが終了したなら（Ｓ７０４，Ｙｅｓ）、終了する（Ｓ７０６）。
【０１０９】
次に、共有化インデックス検索装置１４０は、全てのコールバック関数呼び出しが終了していないなら（Ｓ７０４，Ｎｏ）、startDocument()の呼び出しにより（Ｓ７０８，Ｙｅｓ）、カウンタCを用意し，C＝Oで初期化する（Ｓ７１０）。カウンタＣは、共有化バッファ１７０のカウンタを利用するために処理される。また、スコープの区間を表現するstart，end変数を用意し、０で初期化する。
【０１１０】
そして、共有化インデックス検索装置１４０は、startDocument()の呼び出しではなく（Ｓ７０８，Ｎｏ）、startElement(var)の呼び出しにより（Ｓ７１２，Ｙｅｓ）、カウンタCをインクリメントする（Ｓ７１４）。さらに、共有化インデックス検索装置１４０は、startElement(var)の呼び出しではなく（Ｓ７１２，Ｎｏ）、endElement(var)の呼び出しにより（Ｓ７１６，Ｙｅｓ）、カウンタCをインクリメントする（Ｓ７１８）。そして、共有化インデックス検索装置１４０は、endElement(var)の呼び出しではなく（Ｓ７１６，Ｎｏ）、character(var)の呼び出しにより（Ｓ７２０，Ｙｅｓ）、カウンタCをインクリメントする（Ｓ７２２）。
【０１１１】
さらに、共有化インデックス検索装置１４０は、character(var)の呼び出しではなく（Ｓ７２０，Ｎｏ）、startContext()の呼び出しにより（Ｓ７２４，Ｙｅｓ）、startにC+１を代入する（Ｓ７２６）。そして、共有化インデックス検索装置１４０は、startContext()の呼び出しではなく（Ｓ７２４，Ｎｏ）、endContext()の呼び出しにより（Ｓ７２８，Ｙｅｓ）、endにCを代入する（Ｓ７３０）。startContextとendContext関数が呼び出されると、まず、スコープの範囲を決定することができて、それを変数startとendにセットする。endContext()の呼び出しではないときは（Ｓ７２８，Ｎｏ）、処理をＳ７０２に戻す。
【０１１２】
さらに、共有化インデックス検索装置１４０は、ＳＮにリンクする全てのＰＡＮに対して処理しておらず（Ｓ７３２，Ｎｏ）、ＳＮとリンクする全てのＰＡＮの持つ条件が偽である場合には、この述語を条件として持つ全てのＴＡＮのバッファからstartアドレス、endアドレスに含まれるバッファを全てクリアし（Ｓ７３４）、述語ノードとそれに関連する演算子ノードを偽にセットする。
【０１１３】
そして、共有化インデックス検索装置１４０は、ＳＮにリンクする全てのＰＡＮに対して処理し（Ｓ７３２，Ｙｅｓ）、ＴＳＮにリンクする全てのＴＡＮに対して処理していないなら（Ｓ７３６，Ｎｏ）、ＳＮとリンクする全てのＴＡＮがバッファリングしている共有化バッファ１７０の区間(start、end)を出力し（Ｓ７３８）、ＴＡＮにリンクする全てのＰＡＮおよびＬＮを偽にセットする。ＴＳＮにリンクする全てのＴＡＮに対して処理したなら（Ｓ７３６，Ｎｏ）、処理をＳ７０２に戻す。
【０１１４】
以上説明した本発明と、以下に示す比較例とを比較する。
【０１１５】
図１７は、比較例に関するＸＰａｔｈ式から作成されるオートマトンを示す状態遷移図である。既存のＳＡＸベースの複数のＸＰａｔｈ式処理装置１９０（非特許文献３参照）は、式６のようなＸＰａｔｈ式が与えられたときに、図１７のようなオートマトンを作成する。
/bib/book[contains(title/text(),‘XML')][publication>=1999 and publication<=2000]    …式６
オートマトンとは、状態遷移図のようなものである。丸で示されているのは状態であり、矢印に付随して書いてあるのは状態が移るための条件である。状態０は、初期状態を示している。状態０から状態１に移るためには、ｂｉｂ要素がくることが必要である。状態１から状態２へ行くためには、状態１においてｂｏｏｋ要素がくることが必要である。
【０１１６】
状態２においては、ε（イプシロン）遷移と呼ばれる遷移が行われる。この遷移は、状態２に遷移が生じた場合には、自動的に矢印の先の状態へ遷移することを示している。つまり、状態２に遷移すると状態３、５、７にそれぞれ遷移する。状態３から状態４へは式６の最初の条件に対応している（[contains(title/text(),‘XML')]）。タイトルタグに挟まれたテキストの中に“ＸＭＬ”という文字列が含まれている場合には、状態４へ遷移する。状態５から状態６、状態７から８はそれぞれ、[publication>=1999][publication<=2000]に対応している。
【０１１７】
最終的に、状態４、状態６、状態８が全て満たされている場合には、式６を満たしているＸＭＬデータ１３０であるといえる。この際、既存技術ではｐｕｂｌｉｃａｔｉｏｎという同一の検索対象ノードに対して２回の条件判断処理を行っている。複数のＸＰａｔｈ式まで本数を増やせば、同じ検索対象ノードに対して条件の数だけ処理を行うことは効率が非常に悪い。
【０１１８】
一方、本発明は図６に例示する共有化インデックスにおいて、ＸＰａｔｈ式の数やＸＰａｔｈ式に含まれる述語の数に比例してＸＭＬデータ１３０と述語との比較回数が比例するのではなく、重複するデータを統合することにより、比較回数が抑制されている。
【図面の簡単な説明】
【０１１９】
【図１】本発明の一実施形態に関するＳＡＸフィルタとユーザアプリケーションの関係を示す説明図である。
【図２】本発明の一実施形態に関するＸＭＬの例を示す説明図である。
【図３】本発明の一実施形態に関するＸＰａｔｈ式処理装置を示す構成図である。
【図４】本発明の一実施形態に関するＴＡＮが持つバッファ構造の一例を示す説明図である。
【図５】本発明の一実施形態に関する分岐ＸＰａｔｈ式を分割しターゲットパスおよび述語の絶対パスおよびそれぞれのスコープパスの構築処理の実行例を示す説明図である。
【図６】本発明の一実施形態に関する共有化インデックスの構築処理の実行例を示す説明図である。
【図７】本発明の一実施形態に関するフィルタリング処理のサブルーチン「ＰＡＮ処理」の実行例を示す説明図である。
【図８】本発明の一実施形態に関するフィルタリング処理のサブルーチン「ＳＮ処理」の実行例を示す説明図である。
【図９】本発明の一実施形態に関する分岐ＸＰａｔｈ式を分割しターゲットパスおよび述語の絶対パスおよびそれぞれのスコープパスの構築処理を示すフローチャートである。
【図１０】本発明の一実施形態に関する共有化インデックスの構築処理（前半）を示すフローチャートである。
【図１１】本発明の一実施形態に関する共有化インデックスの構築処理（後半）を示すフローチャートである。
【図１２】本発明の一実施形態に関する共有化バッファの構築処理を示すフローチャートである。
【図１３】本発明の一実施形態に関する共有化インデックスと共有化バッファを用いてフィルタリングする処理を示すフローチャートである。
【図１４】本発明の一実施形態に関するフィルタリング処理のサブルーチン「ＴＡＮ処理」を示すフローチャートである。
【図１５】本発明の一実施形態に関するフィルタリング処理のサブルーチン「ＰＡＮ処理」を示すフローチャートである。
【図１６】本発明の一実施形態に関するフィルタリング処理のサブルーチン「ＳＮ処理」を示すフローチャートである。
【図１７】本発明の比較例に関するＸＰａｔｈ式から作成されるオートマトンを示す状態遷移図である。
【符号の説明】
【０１２０】
１１０  ＸＰａｔｈ式登録装置
１２０  ＸＰａｔｈ式格納装置
１３０  ＸＭＬデータ
１４０  共有化インデックス検索装置
１５０  共有化インデックス構築装置
１６０  パス抽出装置
１７０  共有化バッファ
１８０  共有化バッファ管理装置
１９０  ＸＰａｔｈ式処理装置
２００  分岐無ＸＰａｔｈ式処理装置
【図１】
0004519028.tif 000007
【図２】
0004519028.tif 000008
【図３】
0004519028.tif 000009
【図４】
0004519028.tif 000010
【図５】
0004519028.tif 000011
【図６】
0004519028.tif 000012
【図７】
0004519028.tif 000013
【図８】
0004519028.tif 000014
【図９】
0004519028.tif 000015
【図１０】
0004519028.tif 000016
【図１１】
0004519028.tif 000017
【図１２】
0004519028.tif 000018
【図１３】
0004519028.tif 000019
【図１４】
0004519028.tif 000020
【図１５】
0004519028.tif 000021
【図１６】
0004519028.tif 000022
【図１７】
0004519028.tif 000023