以下に添付図面を参照して、この発明に係る記憶媒体、検索方法および検索装置の実施例を詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
まず、本実施例で使用するXML(Extensible Markup Language)データについて説明する。図1は、XMLデータの一例を示す図である。同図に示すように、このXMLデータは、要素識別子「<」、「</」等により要素が区切られた階層構造を有している。そして、図1のXMLデータの木表現は、図2のように表すことが出来る。
図2は、XMLデータの木表現の一例を示す図である。図2に示すように、XMLの木構造では、XMLデータはノードID1,3,4,6,7,9,10,12,13,15,16,18,19,21,22,24,25の要素ノードと、ノードID2,5,8,11,14,17,20,23,26のテキストノードを有している。
以下では、ノードIDがnであり、要素名がelemであるような要素ノードを、elemnと表記する。例えば、Syain1は、ノードIDが1で要素名がSyainである要素ノードを表す。また、ACT3、12、21のように表記する場合は、ノードIDがそれぞれ3、12、21であるような3つの要素ノード(いずれの要素名もACT)を表すものとする。
そして、XMLデータは、それぞれの要素ノード、テキストノードをそれぞれ接続している。例えば、要素ノードのSyain1は、テキストノードの「シグマ戦隊中原ジャー」2、要素ノードのACT3,12,21に接続されている。このように、XMLデータに代表される半構造データは、項目間や項目・値間の関係が木構造として表現可能なデータである。なお、項目は、要素ノードに対応し、値はテキストノードに対応する。
本実施例において、図2に示した木構造に含まれる各ノードの説明をする場合に、根ノード、親ノード、子供ノード、兄ノード、弟ノード、先祖ノード、子孫ノードというような用語を用いる場合がある。図3は、木の用語を補足説明するための図である。図3に示すように、木を構成する各ノードのうち、最上層に位置するノードを根ノードと定義する。また、基準ノードのひとつ上の層に存在し、基準ノードに接続されたノードを、基準ノードに対する親ノード(以下、単に親ノード)と定義する。また、基準ノードのひとつ下の層に存在し、基準ノードに接続されたノードを基準ノードに対する子供ノード(以下、単に子供ノード)と定義する。
また、基準ノードと同じ層に存在し、基準ノードと同じ親ノードに接続され、基準ノードの左側に存在するノードを、基準ノードに対する兄ノード(以下、単に兄ノード)と定義する。また、基準ノードと同じ層に存在し、基準ノードと同じ親ノードに接続され、基準ノードの右側に存在するノードを、基準ノードに対する弟ノード(以下、単に弟ノード)と定義する。また、根ノードから親ノードに至るパスに存在する各ノードをまとめて先祖ノードと定義する。また、基準ノードの配下に接続された各ノードをまとめて子孫ノードと定義する。
例えば、図2において、基準ノードをchara15とした場合の根ノードは、Syain1となり、親ノードは、ACT12となり、兄ノードは、id13となり、弟ノードは、cast18となり、子供ノードは、name16となる。また、基準ノードをchara15とした場合の先祖ノードは、Syain1、ACT12となり、子孫ノードは、name16、シグマブルー17となる。
上述したXMLデータに対して、クエリを指定することによって、クエリの照合位置のデータをXMLデータから検出することが可能となる。なお、W3C(World Wide Web Consortium)によるクエリのサブセットは下記のように定義される。
Path::="/"RPath
RPath::=Step("/"Step)*
Step::=Axis"::"Ntest("["Pred"]")*
Axis::="child"
Ntest::=tagname|"*"|"text()"|"node()"
Pred::=Expr|"not"Expr
Expr::=RPath|1_func"("RPath")"|n_func"("RPath(","const)+")"
ここで、tagname∈Tag(Tagは、タグ名の集合)とする。また、1_funcは、データ節点V
から{0,1}への一変数関数である。同様に、n_funcは、{0,1}を返す任意のn変数関数であるが、第一引数以外は定数のみを入力するものとする。定数「const」は、任意の文字列または数値を表す。
図4、5は、クエリの指定箇所を説明するための図である。図4は、クエリが、
Q1=/Syain/ACT[chara/name="シグマブルー"]/cast/name
と指定された場合の指定箇所を示している。クエリ「Q1=/Syain/ACT[chara/name="シグマブルー"]/cast/name」の意味は、/Syain/ACT/cast/nameで指定される要素のうち、ACTから分岐したパスchara/nameの値が「シグマブルー」に一致するものを全て回答せよという意味である。
従って、図4に示すように、クエリ「Q1=/Syain/ACT[chara/name="シグマブルー"]/cast/name」の指定箇所は、name19となり、「<name>多湖真一郎</name>」が検索結果として出力される。なお、上記クエリの[]は制約条件を表し、例えば、ACT[chara/name="シグマブルー"]は、配下にchara/name="シグマブルー"を有するACTを表す。このように、クエリに制約条件を付与することで、XMLデータ上の検索対象をより絞り込むことが出来る。
図5は、クエリが、
Q2=/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name
と指定された場合の指定箇所を示している。クエリ「Q2=/Syain[ACT/chara/name="シグマブルー"]/cast/name」の意味は、/Syain/ACT/cast/nameで指定される要素のうち、Syainから分岐したパスACT/cast/nameの値が「シグマブルー」に一致するものを全て回答せよという意味である。
従って、図5に示すように、クエリ「Q2=/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name」の指定箇所は、name10,19,25となり、「<name>浅井達哉</name>」、「<name>多湖真一郎</name>」、「<name>永田真彦</name>」が検索結果として出力される。なお、上記クエリの[]は制約条件を表し、例えば、Syain[ACT/chara/name="シグマブルー"]は、配下にACT/chara/name="シグマブルー"を有するSyainを表す。
上述したように、クエリの条件式を指定することで、XMLデータから所望のデータを検索することが可能である。しかし、クエリの条件式を指定する場合には、木構造、出力ノード、制約条件の集合を組合せる必要があり、クエリの作成作業が大変難しい。かかる問題を解消すべく、背景技術でも述べたとおり、クエリの検索条件を自動生成する技術として、「oXygen」と呼ばれる技術が考案されている。
ここで、「oXygen」の概要について説明する。以下の説明において、「oXygen」と呼ばれる技術を単に従来技術と表記する。従来技術では、まず、XMLデータの階層構造を集約した集約構造を生成する。例えば、図2に示したXMLデータの集約構造は、図6に示すものとなる。以下の説明において、集約構造で示されたXMLデータをパストライと表記する。図6は、パストライのデータ構造の一例を示す図である。
そして、従来技術では、パストライを画面上に表示し、出力ノードをユーザに指定させる。ここで、出力ノードは、抽出すべき値(テキストノード)に接続されたノードを示す。図6において、castの配下に接続されたnameが出力ノードとしてユーザに指定された場合には、根ノードのSyainから、指定されたnameに至るまでの各ノードを順にクエリの条件式として追加することで、クエリ
Q=/Syain/ACT/cast/name
を作成する。
しかし、従来技術では、制約条件を一つも持たないような、一番単純なタイプのクエリしか作成することができなかった。すなわち、従来技術では、図4および図5で説明したような制約条件を含むクエリQ1、Q2を作成することができない。
なお、仮に図6に示したパストライを用いて出力ノードと制約ノード(制約条件に含まれるノードうち最下層のノード)をユーザに指定させ、制約条件を有するクエリを作成することも考えられる。しかし、従来技術では、パストライ上で出力ノードと制約ノードを指定すると、指定された条件から複数のクエリが生成され、いずれのクエリが適切なクエリであるかを判定することが出来ない。
図7は、従来技術の問題点を説明するための図である。図7に示す例では、出力ノードとして、castの配下に接続されたnameを指定し、制約ノードとして、charaの配下に接続されたnameが指定した場合を示している。図7に示すように、出力ノードと制約ノードが指定された場合には、複数のクエリが考えられ、具体的には
Q3=/Syain/ACT[chara/name="シグマブルー"]/cast/name
Q4=/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name
がクエリの候補となる。
しかし、クエリQ3、Q4とも、根ノードから出力ノードへのパスは、/Syain/ACT/cast/nameであり、根ノードから制約ノードへのパスは、/Syain/ACT/chara/nameとなる。従って、図7に示したパストライ上で各クエリを差別化できず、どちらのクエリが適切なクエリなのかを判定できない。
図7で説明したように、パストライ上では、クエリQ3、Q4とも同一のノードを示している。しかし、パストライはあくまで便宜的にXMLデータを集約したデータに過ぎないので、実際のXMLデータ上でクエリQ3、Q4を指定すると、クエリQ3、Q4では、異なった検索結果がそれぞれ出力されてしまう。
具体的に、クエリ「Q3=/Syain/ACT[chara/name="シグマブルー"]/cast/name」を指定して、図2に示したXMLデータからデータ検索を行うと、name19がヒットし、「<name>多湖真一郎</name>」が回答される。一方、クエリ「Q4=/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name」を指定して、図2に示したXMLデータからデータ検索を行うと、name10、19、25にヒットし、「<name>浅井達哉</name>」、「<name>多湖真一郎</name>」、「<name>永田真彦</name>」が回答される。
このように、図7に示したパストライ上では各クエリが同一のノードを示す場合であっても、実際のXMLデータ上では異なるノードを示すクエリとなっている。従って、パストライ上で複数のクエリが成り立つ場合には、どのクエリが適切なクエリであるかを判断することが重要なポイントとなる。
かかる問題点を解消するためには、パストライを生成することなく、図2に示すようなXMLデータをそのまま表示して、ユーザに出力ノードと制約ノードを指定させればクエリは一通りしか作成されず、上述した問題を解消することが可能ではある。しかし、実際のXMLデータは複雑な構造をしているため、XMLデータをそのまま表示して、出力ノードと制約ノードを指定する方法ではユーザに負担が増加してしまう。
そこで、パストライ上で複数のクエリが生成される場合には、XMLデータをそのまま表示するのでは無く、各クエリを区別できる最小限の集約構造をパストライとして表示できれば、ユーザにかかる負担を軽減させつつ、適切なクエリを生成することが可能となる。
ここで、クエリQ3とクエリQ4とを比較すると、各クエリは枝分かれ構造における「分岐点」が異なる。具体的に、クエリQ3は、ACTの直後に制約条件が付加されているので、ACTの位置が分岐点となっており、クエリQ4は、Syainの直後に制約条件が付加されているので、Syainの位置が分岐点となっている。従って、かかる分岐点を利用してパストライ上で各クエリを差別化できれば、パストライ上で、最適なクエリを生成することが出来る。
また、パストライ上に分岐点がn(nは自然数)個ある場合には、実際のXML上に該当する分岐点が存在するかを判定することが重要となる。パストライ上の分岐点(分岐点候補)は、根ノードから出力ノードに至るパスと、根ノードから制約ノードに至るパスに共通するノード(共通接頭辞)となる。図8は、分岐点判別を説明するための図である。図8の左側には、XMLデータの木構造を示し、図8の右側には、左側のXMLデータに対応するパストライを示している。
図8のパストライにおいて、出力ノードをF、制約ノードをEとすると、共通接頭辞は、ノードA,B,C,Dとなるので、分岐点候補はノードA、B、C、Dとなる。しかし、XMLデータとパストライを比較すると、分岐点は実際にノードA,Bしか存在しないことがわかる。従って、パストライ上に存在する各分岐点候補の内、実際の分岐点を判定し、判定した分岐点に基づいて、クエリを差別化すればよい。
次に、本実施例にかかる検索装置の概要について説明する。本実施例にかかる検索装置は、パストライ構築時に、各ノードの兄弟の最大出現数を登録しておく。図9は、兄弟数出現つきのパストライを示す図である。図9に示すパストライは、図2に示したXMLデータのパストライである。
図9に示すように、本実施例にかかるパストライは、各ノードに兄弟の最大出現数が関連づけられている。図2を参照すると、ACTは、Syainの子供ノードとして、兄弟中で3回繰り返し出現しているので、最大出現数が「3」となっている。その他のノードは、それぞれの兄弟において最大1回しか出現しないので、最大出現数が「1」となっている。
続いて、検索装置は、パストライ上で、出力ノードと制約ノードが指定された場合に、指定された条件を満たすクエリを作成する。そして、検索装置は、出力パスと制約パスの共通接頭辞に含まれるノードを分岐点候補として判定する。なお、出力パスは、根ノードから出力ノードまでのパスであり、制約パスは、根ノードから制約ノードまでのパスである。
具体的に、図9において、出力ノードをcastの配下に接続されたnameとすると、出力パスは、/Syain/ACT/cast/nameとなる。また、制約ノードをcharaの配下に接続されたnameとすると、制約パスは、/Syain/ACT/chara/nameとなる。そして、指定された条件を満たすクエリは、
Q3=/Syain/ACT[chara/name="シグマブルー"]/cast/name
Q4=/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name
となる。また、出力ノードと制約ノードを比較すると、分岐点候補となるノードは、Syain、ACTとなる。
続いて、検索装置は、分岐点判別ルールを適用して、分岐点を判定する。分岐点判別ルールは、2つ存在する。第1のルールは、各分岐点候補のうち、最下の分岐点候補を分岐点として判定する。第2のルールは、分岐点候補のうち、子供ノードの兄弟の最大出現数が2以上の分岐点候補を分岐点と判定する。上記のように、分岐点候補がSyain、ACTとなる場合には、ACTが第1のルールに該当するので、ACTが分岐点となる。また、Syainは、第2のルールに該当するので分岐点なる。
そして、検索装置は、クエリの分岐点に基づいて、パストライを拡張する。例えば、Syainで分岐するクエリQ4の指定位置をパストライ上に表示する場合には、Syainの配下に接続された部分木を図10に示すように拡張する。図10は、拡張したパストライの一例を示す図である。図10に示すように、パストライを拡張した後に、検索装置は、クエリQ4の指定位置をパストライ上に表示する。図11は、クエリQ4の指定位置を示すパストライを示す図である。
また、ACTで分岐するクエリQ4の指定位置をパストライ上に表示する場合には、ACTの配下に接続された部分木を拡張する。しかし、パストライ上ではACTを起点として出力ノードへのパスと制約ノードへのパスが既にcharaとcastに分岐している。このような場合には、検索装置は、パストライを拡張することなく、クエリの指定箇所を表示する。図12は、クエリQ3の指定位置を表すパストライを示す図である。
図11と図12に示したパストライとクエリを表示させれば、ユーザは、各クエリの違いを容易に判断することができる。すなわち、ユーザは、出力ノードと制約ノードを指定した後に、検索装置から表示される各クエリの候補を選択するだけで、所望するクエリを利用することができる。検索装置は、ユーザによって何れかのクエリが選択された場合には、選択されたクエリに対応するデータをXMLデータから検索し、検索結果を出力する。
このように、本実施例にかかる検索装置は、ユーザに指定される出力ノードと制約ノードに基づいて、該当するクエリが複数存在する場合には、必要最低限、パストライを拡張し、各クエリの差別化を図り、ユーザに最適なクエリを選択させるので、周知技術の直感的な手法を踏襲しつつ、制約条件を含んだ複雑なクエリの作成を支援することが出来る。
次に、本実施例にかかる検索装置の構成について説明する。図13は、本実施例にかかる検索装置の構成を示す図である。図13に示すように、この検索装置100は、入力部110と、出力部120と、入出力制御部130と、記憶部140と、制御部150を有する。
このうち、入力部110は、出力ノード、制御ノード等の各種の情報を入力する入力部であり、キーボードやマウス、マイク等に該当する。出力部120は、クエリ、XMLデータ、パストライ、検索結果等の各種の情報を出力する出力部であり、モニタ(若しくはディスプレイ、タッチパネル)に該当する。入出力制御部130は、入力部110、出力部120、記憶部140、制御部150によるデータの入出力を制御する処理部である。
記憶部140は、制御部150による各種処理に必要なデータおよびプログラムを記憶する記憶部である。この記憶部140は、XMLデータ140aと、パストライ140bと、クエリ作成テーブル140cと、クエリ木140dを有する。
このうち、XMLデータ140aは、上述したように要素識別子「<」、「</」等により要素が区切られた階層構造を有する文書データである(図1参照)。また、XMLデータ140aのデータ構造は、図1に示したものに限らず、図2で説明したような木構造で表すことも出来る。パストライ140bは、上述したようにXMLデータを集約したデータである(図6参照)。
なお、パストライ140bは、複数のパストライノード構造体を相互に接続している。図14は、パストライノード構造体のデータ構造の一例を示す図である。図14に示すように、このパストライノード構造体は、タグ名、絶対パス名、絶対パスを識別する絶対パスID、最大兄弟数、兄弟数カウンタ、親ノードへのポインタ、子供ノードへのポインタリストを有する。
例えば、図6に示したパストライのACTに該当するパストライノード構造体の場合には、タグ名「ACT」、絶対パス名「/Syain/ACT」、絶対パスID「2」となる。また、親ノードへのポインタは、タグ名「Syain」のパストライノード構造体に接続されている。また、子供ノードへのポインタはそれぞれ、タグ名「id」、「chara」、「cast」のパストライノード構造体に接続されている。
ここで、図6に示したパストライを複数のパストライノード構造体で示すと、図15に示す構造となる。図15は、パストライを各パストライノード構造体で示した図である。なお、図15に示す各パストライノード構造体では、便宜上、最大兄弟数、兄弟数カウンタを省略している。
クエリ生成テーブルは、上述した出力ノード、制約ノード、分岐点に対応する絶対パス等を管理するテーブルである。図16は、クエリ生成テーブル140cのデータ構造の一例を示す図である。図16に示すように、このクエリ生成テーブル140cは、出力ノード、制約ノード、分岐点のノードを識別する種別と、絶対パスと、演算子と、値をそれぞれ対応付けて記憶している。
クエリ木140dは、出力ノードおよび制約ノードが指定されることで、制御部150により生成されるクエリの木構造データである。複数のクエリが生成された場合には、かかるクエリ木140dは、複数のクエリに対応するクエリ木をそれぞれ有しているものとする。クエリ木は、複数のクエリ木構造体を相互に接続している。図17は、クエリ木構造体のデータ構造の一例を示す図である。図17に示すように、このクエリ木構造体は、タグ名と、分岐用ポインタと、子供用ポインタとを有する。
具体的に、クエリ「/Syain/ACT[chara/name="シグマブルー"]/cast/name」を、クエリ木構造体を用いて表すと、図18に示す木構造となる。図18は、クエリを各クエリ木構造体で示した図(1)である。クエリ「/Syain/ACT[chara/name="シグマブルー"]/cast/name」は、ACTの直後に制約条件が付与されているので、ACTが分岐点となっている。従って、図18に示すように、ACTの分岐用ポインタに、charaのクエリ木構造体が接続されている。
一方、クエリ「/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name」を、クエリ木構造体を用いて表すと、図19に示す木構造となる。図19は、クエリを各クエリ構造体で示した図(2)である。クエリ「/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name」は、Syainの直後に制約条件が付与されているので、Syainが分岐点となっている。従って、図19に示すように、Syainの分岐用ポインタにACTのクエリ木構造体が接続されている。
制御部150は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する制御部である。図13に示すように、この制御部150は、パストライ生成部150a、兄弟出現数計数部150b、データ構造表示部150c、クエリ指定受付部150d、分岐点判定処理部150e、クエリ生成処理部150f、クエリ表示処理部150g、検索処理部150hを有する。
このうち、パストライ生成部150aは、XMLデータ140a(図1、図2参照)を集約して、パストライ(例えば、図6、14、15参照)を作成する処理部である。具体的に、パストライ生成部150aの処理を説明する。まず、パストライ生成部150aは、XMLデータ140aの木構造データに存在する要素ノードについて、同一タグ名の親ノードに直接関連づけられた同一タグ名の子供ノードが複数存在するか否かを判定する。
そして、パストライ生成部150aは、同一タグ名の親ノードに直接関連づけられた同一タグ名の子供ノードが複数存在する場合には、重複する同一タグ名の親ノードおよび子供ノードを一つの親ノードおよび子供ノードに集約することで、パストライ140bを生成する。
例えば、図2に示すXMLデータにおいて、同一タグ名の親ノードACTに直接関連づけられた同一タグ名の子供ノードid、chara、castが複数存在している。また、同一のタグ名の親ノードcharaに直接関連づけられた子供ノードnameが複数存在している。また、また、同一のタグ名の親ノードcastに直接関連づけられた子供ノードnameが複数存在している。
従って、パストライ生成部150aは、ACT3、12、21を一つのACTに集約し、id4、13、22を一つのidに集約し、chara6、15を一つのcharaに集約し、cast9、18、24を一つのcastに集約する。また、パストライ生成部150aは、name7、16、25を一つのnameに集約し、name10、19を一つのnameに集約する。その結果、図2に示すXMLデータ140aは、図6等に示すパストライ140bに集約される。なお、この時点において、パストライ140bのパストライノード構造体に含まれる最大兄弟数および兄弟数カウンタは、Nullとなっている。
兄弟出現数計数部150bは、パストライ140bに含まれる要素ノードと、XMLデータ140aを基にして、パストライ140bの要素ノードに該当するXMLデータの要素ノードの兄弟数を判定する処理部である。
具体的に、図2を用いて説明する。XMLデータ140aの要素ノードSyainは、根ノードであるため、兄弟は存在しない。従って、兄弟出現数計数部150bは、パストライ140bにおいて、パストライノード構造体のタグ名Syainに該当する最大兄弟数を1に設定する。
兄弟出現数計数部150bは、要素ノードACTの兄弟数を判定する。図2を参照すると、同一親ノードに直接対応付けられた要素ノードACTが3つ存在するので、兄弟出現数計数部150bは、パストライ140bにおいて、パストライノード構造体のタグ名ACTに該当する最大兄弟数を3に設定する。
兄弟出現数計数部150bは、その他の要素ノードiid、chara、cast、nameの兄弟数も判定する。いずれの要素ノードも兄弟は存在しないので、兄弟出現数計数部150bは、パストライ140bにおいて、パストライノード構造体のタグ名id、chara、cast、nameに該当する最大兄弟数を1に設定する。
データ構造表示部150cは、パストライ140bを出力部120に出力し、パストライ140bをモニタに出力させる処理部である。ユーザは、入力部110を操作して、モニタに表示されたパストライ140bを参照し、出力ノードおよび制約ノードを指定する。
クエリ指定受付部150dは、ユーザによって出力ノードおよび制約ノードを指定された場合に、クエリ生成テーブル140cに各種の情報を登録する処理部である。また、クエリ指定受付部150dは、演算子指定窓および値指定窓を出力部120に出力させる。ここで、演算子指定窓は、ユーザが「=」や、部分一致などの演算子を入力する入力窓であり、値は、各種のテキスト(例えば、シグマブルー)を入力する入力窓である。
以下において、クエリ指定受付部150dの処理を具体的に説明する。図20、21は、クエリ指定受付部150dの処理を説明するための図である。なお、図20、21において、castに直接関連づけられたnameを出力ノードとして指定され、charaに直接関連づけられたnameを制約ノードとして指定される場合について説明するがこれに限定されるものではない。
図20の上段に示すように、ユーザがcastに直接関連づけられたnameを出力ノードとして指定した場合には、クエリ指定受付部150dは、根ノードSyainから出力ノードnameに至るまでのタグ名を順に並べることで、絶対パス/Syain/ACT/cast/nameを生成する。ユーザに指定されたノードは出力ノードであるため、クエリ指定受付部150dは、種別「出力」と、絶対パス「/Syain/ACT/cast/name」を対応付けてクエリ生成テーブル140cに登録する。
図20の下段に示すように、ユーザがcharaに直接関連づけられたnameを制約ノードとして指定した場合には、クエリ指定受付部150dは、根ノードSyainから制約ノードに至るまでのタグ名を順に並べることで、絶対パス/Syain/ACT/chara/nameを生成する。ユーザに指定されたノードは制約ノードであるため、クエリ指定受付部150dは、種別「制約」と、絶対パス「/Syain/ACT/chara/name」を対応付けてクエリ生成テーブル140cに登録する。
クエリ指定受付部150dは、出力ノードと制約ノードを受け付けた後に、演算子指定窓と値指定窓をモニタに表示する(図21の上段参照)。ユーザは入力部110を操作して、演算子指定窓に演算子を入力し、値指定窓に値を入力する。
図21の下段に示すように、ユーザが演算子指定窓に「=」を入力し、値指定窓に「シグマブルー」を入力した場合には、クエリ指定受付部150dは、種別「制約」に対応して、演算子「=」、値「シグマブルー」をクエリ生成テーブル140cに登録する。
図13の説明に戻ると、分岐点判定処理部150eは、出力ノードと制約ノードが指定された場合に、指定された各ノードから分岐点を判定する処理部である。以下において、分岐点判定処理部150eの処理を具体的に説明する。図22は、分岐点判定処理部150eの処理を説明するための図である。図22のパストライを構成する各ノードの横に示す()内の数字は、各ノードの最大兄弟数を示す。すなわち、ACTの最大兄弟数は3、Syain、id、chara、cast、各nameの最大数は1となる。
まず、分岐点判定処理部150eは、出力ノードの絶対パスと制約ノードの絶対パスとを比較して、共通接頭辞を判定し、判定結果をクエリ生成テーブル140cに登録する。例えば、図22の上段に示すように、出力ノードの絶対パス(出力パス)が、「Syain/ACT/cast/name」、制約ノードの絶対パス(制約パス)が「/Syain/ACT/chara/name」の場合には、共通接頭辞に該当するノードは、双方に共通するSyainとACTになる。
続いて、分岐点判定処理部150eは、分岐点判別ルール(第1、2のルール)に基づいて、共通接頭辞から分岐点となるノードを判定する。ここでは一例として、共通接頭辞として、SyainとACTが判定された場合について説明する。
第1のルールは、共通接頭辞(分岐点候補)のうち、最下の分岐点候補を分岐点候補として判定するものである。ノードSyain、ACTでは、ACTが最下の分岐点候補であるため、分岐点判定処理部150eは、ACTを分岐点として判定する。
第2のルールは、共通接頭辞のうち、子供ノードの兄弟の最大出現数が2以上の分岐点候補を分岐点と判定する。Syainの子供ノードACTの最大兄弟数は「3」であるため、分岐点判定処理部150eは、Syainを分岐点として判定する。
分岐点判定処理部150eは、分岐点として判定したノードの情報をクエリ生成テーブル140cに登録する。Syainの絶対パスは、「/Syain」となり、ACTの絶対パスは、「/ACT」となる。従って、分岐点判定処理部150eは、種別「分岐」と、絶対パス「/Syain/ACT」を対応付けて、クエリ生成テーブル140cに登録する。また、分岐点判定処理部150eは、種別「分岐」と、絶対パス「/Syain」を対応付けて、クエリ生成テーブル140cに登録する(図22の下段参照)。
クエリ生成処理部150fは、クエリ生成テーブル140cに基づいて、クエリを生成する処理部である。以下において、クエリ生成処理部150fの処理を具体的に説明する。クエリ生成処理部150fは、クエリ生成テーブル140cを参照し、種別が出力となる絶対パスを抽出する。現在のクエリ生成テーブル140cの状態を図16とすると、抽出する絶対パスは、「/Syain/ACT/cast/name」となる。
続いて、クエリ生成処理部150fは、抽出した絶対パスの各要素に該当するクエリ木構造体(図17)を生成し、絶対パスにしたがって各クエリ木構造体を接続する。図23は、絶対パスから生成されるクエリ木の一例を示す図である。図23に示すように、Syain、ACT、cast、nameに対応するクエリ木構造体がそれぞれ絶対パスの順に接続されている。
また、クエリ生成処理部150fは、クエリ生成テーブル140cから、種別が制約となる絶対パスと、種別が分岐となる絶対パスを抽出する。そして、クエリ生成処理部150fは、図23に示したクエリ木と、制約、分岐の絶対パスに基づいて、クエリ木にクエリ木構造体を追加する。
例えば、制約の絶対パスが「/Syain/ACT/chara/name」となり、分岐の絶対パスが「/Syain/ACT」の場合には、図18に示すクエリ木が生成される。すなわち、クエリ生成処理部150fは、制約の絶対パスから分岐の絶対パスを取り除いた残りのパスに該当するクエリ木構造体を生成する。そして、分岐点のクエリ木構造体ACTを起点として、生成したクエリ木構造体chara、nameを順に接続する。
また、制約の絶対パスが「/Syain/ACT/chara/name」となり、分岐の絶対パスが「/Syain」の場合には、図19に示すクエリ木が生成される。すなわち、クエリ生成処理部150fは、制約の絶対パスから分岐の絶対パスを取り除いた残りのパスに該当するクエリ木構造体を生成する。分岐点のクエリ木構造体Syainを起点として、生成したクエリ木構造体ACT、chara、nameを順に接続する。
クエリ生成処理部150fは、生成したクエリ木を、記憶部140に登録する。クエリ生成テーブル140cに登録されたデータが、図16に示したものであれば、クエリ生成処理部150fは、図18に示したクエリ木と、図19に示したクエリ木をクエリ木140dとして登録する。
クエリ表示処理部150gは、クエリ木140d、クエリ生成テーブル140cに基づいて、パストライ140bを拡張した後に、パストライを表示させつつクエリの指定箇所を表示して、最適なクエリの選択を受け付ける処理部である。図24は、クエリ表示処理部150gの処理を説明するための図である。
具体的に、クエリ表示処理部150gは、クエリ生成テーブル140cの分岐(分岐点のノード)に基づいて、パストライ140bを拡張する。まず、分岐「/Syain」に基づいて、パストライ140bを拡張する場合について説明する。クエリ表示処理部150gは、分岐パスの最下に示すノードを判定し、判定したノードの子供ノードを最上とする部分木を複製し、複製した部分木をSyainに接続することで、新たなパストライを生成する。この場合、クエリ表示処理部150gは、ACTを最上とする部分木を複製する。
そして、クエリ表示処理部150gは、拡張したパストライの一方の部分木を用いて制約ノードを表示し、もう一方の部分木を用いて出力ノードを表示する。また、クエリ表示処理部150gは、クエリ生成テーブル140cの種別「制約」の行に格納された演算子「=」、「シグマブルー」を制御ノードと関連づけて表示する。また、クエリ表示処理部150gは、該当するクエリ「/Syain/ACT[chara/name="シグマブルー"]/cast/name」を表示する(図24の上段参照)。
続いて、分岐「/Syain/ACT」に基づいて、パストライ140bを拡張する場合について説明する。クエリ表示処理部140gは、分岐パスの最下に示すノードを判定し、判定したノードの子供ノードを最上とする部分木の複製を試みる。
しかし、パストライ上ではACTから出力ノードへのパスと制約ノードへのパスが既にcharaとcastに分岐している。このような場合には、クエリ表示処理部150gは、パストライをそのまま表示し、あわせて、制約ノードと出力ノードを表示する。また、クエリ表示処理部150gは、クエリ生成テーブル140cの種別「制約」の行に格納された演算子「=」、「シグマブルー」を制御ノードと関連づけて表示する。また、クエリ表示処理部150gは、該当するクエリ「/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name」を表示する(図24の下段参照)。
クエリ表示処理部150gは、図24に示したパストライ、クエリをモニタに表示し、ユーザにいずれかのクエリを選択させる。クエリ木表示処理部150gは、クエリの選択を受け付けた場合には、選択されたクエリを検索処理部150hに出力する。
検索処理部150hは、クエリ表示処理部150gからクエリを取得した場合に、クエリに該当するデータをXMLデータから検索し、検索結果を出力部120に出力する処理部である。なお、クエリを用いたデータ検索は、どの様な方法を用いて構わない。
例えば、検索処理部150hは、クエリ「/Syain[ACT/chara/name="シグマブルー"]/ACT/cast/name」を取得した場合には、検索結果として、「<name>多湖真一郎</name>」を出力する(図4参照)。
次に、本実施例にかかる検索装置100の処理手順について説明する。図25は、本実施例にかかる検索装置100の処理手順を示すフローチャートである。図25に示すように、検索装置100は、XMLデータを取得し(ステップS101)、パストライ生成部150aが、パストライ生成処理を実行する(ステップS102)。
そして、兄弟出現数計数部150bが、兄弟出現数計数処理を実行し(ステップS103)、データ構造表示部150cが拡張前のパストライを表示し(ステップS104)、クエリ指定受付部150dが、出力ノードを受けつけ(ステップS105)、制約ノードを受け付ける(ステップS106)。
続いて、分岐点判定処理部150eが、分岐点判定処理を実行し(ステップS107)、クエリ生成処理部150fが、クエリ生成処理を実行し(ステップS108)、クエリ表示処理部150fが、クエリ表示処理を実行する(ステップS109)。
クエリ表示処理部150fは、クエリの選択を受け付け(ステップS110)、検索処理部150hは、選択されたクエリに基づいて検索処理を実行し(ステップS111)、検索結果を出力する(ステップS112)。
次に、図25のステップS102に示したパストライ生成処理について説明する。図26は、パストライ生成処理の処理手順を示すフローチャートである。図26に示すように、パストライ生成部150aは、パストライTを空の木として初期化し(ステップS201)、XMLデータDに次のタグ「<」または「</」が存在するか否かを判定する(ステップS202)。
次のタグが存在しない場合には(ステップS203,No)、パストライ生成部150aは、パストライTを出力する(ステップS204)。一方、次のタグが存在する場合には(ステップS203,Yes)、タグの種類は開始タグであるか否かを判定する(ステップS205)。ここで、タグ「<」は、開始タグを示し、「</」は、終了タグを示す。
タグの種類が終了タグの場合には(ステップS206,No)、パストライ生成部150aは、パスPの末端タグをPから除去し(ステップS207)、ステップS202に移行する。一方、タグの種類が開始タグの場合には(ステップS206,Yes)、パストライ生成部150aは、パスPの末端にタグを追記する(ステップS208)。
そして、パストライ生成部150aは、パスPがパストライTに登録済みか否かを判定し(ステップS209)、登録済みの場合には(ステップS210,Yes)、ステップS202に移行する。一方、登録済みではない場合には(ステップS210,No)、パス登録処理を実行する(ステップS211)。
ここで、図26のステップS211に示したパス登録処理について説明する。図27は、パス登録処理の処理手順を示すフローチャートである。図27に示すように、パストライ生成部150aは、パストライTは空の木であるか否かを判定する(ステップS301)。
パストライTが空の木である場合には(ステップS302,Yes)、パストライ生成部150aは、パストライノード構造体Nを作成し(ステップS303)、パストライノード構造体Nの絶対パス名にパスPを登録し(ステップS304)、パストライノード構造体のタグ名にパスPに含まれる唯一のタグを登録する(ステップS305)。
一方、パストライTが空の木ではない場合には(ステップS302,No)、P=Q/tagとなるようなパスQと末尾タグtagを判定し(ステップS306)、パストライTの根ノードから子供ポインタを辿って、絶対パス名がQとなるノードNQを取得する(ステップS307)。
そして、パストライ生成部150aは、パストライノード構造体NPを作成し(ステップS308)、パストライノード構造体NQに子供ポインタを追加してパストライノード構造体NPを指定し、パストライノード構造体NPの親ポインタにパストライノード構造体NQを指定する(ステップS309)。また、パストライ生成部150aは、パストライノード構造体NPの絶対パス名にパスPを登録し、タグ名にtagを登録する(ステップS310)。
次に、図25のステップS103に示した兄弟出現数計数処理について説明する。図28は、兄弟出現数計数処理の処理手順を示すフローチャートである。図28に示すように、兄弟出現数計数部150bは、現在のタグCurDを、XMLデータDの最初の開始タグで初期化し(ステップS401)、現在のノードCutTを、パストライTの根ノードで初期化する(ステップS402)。
兄弟出現数計数部150bは、XMLデータDに次のタグが存在するか否かを判定し(ステップS403)、存在しない場合には(ステップS404,No)、兄弟出現数計数処理を終了する。一方、XMLデータDに次のタグが存在する場合には(ステップS404,Yes)、次のタグが開始タグであるか否かを判定する(ステップS405)。
次のタグが終了タグの場合には(ステップS406,No)、兄弟出現数計数部150bは、CurTのすべての子供ノードについて、「兄弟数カウンタ」>「最大兄弟数」の場合に、最大兄弟数の値を兄弟数カウンタの値に置き換える(ステップS407)。
兄弟出現数計数部150bは、CurDを次の終了タグに更新し(ステップS408)、CurTを、CurTの親ノードに変更し(ステップS409)、ステップS403に移行する。
ところで、ステップS406において、次のタグが開始タグの場合には(ステップS406,Yes)、兄弟出現数計数部150bは、CurDを次の開始タグに更新し(ステップS410)、CurTを、CurDに対応するCurTの子供ノードに置き換える(ステップS411)。また、兄弟出現数計数部150bは、CurTの兄弟数カウンタに1を加算し(ステップS412)、ステップS403に移行する。
次に、図25のステップS107に示した分岐点判定処理について説明する。図29は、分岐点判定処理の処理手順を示すフローチャートである。図29に示すように、分岐点判定処理部150eは、出力パスOと制約パスCの共通接頭辞に含まれるノード集合Pを判定し(ステップS501)、ノード集合Pの最下の要素vを取り出し、集合Rに要素vを追加する(ステップS502)。ステップS502において、集合R={v}とし、ノード集合P=P\{v}とする。
分岐点判定処理部150eは、ノード集合Pに要素が存在するか否かを判定し(ステップS504)、要素が存在しない場合には(ステップS504,No)、集合Rを出力し(ステップS505)、分岐点判定処理を終了する。
一方、ノード集合Pに要素が存在する場合には(ステップS504,Yes)、ノード集合Pから任意の要素wを一つ取り出し(ステップS506)、wの最大兄弟数が2以上であるか否かを判定する(ステップS507)。
wの最大兄弟数が2未満である場合には(ステップS508,No)、分岐点判定処理部150eは、ステップS503に移行する。一方、wの最大兄弟数が2以上である場合には(ステップS508,Yes)、集合Rに要素wを追加し(ステップS509)、ステップS503に移行する。
次に、図25のステップS108に示したクエリ生成処理について説明する。図30は、クエリ生成処理の処理手順を示すフローチャートである。図30に示すように、クエリ生成処理部150fは、クエリ生成テーブル140cを取得し(ステップS601)、種別「出力」の絶対パスから、クエリ木を作成する(ステップS602)。
クエリ生成処理部150fは、クエリ生成テーブル140cに種別「制約」が一つでも存在するか否かを判定し(ステップS603)、「制約」が存在しない場合には(ステップS604,No)、クエリを全て処理したか否かを判定する(ステップS605)。
クエリを全て処理していない場合には(ステップS606,No)、クエリ生成処理部150fは、次のクエリを選択し(ステップS607)、ステップS602に移行する。一方、クエリを全て処理している場合には(ステップS606,Yes)、クエリ生成処理を終了する。
ところで、ステップS604において、クエリテーブルに種別「制約」が一つでも存在する場合には(ステップS604,Yes)、未選択の分岐点を一つ選択し(ステップS608)、次の「制約」の行の絶対パスを、分岐点まで共通接頭辞が統合され、分岐点から分岐するようにクエリ木に追加する(ステップS609)。
そして、クエリ生成処理部150fは、種別「制約」を全て処理したか否かを判定し(ステップS610)、全て処理していない場合には(ステップS611,No)、ステップS609に移行する。
一方、種別「制約」を全て処理した場合には(ステップS611,Yes)、全ての分岐点を選択したか否かを判定し(ステップS612)、全ての分岐点を選択していない場合には(ステップS613,No)、ステップS608に移行する。一方、全ての分岐点を選択している場合には(ステップS613,Yes)、クエリ木を巡回し、クエリを生成し(ステップS614)、ステップS605に移行する。
次に、図25のステップS109に示したクエリ表示処理について説明する。図31は、クエリ表示処理の処理手順を示すフローチャートである。図31に示すように、クエリ表示処理部150gは、未選択の分岐点Bを選択し(ステップS701)、パストライTの根ノードから子供ポインタを辿り、分岐点Bに対応するノードNBに移行する(ステップS702)。
クエリ表示処理部150gは、出力パスOと制約パスCが、分岐点Bから分岐しているか否かを判定する(ステップS703)。分岐している場合には(ステップS704,Yes)、パストライ上に出力パスOおよび制約パスCを表示し(ステップS705)、ステップS711に移行する。
一方、出力パスOと制約パスCが、分岐点Bから分岐していない場合には(ステップS704,No)、クエリ表示処理部150gは、出力パスO、制約パスCの共通接頭辞において、ノードNBの直下にあたるノードをノードN1に設定する(ステップS706)。
続いて、クエリ表示処理部150gは、ノードN1を根ノードとする部分木を部分木Sub1とし、部分木Sub1を複製して部分木Sub2を作成し(ステップS707)、ノードNBに子供ポインタを追加し、部分木Sub2の根ノードN2を指定する(ステップS708)。
クエリ表示処理部150gは、ノードN2の親ポインタにノードNBを指定し(ステップS709)、部分木Sub2を含めてパストライTを表示し、出力パスOを表す印を部分木Sub1上に表示し、制約パスCを表す印を部分木Sub2上に表示する(ステップS710)。
そして、クエリ表示処理部150gは、全ての分岐点Bを選択したか否かを判定し(ステップS711)、未選択の分岐点Bが存在する場合には(ステップS712,No)、ステップS701に移行する。一方、全ての分岐点Bを選択した場合には(ステップS712,Yes)、クエリ表示処理を終了する。
上述してきたように、本実施例にかかる検索装置100は、パストライを表示して出力ノードと制約ノードが指定された場合に、各ノードの絶対パスから共通接頭辞を判定してクエリの分岐点を判定する。そして、検索装置100は、出力ノードと制約ノードから複数のクエリを生成可能な場合には、分岐点を基にして必要最低限に拡張したパストライを生成し、各クエリの違いがユーザにわかるように表示して、最適なクエリを選択させるので、周知技術の直感的な手法を踏襲しつつ、制約条件を含んだ複雑なクエリの作成を支援することが出来る。
なお、本実施例では、半構造体データとしてXMLデータ、クエリとしてXPath式を用いて説明した。しかし、半構造体データとクエリの種類はこれらに限定されるものではない。例えば、半構造体データは、XMLデータの他にも、RDBのテーブルやCSVデータ等が含まれ、かかるRDBのテーブルやCSVファイルに対しても本願発明を適用することが出来る。
また、本実施例にかかる検索装置100は、兄弟出現数計数部150bがパストライノード構造体に最大兄弟数を登録し、分岐点判定処理部150eがかかる最大兄弟数を参照して分岐点に該当するか否かを判定していたが、これに限定されるものではない。
例えば、兄弟出現数計数部150bは、該当ノードに2以上の兄弟が存在する場合には、パストライノード構造体に2以上の兄弟が存在する旨の識別情報のみを登録してもよい。この場合、分岐点判定処理部150eは、分岐点を判定する場合に、各分岐点候補のうち識別情報を有するノードを分岐点として判定することが出来る。
ところで、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
図32は、実施例に示した検索装置100に対応するコンピュータのハードウェア構成を示す図である。図32に示すように、このコンピュータ(検索装置)10は、入力装置11、モニタ12、RAM(Random Access Memory)13、ROM(Read Only Memory)14、ネットワークを介して他の装置とデータ通信を実行する通信制御装置15、媒体読取装置16、CPU(Central Processing Unit)17、HDD(Hard Disk Drive)18をバス19で接続している。
そして、HDD18には、上述した検索装置100の機能と同様の機能を発揮するクエリ生成表示プログラム18b、検索プログラム18cが記憶されている。CPU17が、クエリ生成表示プログラム18b、検索プログラム18cを読み出して実行することにより、クエリ生成表示プロセス17a、検索プロセス17bが起動される。
ここで、クエリ生成表示プロセス17aは、図13に示したパストライ生成部150a、兄弟出現数計数部150b、データ構造表示部150c、クエリ指定受付部150d、分岐点判定処理部150e、クエリ生成処理部150e、クエリ表示処理部150gに対応する。また、検索プロセス17bは、図13に示した検索処理部150hに対応する。
なお、HDD18は、図13で示した記憶部140に記憶されたデータに対応する各種データ18aを記憶している。CPU17は、HDD18に記憶された各種データ18aをRAM13に読み出し、各種データ13aを利用して、クエリの表示およびXMLデータの検索処理を実行する。