(57)【特許請求の範囲】
【請求項１】
計算機を用いてSPARQLクエリを最適化する方法であって、
RDFストアが保持するRDFデータにおける複数のリテラルを縮約値と呼ぶひとつの値に対応づける基準を定めた縮約基準表を入力装置から受け取るステップと、
前記縮約基準表を用いて前記RDFデータに含まれる複数のリソースをひとつの縮約値に対応づける縮約表を生成するステップと、
前記縮約基準表および前記縮約表を用いて、前記RDFデータの複数ノードをひとつのノードに集約した縮約RDFデータを生成し、前記RDFデータのノードと前記縮約RDFデータのノードの対応関係を表すトリプルを前記RDFデータに追加するステップと、
前記SPARQLクエリを入力装置から受け取り、入力された前記SPARQLクエリ内のリテラルを前記縮約基準表を用いて対応する縮約値に置換した縮約クエリを生成するステップと、
前記縮約クエリを用いて前記縮約RDFデータを検索して、前記SPARQLクエリ内の各変数の持つ縮約値を記録した変数束縛表を生成するステップと、
生成した前記変数束縛表を用いて、前記SPARQLクエリに、前記各変数の持つ前記縮約値を指定した変数範囲制限節を追加した展開クエリを生成するステップと、
生成した前記展開クエリを用いて前記RDFデータを検索して、検索結果を求めるステップと、
を有することを特徴とするSPARQLクエリ最適化方法。
【請求項２】
計算機で読み取り可能な記憶媒体であって、請求項１に記載の方法を実行するためのプログラムを格納したことを特徴とする記憶媒体。
【請求項３】
計算機システムにおいて、
RDFストアが保持するRDFデータにおける複数のリテラルを縮約値と呼ぶひとつの値に対応づける基準を定めた縮約基準表を受け取る入力装置と、
前記縮約基準表を用いて前記RDFデータに含まれる複数のリソースをひとつの縮約値に対応づける縮約表を生成する手段と、
前記縮約基準表および前記縮約表を用いて、前記RDFデータの複数ノードをひとつのノードに集約した縮約RDFデータを生成し、前記RDFデータのノードと縮約RDFデータのノードの対応関係を表すトリプルを前記RDFデータに追加する手段と、
SPARQLクエリを前記入力装置から受け取り、入力された前記SPARQLクエリ内のリテラルを前記縮約基準表を用いて対応する縮約値に置換した縮約クエリを生成する手段と、
前記縮約クエリを用いて前記縮約RDFデータを検索して、前記SPARQLクエリ内の各変数の持つ縮約値を記録した変数束縛表を生成する手段と、
生成した前記変数束縛表を用いて、前記クエリに、前記各変数の持つ前記縮約値を指定した変数範囲制限節を追加した展開クエリを生成する手段と、
生成した前記展開クエリを用いて前記RDFデータを検索して、検索結果を求める手段と、
を有することを特徴とする計算機システム。
【請求項４】
計算機を用いてSPARQLクエリを最適化する方法であって、
RDFストアが保持するRDFデータにおける複数のリテラルを縮約値と呼ぶひとつの値に対応づける基準を定めた縮約基準表を用いて、前記RDFデータを縮約した前記縮約RDFデータを生成すると共に、前記RDFデータと前記縮約RDFデータとの対応関係を示す縮約表を生成し、
前記縮約表と前記縮約基準表を用いて前記SPARQLクエリから生成した縮約クエリを用いて、前記縮約RDFデータを検索し、
前記検索の結果得られる変数束縛表を用いて前記SPARQLクエリを変換した展開クエリを用いて前記RDFデータを検索する、
ことを特徴とするSPARQLクエリ最適化方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はRDFストアにおけるSPARQLクエリ処理に関する。
【背景技術】
【０００２】
近年、画像・音声・文書等、多種多様なデータを種類横断的に検索したり、分析したりするための統一データ形式として、RDF（Resource Description Framework）とよばれる形式がW3C（World Wide Web Consortium）で標準化され、その利用が広まりつつある。RDFではトリプルと呼ばれる値の３つ組の集合によってすべてのデータを表現する。３つ組の値は順に主語、述語、目的語とよばれる。主語および述語の値はリソースと呼ばれるインターネット上で一意な識別子である。目的語の値はリソースもしくはリテラルとよばれる文字列や数値、日付などの具体的な値である。リソースおよびリテラルはノードと総称される。リソースは実体であり、リテラルは属性である。例えば、グラフでは、ノードがリソースであり、そのノードに関する情報がリテラルである。【０００３】
図２にRDFデータの例を示す。この例は３人の社員の名前、年齢、性別情報を表している。１行が１つのトリプル（レコード）に対応しており、http://ではじまる文字列はリソース、それ以外はリテラルである。たとえば、図２1の最初のトリプルにおいて、http://hitachi/ldap/1およびhttp://nameはリソース、Michael Adamsはリテラルである。このトリプルは、http://hitachi/ldap/1で識別される社員の名前がMichael Adamsであることを表している。【０００４】
RDFデータを格納するデータベースシステムはRDFストアと呼ばれる。標準的なRDFストアは、SPARQLとよばれる問い合わせ言語を用いてデータの検索を行う機能を有している。SPARQLは関係データベースシステムにおけるSQLに相当する問い合わせ言語である。利用者は、求めるデータの条件をSPARQLクエリとして記述し、RDFストアに入力することで、データを取得することができる。【０００５】
以下はSPARQLクエリの例である。
select ?n ?a where { 
?x <http://name> ?n. ?x <http://age> ?a. filter (?a > 30). 
}
このクエリは、年齢が30歳以上の従業員の名前と年齢を取得するものである。なお、クエリ内では、リソースは<と>で囲い、リテラルは"で囲って記述する。また、?ではじまる文字列（ここでは?n、?xおよび?a）は変数を表す。クエリ内の?x <http://name> ?n. および?x <http://age> ?a.はトリプルパターンと呼ばれる条件節で、変数を適当な値に置き換えることで一致するトリプルを指定する。filter (?a > 30). はフィルタパターンと呼ばれる条件節で、変数の値が満たすべき制約を表す。【０００６】
クエリを実行すると、where以降に指定されたすべての条件を満たす変数の値が検索され、selectの後ろに並ぶ各変数（上記の例ではｎ及びａ）の値が結果として返される。なお、クエリの結果である変数とその値の対応を変数束縛という。条件を満たす変数の値が複数存在する場合は、結果は変数束縛の集合となる。【０００７】
たとえば、図２のRDFデータに対して上のクエリを実行した結果は、?n = "John Smith", ?a = "32"および?n = "Anne Brice", ?a = "45"であり、これら変数と値の対応が変数束縛である。SPARQLクエリの実行方法については非特許文献１の12節に記載されている．
幅広くデータ分析を行うために、RDFストアに格納されるデータ量は年々大規模化している。一般にクエリの実行効率（検索効率）は、対象データ量が増えるにつれて低下する。特に高度なデータ分析を行うためのクエリは条件指定が複雑になるため、実行時間が長くなる傾向にある。そのため、SPARQLクエリを最適化し、実行効率を向上させる方法が求められている。【０００８】
SPARQLクエリを最適化する方法として、特許文献1が存在する。特許文献1で示されている方法は、SPARQLクエリを解析し、検索範囲を限定することでクエリの実行効率を向上させるというものである。この方法では、あらかじめRDFデータをデータの値に基づいていくつかのパーティションに分割しておき、クエリがRDFストアに入力されると、そのクエリを解析し、関連するパーティションに限定してクエリを実行する。一般にクエリの実行は、対象となる検索範囲が小さいほど効率が良くなるため、対象パーティション数を絞り込むことで効率を向上させることができる。【０００９】
クエリに関連するパーティションの選択は、クエリ内に含まれる定数値の集合Cにもとづいて行う。各パーティションPiに含まれる定数の集合Ciをあらかじめ計算しておき、それとCを比較することで、クエリ実行に無関係なパーティションを除外することができる。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】米国特許第7987179号
【非特許文献】
【００１１】
【非特許文献１】http://www.w3.org/TR/rdf-sparql-query/
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、上記文献1の方法は、検索範囲の限定を、クエリに含まれている定数のみにもとづいて行うため、そのクエリの検索範囲とRDFデータのパーティション分割とが適合するとは限らないので、その限定効果が十分ではない。特に、以下のような、変数に対する制約条件によって欲しいデータを指定するクエリに対して、検索範囲を限定することができない。
select ?l1 where {
?s1 degree ?d1. ?s1 label ?l1.
filter regex(?l1, "breast.*cancer").
?s2 degree ?d2. ?s2 label ?l2.
filter (?d1 < ?d2).
}
これは症例データベースから、乳がんより重度な症例を探すクエリである。このクエリでは、filter (?d1 < ?d2)という制約条件を満たす症例を探すために、すべての症例の重症度（degreeの値）を比較する必要があり、検索の対象範囲が広くなると急速に検索の効率が悪くなる。文献1の方法を用いることで、検索範囲をdegreeおよびlabelを含むものに限定することができる。しかしながら、これらは大半の症例データに含まれているため、検索範囲はほとんど狭まらない。【００１３】
このようなクエリは、データ分析を行う上では頻繁に用いられるものであり、大規模データに対しても効率的に実行できる方法が求められている。【００１４】
本発明の目的は、このような変数間の制約条件によって求めるデータを指定するデータ分析系のSPARQLクエリに対し、検索範囲を限定し、大規模データ上で効率的に実行する方法を提供することである。
【課題を解決するための手段】
【００１５】
本発明では、以下に示す手順で、あらかじめ元のRDFデータ数を小さくした縮約RDFデータを生成しておき、それを用いて元のクエリを最適化した、即ち、検索範囲を限定する条件節を追加したクエリを生成し、実行することで、クエリの実行効率を向上させる。【００１６】
最初に、RDFストアが保持するRDFデータにおける属性が類似している複数のリテラルを縮約値と呼ぶひとつの値に対応づける基準を定めた縮約基準表を入力装置から受け取る。【００１７】
縮約基準表とは、基準述語、縮約値、縮約範囲の3項目からなる表である。縮約基準表の例を図９Ｂに示す。基準述語にはリソースの名前、縮約値にはリソースに対応付ける任意の値（文字列）、縮約範囲には縮約値に対応付けられる変数Xに関する条件式が書かれている。各行は、基準述語を述語位置に持つトリプルにおいて目的語位置に存在するリテラルLが、縮約範囲に書かれた条件を満たす場合に、Lをその行に書かれた縮約値に対応づけることを意味している。リテラルが条件を満たすかどうかは、Xをそのリテラルで置き換えた式が真になるかどうかで判断される。【００１８】
そして、プロセッサが縮約基準表を用いて、RDFデータに含まれる複数のリソースをひとつの縮約値に対応づける縮約表を生成する。次に、縮約基準表および縮約表を用いて、RDFデータの複数ノードをひとつのノードに集約した縮約RDFデータを生成する。また、RDFデータのノードと縮約RDFノードの対応関係を表す少なくとも１つのトリプルをRDFデータに追加する。（図１０Ａのリソースと縮約値との間を”abs”で繋いだトリプルをRDFデータに追加する。）
このように生成した縮約RDFデータは、RDFデータにおけるノード間のつながりを維持している。すなわち、RDFデータにトリプル(n1（主語）,n2（述語）,n3（目的語）)が含まれており、複数のRDFデータに対するn1,n2,n3の縮約値がそれぞれa1,a2,a3であるならば、縮約RDFデータにはトリプル(a1,a2,a3)が含まれていることが保証される。【００１９】
一方、縮約RDFデータは、RDFデータの複数のノードをひとつのノードにまとめて生成するため、RDFデータに比べてデータの数が小さくなる。平均してN個のノードをひとつにまとめるならば、縮約RDFデータのサイズは元RDFデータのサイズの1/Nになる。そのため、Nが十分大きくなるような縮約基準表を用いることで、縮約RDFデータに対する検索時間を元RDFデータの場合に比べて無視できる程度に短縮することができる。【００２０】
次に、SPARQLクエリを入力装置から受け取り、入力されたクエリ内のリテラルを、縮約基準表を用いて対応する縮約値に置換した縮約クエリを生成する。次に、縮約クエリを用いて縮約RDFデータを検索し、クエリ内の各変数の持つ縮約値を記録した変数束縛表（クエリ内の各変数と縮約値との対応関係、図１３）を生成する。【００２１】
上記した通り、縮約RDFデータは元のRDFデータにおけるノード間のつながりを維持しているため、縮約RDFデータに対して縮約クエリqを用いて検索した実行したときに変数xの値が縮約値aであるならば、同じ元のクエリqを元のRDFデータに対して実行したときのxの値は必ずaに縮約される値になる。そのため、変数xの値としては、aに縮約されるものだけを調べればよいことがわかる。【００２２】
次に、生成した変数束縛表を用いて、元クエリに各変数の持つ縮約値を指定した変数範囲制限節を追加した展開クエリを生成する。最後に生成した展開クエリを用いて縮約RDFデータに対応するRDFデータを検索し、検索結果を求める。
【発明の効果】
【００２３】
元のクエリは、検索時に調べる必要がある変数の値の範囲が、指定された縮約値に対応するものに限定された縮約クエリに変換され、これを用いて、複数のデータを変数の値の範囲が指定された縮約値に変換した縮約RDFデータを検索する。  そのため、特に大規模なRDFデータに対するクエリの検索効率が向上する。
【図面の簡単な説明】
【００２４】
【図１】ＲＤＦデータの例を示した図である。
【図２】本発明の構成図である。
【図３】ＲＤＦデータ縮約処理の流れを示した図である。
【図４】縮約表生成の流れを示した図である。
【図５】縮約RDFデータ生成の流れを示した図である。
【図６】クエリ処理全体の流れを示した図である。
【図７】クエリ変換処理の流れを示した図である。
【図８】クエリ展開処理の流れを示した図である。
【図９Ａ】実施例で用いるRDFデータを示した図である。
【図９Ｂ】実施例で用いる縮約基準表を示した図である。
【図９Ｃ】実施例で用いるクエリを示した図である。
【図１０Ａ】実施例で用いる縮約表を示した図である。
【図１０Ｂ】実施例で用いる縮約RDFデータを示した図である。
【図１１Ａ】実施例で用いる縮約クエリを示した図である。
【図１１Ｂ】実施例で用いる変数束縛表を示した図である。
【図１１Ｃ】実施例で用いる展開クエリを示した図である。
【図１１Ｄ】実施例で用いるクエリ結果を示した図である。
【図１２】検索処理の概要を示す図である。
【発明を実施するための形態】
【００２５】
以下、図面を用いて発明の実施形態の一例を説明する。
【００２６】
図1はSPARQL最適化装置が稼働する計算機システムの構成例を示す図である。矢線はデータの流れを表している。
【００２７】
図示するように、計算機システムはＣＰＵ101、主記憶装置102、外部記憶装置103、キーボードなどの入力装置104、ディスプレイ装置などの出力装置105より構成されている。
【００２８】
外部記憶装置103には、RDFストアが管理する元RDFデータ106が格納されている。
【００２９】
主記憶装置102には、入力装置104から入力される縮約基準表107、RDFデータ106および縮約基準表107を用いて縮約表109および縮約RDFデータ110を生成するRDFデータ縮約部108、入力装置104から入力される元クエリ111および縮約基準表107を用いて縮約クエリを生成するクエリ変換部112、縮約クエリ113および縮約RDFデータ110を用いて変数束縛表115を生成する縮約検索部114、元クエリ111および変数束縛表115を用いて展開クエリ117を生成するクエリ展開部116、および展開クエリ117およびRDFデータ106を用いてクエリ実行結果（検索結果）119を生成するクエリ実行部118が格納されている。
【００３０】
上記の各用語の定義を以下に示す。
（１）縮約基準表107は、RDFデータにおける複数のリテラル（文字）又はリソース（数値）を縮約値と呼ぶひとつの値に対応づけるために定めた基準である。
（２）縮約表109は、RDFデータに含まれる複数のリソースをひとつの縮約値に対応づけるものである。
（３）変数束縛表115は、クエリ内の各変数と縮約値との対応関係を示すものである。縮約クエリ113は、入力された元クエリ内のリテラルを、縮約基準表を用いて対応する縮約値に置換したものである。
（４）展開クエリ117は、元クエリに各変数の持つ縮約値を指定した変数範囲制限節を追加したものである。
（５）縮約RDFデータ110は、縮約基準表および縮約表を用いて元のRDFデータの複数ノード（リソース及びリテラルの総称）をひとつのノードに集約したデータである。    
処理の説明の前に、図９、１０及び１１に示した、処理で使用する各データを説明する。
【００３１】
図９Ａは、例として用いるRDFデータ、図９Ｂは、縮約基準表、図９Ｃは、クエリを示した図である。
【００３２】
図９Ａは、例として用いるRDFデータを３列の表形式で表したものである。各行がひとつのトリプルに対応しており、１列目が主語、２列目が述語、３列目が目的語を表している。このRDFデータは、Ａ、Ｂ、Ｃ、ＤおよびＥの５つの国のランク（rank）、度数（degree）、名前（name）、友好関係（friend）を表している。
【００３３】
図９Ｂは、例として用いる縮約基準表である。基準述語としてrankおよびdegreeの２つが記録されている。rankの縮約値はcLおよびcHで、それぞれ２未満および２以上の値に対応している。これは、２未満のrankの値はcL、２以上のrankの値はcHに縮約することを意味している。同様に、degreeの縮約値はdLおよびdHで、それぞれ１０未満および１０以上の値に対応している。これは、１０未満のdegreeの値はdL、１０以上のdegreeの値はdHに縮約することを意味している。
【００３４】
図９Ｃは、例として用いるSPARQLクエリ（元のクエリ）である。このクエリは、度数（?d1）が６未満の国（?s1）のランク（?c1）より低いランクの国（?s2）と友好関係にある国（?s3）のうち、そのランク（?c3）が２未満であるものの名前（?n2）を検索するものである。世界各国が公開している統計データをRDFデータとして統一的に表現しておくことで、このような国家間の複雑なデータ分析を、SPARQLクエリを用いて簡単に行うことができる。一方、世界各国の様々な統計データを集めて作られるRDFデータはきわめて大規模なものになるため、実用にあたっては効率的なクエリ処理が必要となる。
【００３５】
図１０Ａは、図９ＡのRDFデータおよび図９Ｂの縮約基準表から、本発明の図３〜５の処理によって生成される縮約表であり、図１０Ｂは、縮約RDFデータである。
【００３６】
後述するステップ301で、元のRDFデータ（図９Ａ）におけるすべてのリソースについて、入力として与えられた縮約基準表（図９Ｂ）にもとづいてその縮約値を求め、元のリソースと縮約値の対応関係を記録した縮約表（図１０Ａ）が生成される。
【００３７】
図１１Ａ−Ｄは、図９Ｃのクエリから、本発明の図６〜８の処理によって生成される縮約クエリ（図９Ａ）、変数束縛表（図９Ｂ）、展開クエリ（図９Ｃ）、及び検索結果（図９Ｄ）である。図１１Ａは、図９Ｃの入力クエリを変換し、クエリ内のリテラルを対応する縮約値に置き換えた縮約クエリである。図１１Ｂは、縮約クエリを用いて、図１０Ｂの縮約RDFデータを検索することによって得られる検索結果であるクエリ内の各変数の縮約値（変数束縛）を、変数と対応させた変数束縛表である。図１１Ｃは、図１１Ｂの結果を用いて図９Ｃの入力クエリを展開し、検索範囲が限定された展開クエリを示す。図１１Ｃの「＊」は、その検索範囲の限定部分である。図１１Ｄは、図１１Ｃの展開クエリを用いて図９ＡのRDFデータを検索することによって得られる検索結果（変数とその値）である。
【００３８】
図３はRDFデータ縮約処理を含む処理全体を示したフローチャートである。
【００３９】
最初にステップ301で、元のRDFデータにおけるすべてのリソースについて、入力として与えられた縮約基準表にもとづいてその縮約値を求め、元のリソースと縮約値の対応関係を記録した縮約表を生成する（図４）。
【００４０】
次にステップ302に進み、生成した縮約表を用いて元のRDFデータを縮約し、縮約RDFデータを生成する（図５）。
【００４１】
最後に、ステップ303では、縮約RDFデータの検索結果に基づいて入力クエリを最適化してRDFデータを検索するクエリ最適化処理を行う（図６）。
【００４２】
ここで、図１２を用いて、各データに基づく検索処理の概要を説明する。
【００４３】
（１）クエリを用いたRDFデータの検索に先立って、縮約基準表を用いて、RDFデータを縮約した縮約RDFデータを生成する。その際に、双方のデータの対応関係を示す縮約表を生成する。
【００４４】
（２）縮約表と縮約基準表を用いて（元の）クエリから生成した縮約クエリを用いて、縮約RDFデータを検索し、検索結果として変数束縛表を生成する。
【００４５】
（３）変数束縛表を用いて検索範囲を限定することによって、（元の）クエリから展開クエリを生成し、これを用いてRDFデータを検索して検索結果を得る。
【００４６】
即ち、本発明では、（元の）クエリではなく、それの縮約クエリを用いてRDFデータを縮約した縮約RDFデータを検索し、その結果得られる変数束縛表を用いて（元の）クエリを変換した展開クエリを用いてRDFデータを検索する。
【００４７】
図４はステップ301の処理を詳しくしたフローチャートである。
【００４８】
最初にステップ401で、処理済みのものを格納して区別するため、処理済のリソースを記録するリストを生成する（doneとする、これは処理済みを意味する）。  次にステップ402に進み、空の縮約表を生成し、元のRDFデータに含まれるすべての述語リソースについて、RDFデータから取り出したリソースと同じ値（リソース名）を縮約値として縮約表に登録する。特に、述語リソースの場合は、図１０Ａの第１行〜第４行のように、リソースと縮約値とが同じになり、これらが対になって登録される。
【００４９】
ここで、述語リソースとは、元のRDFデータにおいて、トリプルの述語（第二要素）として現れるリソースのことである。本発明では、複数の述語リソースをひとつに縮約することはしないため、縮約値として元と同じ値を用いている。
【００５０】
次にステップ403に進み、元のRDFデータに未処理のリソースが残っているかを調べる。未処理のリソースがない場合、縮約表が完成したので終了する。未処理のリソースが残っている場合、ステップ404に進み、ひとつ取り出す（sとする）。リソースsの縮約値は、リソース毎に、縮約基準表に記録されている全ての基準述語と順に照合することで求める（ステップ405〜410）。
【００５１】
最初にステップ405に進み、処理済みの基準述語を表す空のリストを生成する。次に、ステップ406に進み、リソースsの縮約値を表す空の文字列を生成する（リソースsの縮約値のリストをvsとする）。    
本発明では、述語でないリソースの縮約値として、縮約基準表を用いて各基準述語における縮約値を、順次、図１０Ａの縮約表に格納する。これにより、図１０Ａの第５行〜第１０行に示す述語でないリソースのように、ひとつでも縮約値の異なる基準述語を持つリソースを区別して扱うことができる。
【００５２】
次にステップ407に進み、未処理の基準述語が残っているかを調べる。未処理の基準述語が残っている場合、ステップ408に進み、ひとつ取り出す（pとする）。以下では、図１０Ａに示すRDFデータの主語、述語、及び目的語に対応する呼号をそれぞれｓ、ｐ、ｏとし、それぞれの縮約値の記号をそれぞれｃｓ、ｃｐ、ｃｏとする。
【００５３】
次にステップ409に進み、元のRDFデータからsを主語、pを述語を含むトリプル(s,p,o)を取り出し、縮約基準表に基づいて目的語oの縮約値を求める（coとする）。次にステップ410に進み、co（目的語ｏの縮約値）をvs（リソースsの縮約値のリスト）に追加し、p（未処理基準述語）を処理済みリスト（done 2）に追加した後、ステップ407に戻る。
【００５４】
ステップ407において、未処理の基準述語がない場合、主語sの縮約値を求め終えたので、ステップ411に進む。
【００５５】
ステップ411では、縮約表に主語sの縮約値がvsであることを記録する。次に、ステップ412に進み主語sを処理済リストに追加した後、ステップ403に戻る。
【００５６】
図５はステップ302の縮約RDFデータ生成処理を詳しくしたフローチャートである。縮約RDFデータの生成は、元のRDFデータの各トリプルを、ステップ301で生成した縮約表および縮約基準表にもとづいて縮約していくことで行う。
【００５７】
最初にステップ501で、処理済のトリプルを記録するリストを生成する（doneとする）。次にステップ502に進み、図１０Ｂに示す空の縮約RDFデータを生成する（CGとする）。
【００５８】
次にステップ503に進み、元のRDFデータに未処理のトリプルが残っているかを調べる。未処理のトリプルがない場合、縮約RDFデータ生成処理を終了する。未処理のトリプルが残っている場合、ステップ504に進み、ひとつ取り出す（(ｓ、ｐ、ｏ)とする）。
【００５９】
次にステップ505に進み、ｓ、ｐ、ｏに対応する縮約値を縮約表と縮約基準表から求める（ｃｓ、ｃｐ、ｃｏとする）。RDFの仕様により、ｓ、ｐはリソース、ｏはリソースまたはリテラルである。ｏがリソースの場合、縮約表にリソースの縮約値が記録されているので、対応する縮約値を取り出す。ｏがリテラルの場合、ｐが基準述語ならば、図４のステップ409と同じように、入力された縮約基準表にもとづき縮約値を求める。ｐが基準述語でなければ、その他の値すべてを表す「other」を縮約値とする。
【００６０】
次にステップ506に進み、求めた縮約値ｃｓ、ｃｐ、ｃｏからなるトリプル(ｃｓ、ｃｐ、ｃｏ)を縮約RDFデータ（CG）に追加する。次にステップ507に進み、リソースｓとその縮約値ｃｓの対応を表すトリプル(ｓ、ａｂｓ、ｃｓ)を元のRDFデータに追加する。これは、クエリ実行時（検索時）に検索範囲を限定するのに用いる。「ａｂｓ」は元データと縮約値とを対応付ける述語である。次にステップ508に進み、(ｓ、ｐ、ｏ)を処理済みリストdoneに追加し、ステップ503に戻る。
【００６１】
図６はクエリ最適化実行処理３０３の流れを示したフローチャートである。本処理は、図３の縮約処理で生成した縮約表および縮約RDFデータを用いて、RDFストアに入力されたクエリを最適化し、検索範囲の限定されたクエリを生成する。生成したクエリを用いて元のRDFデータを検索し、検索結果を出力する。ここで、「最適化」とは、（元の）クエリから、検索範囲を限定する条件節を追加したクエリを生成することである。
【００６２】
最初にステップ601で、入力クエリｑを変換し、クエリ内のリテラルを対応する縮約値に置き換えた縮約クエリを生成する（ａｑとする）。
【００６３】
次にステップ602に進み、縮約クエリａｑを用いて縮約RDFデータを検索し、クエリ内の各変数の縮約値を求める（ａｒｓとする）。縮約RDFデータはRDF形式のため、縮約クエリを用いた縮約ＲＤＦデータの検索はRDFストアが行っている非特許文献1の定義にもとづく通常のクエリ処理、即ち、トリプルのリストからクエリに合うトリプルを取り出す処理とほぼ同様であり、異なるのはfilter節における比較式の判定処理だけである。
【００６４】
縮約値v1とv2の非等値比較v1 != v2は（「!=」は「≠」と同じ）、通常のクエリ処理ではv1とv2の値が同じであれば偽、そうでなければ真と判定するが、縮約値の場合、値が同じであっても、縮約前の値が同じとは限らないため、常に真と判定するようにする。また縮約値の大小比較v1 < v2は、縮約基準表を参照してv1とv2に対応する元の値の範囲を調べ、その大小関係によって判定する。たとえば、v1に対応する元の値の範囲が20以下、v2に対応する元の値の範囲が50以上と縮約基準表に書かれていれば、v1 < v2の結果は真と判定する。その他の大小比較（v1 > v2、v1 <= v2、 v2 <= v1）も同様である。これらの修正により、クエリの結果が最適化によって変化することを防ぐことができる。即ち、展開クエリに追加した制限条件によって検索漏れが生じることを防ぐことができる。
【００６５】
次にステップ603に進み、クエリ内の各変数の縮約値arsを用いて入力クエリqを展開、即ち、変数範囲制限節をクエリに追加し、検索範囲の限定された展開クエリを生成する（ｑｓとする）。
【００６６】
次にステップ604に進み、展開クエリqsを用いて元のRDFデータを検索し、クエリ内の各変数に対応する値（検索結果）を求める（ｒｓとする）。これはRDFストアが行っている通常のクエリ処理と同じである。次にステップ605に進み、クエリ内の各変数に対応する値rsを検索結果として出力し、終了する。
【００６７】
図7は、ステップ601のクエリ変換処理を詳しく示したフローチャートである。クエリ変換処理は、元のクエリのwhere節に書かれているパターン（条件節）をひとつずつ、元のクエリに含まれている値を縮約値に変換することで行う。
【００６８】
最初にステップ701で、元のクエリｑの変数節を＊にし、ｗｈｅｒｅ節を空にした縮約クエリを生成する（ａｑとする）。変数節を＊にするのは、クエリ内のすべての変数の縮約値を求めるためである。次にステップ702に進み、処理済のパターンを記録する空のリスト（図１１Ａ）を生成する（doneとする）。
【００６９】
次にステップ703に進み、未処理のパターンが、図１１Ａのデータに残っているかを調べる。未処理のパターンがない場合、クエリ変換処理を終了する。未処理のパターンが残っている場合、ステップ704に進み、パターンをひとつ取り出す（patとする）。
【００７０】
次にステップ705に進み、patに含まれているリテラルを、縮約基準表を用いて縮約値に置き換えたパターンを生成する（apatとする）。縮約値の求め方は、図４のステップ409と同じである。用いる基準述語は、リテラルがトリプルパターン（トリプルの一部が変数になっている条件節、図１１Ａの２、３、５、７−９行目の”filter”が付いていないもの）に含まれ、述語が変数でない場合、その変数でないものを基準述語にする。リテラルがフィルタパターンの比較式に含まれ、比較相手の変数を目的語とするトリプルパターンが存在する場合、その変数でないものを基準述語にする。いずれにも該当しない場合、常に真となるフィルタパターン filter (1 = 1)を生成する。
【００７１】
次にステップ706に進み、リテラルを縮約値に置き換えたパターンapatを縮約クエリaqのwhere節に追加する。次にステップ707に進み、未処理パターンであるpatを処理済リストdoneに追加し、ステップ703に戻る。
【００７２】
図８は、ステップ603のクエリ展開処理を詳しく示したフローチャートである。
【００７３】
最初にステップ801で、空の展開クエリ集合を生成する（ｑｓとする）。次にステップ802に進み、処理済の変数束縛を記録する空のリスト（図１１Ｃ、展開クエリを格納するためのもの）を生成する（doneとする）。
【００７４】
次にステップ803に進み、未処理の変数束縛が残っているかを調べる。未処理の変数束縛がない場合、クエリ展開処理を終了する。未処理の変数束縛が残っている場合、ステップ804に進み、変数束縛をひとつ取り出す（ｒとする）。
【００７５】
次にステップ805に進み、元のクエリqをコピーして新しいクエリを生成する（ｑｅとする）。クエリ展開処理では、元のクエリをコピーした新しいクエリqeに、変数の値の範囲を制限するパターンを追加することで、検索範囲の限定された展開クエリを生成する（ステップ806〜ステップ810）。
【００７６】
以上の処理により、filterパターンでそのまま検索すると、２つの変数の値の比較に時間がかかるが、展開クエリでは、変数範囲制限節によってチェック対象の値の範囲が制限されるので、２つの変数の値の比較の時間が短縮される。
【００７７】
最初にステップ806に進み、処理済の変数を記録する空のリストを生成する（done2とする）。
【００７８】
次にステップ807に進み、未処理の変数が残っているかを調べる。ステップ807において、未処理の変数がない場合、ステップ811に進み、生成した展開クエリqeを展開クエリ集合qsに追加する。展開クエリ集合には、それぞれ変数制限節の異なるクエリの展開クエリが格納されている。次にステップ812に進み、変数束縛rを処理済リストdoneに追加し、ステップ803に戻る。
【００７９】
ステップ807において、未処理の変数が残っている場合、ステップ808に進み、ひとつ取り出す（?xとする）。次にステップ809に進み、変数束縛rに記録されている変数?xの値cvを求め、パターン「?x <abs> cv.」を展開クエリqeのwhere節に追加する。次にステップ810に進み、変数?xを処理済リストdone2に追加し、ステップ807に戻る。
【００８０】
（処理の具体例）
以下では、具体例を用いて本発明の実施例を示す。
【００８１】
ステップ301の処理について、図４に示されているフローチャートに沿って説明する。
【００８２】
最初にステップ401で、処理済のリソースを記録するリストを生成する（doneとする）。次にステップ402に進み、空の縮約表を生成し、元のRDFデータに含まれるすべての述語リソースについて、元と同じ値（リソース名）を縮約値として記録し、処理済リストdoneに登録する。図９ＡのRDFデータの述語の列から、rank, degree, name, friendの４つが述語リソースとして得られる。そこで、縮約表にリソースとその縮約値との対、即ち、(rank、 rank)、 (degree、 degree)、 (name、 name)及び(friend、friend)を登録する。またrank、 degree、 name、 friendを処理済リストdoneに登録する。
【００８３】
次にステップ403に進み、元のRDFデータに未処理のリソースが残っているかを調べる。未処理のリソースが残っているため、ステップ404に進み、ひとつ取り出す。ここでは主語Aが取り出されたとする。
【００８４】
次にステップ405に進み、処理済みの基準述語を表す空のリストを生成する（done2とする）。次に、ステップ406に進み、主語Aの縮約値を表す空のリストを生成する（vsとする）。
【００８５】
次にステップ407に進み、未処理の基準述語が残っているかを調べる。未処理の基準述語としてrankとdegreeが残っているので、ステップ408に進み、基準述語をひとつ取り出す。ここではrankが取り出されたとする。
【００８６】
次にステップ409に進み、元のRDFデータからAを主語、rankを述語とするトリプルを取り出す。ここでは(A、rank、1)が取り出される。１は２未満なので、縮約基準表から、その縮約値が「cL」であることがわかる。次にステップ410に進み、縮約値「cL」を主語Aの縮約値を表す空のリストvsに追加し、rankをdone2に追加する。これにより、vs = cL、done2 = rankとなる。
【００８７】
次にステップ407に進み、未処理の基準述語が残っているかを調べる。未処理の基準述語としてdegreeが残っているので、ステップ408に進み、取り出す。
【００８８】
次にステップ409に進み、元のRDFデータからAを主語、degreeを述語とするトリプルを取り出す。ここでは(A、degree、４)が取り出される。４は１０未満なので、縮約基準表から、その縮約値が「dL」であることがわかる。次にステップ410に進み、縮約値「dL」を主語Aの縮約値を表す空のリストvsに追加し、degreeをdone2に追加する。これにより、vs = cLdL、done2 = rank degreeとなる。
【００８９】
次にステップ407に進み、未処理の基準述語が存在しないため、ステップ411に進む。ステップ411では、縮約表にAの縮約値が「cLdL」であることを記録する。次に、ステップ412に進み、主語Aをdoneに追加した後、ステップ403に戻る。
【００９０】
以降、未処理のリソースＢ、Ｃ、Ｄ、Ｅについて同様にステップ403〜412の処理が行われ、結果として図１０Ａの縮約表が生成される。
【００９１】
次にステップ302の処理について、図５に示されているフローチャートに沿って説明する。
【００９２】
最初にステップ501で、処理済のトリプルを記録するリストを生成する（doneとする）。次にステップ502に進み、空の縮約RDFデータ（図１０Ｂ）を生成する（CGとする）。
【００９３】
次にステップ503に進み、未処理のトリプルが残っているかを調べる。未処理のトリプルが残っているので、ステップ504に進み、ひとつ取り出す。ここでは、(A、rank、１)が取り出されるとする。
【００９４】
次にステップ505に進み、「A、rank、1」に対応する縮約値を求める。主語Aと述語rankはリソースであり、図１０Ａの縮約表から縮約値はそれぞれ「cLdL」および「rank」であることがわかる。１はリテラルであり、図９Ｂの縮約基準表から、縮約値が「cL」であることがわかる。次にステップ506に進み、求めた縮約値からなるトリプル(cLdL、rank、cL)を縮約RDFデータCGに追加する。次にステップ507に進み、主語Aと縮約値「cLdL」の対応を表すトリプル(A、abs、cLdL)を元のRDFデータに追加する。次にステップ508に進み、(A、rank、1)を処理済みリストdoneに追加し、ステップ503に戻る。
【００９５】
以降、未処理のトリプルについて同様にステップ503〜508の処理が行われ、結果として図１０Ｂの縮約RDFデータが生成される。
【００９６】
次にステップ303の処理について、図６に示されているフローチャートに沿って説明する。
【００９７】
最初にステップ601で、入力クエリ（図９Ｃ）を変換し、クエリ内のリテラルを対応する縮約値に置き換えたクエリを生成する（図１１Ａ）。次にステップ602に進み、縮約クエリaqを用いて縮約RDFデータ（図１０Ｂ）を検索し、クエリ内の各変数の縮約値（変数束縛）を求める（図１１Ｂ）。
【００９８】
次にステップ603に進み、図１１Ｂの結果を用いて入力クエリ（図９Ｃ）を展開し、検索範囲の限定された展開クエリを生成する（図１１Ｃ）。次にステップ604に進み、図１１Ｃの展開クエリを元のRDFデータ（図９Ａ）に対して実行し、クエリ内の各変数の値を求める（図１１Ｄ）。これはRDFストアが行っている通常のクエリ処理と同じである。
【００９９】
次にステップ605に進み、図１１Ｄの内容を結果として出力して終了する。
【０１００】
ステップ601の処理について、図７に示されているフローチャートに沿って説明する。
【０１０１】
最初にステップ701で、元のクエリ（図９Ｃ）の変数節を*、where節を空にした縮約クエリを生成する（aqとする）。次にステップ702に進み、処理済のパターンを記録する空のリストを生成する（doneとする）。
【０１０２】
次にステップ703に進み、未処理のパターンが残っているかを調べる。未処理のパターンが残っているので、ステップ704に進み、ひとつ取り出す。ここでは、パターン「filter (?d1 < 6)」が取り出されたとする。
【０１０３】
次にステップ705に進み、パターン「filter (?d1 < 6)」に含まれているリテラルを縮約基準表（図９Ｂ）を用いて縮約値に置き換えたパターンを生成する。含まれているリテラルは６のみであり、６の比較相手である変数「?d1」を目的語とするトリプルパターンの述語はdegreeのため、これを基準述語として縮約基準表から６の縮約値を求めると「dL」であることがわかる。そのため、置き換えたパターンは「filter (?d1 < dL)」となる。
【０１０４】
次にステップ706に進み、パターン「filter (?d1 < dL)」を縮約クエリaqのwhere節に追加する。次にステップ707に進み、パターン「filter (?d1 < 6)」を処理済リストdoneに追加し、ステップ703に戻る。
【０１０５】
以降、未処理のパターンについて同様にステップ703〜707の処理が行われ、結果として図１１Ａの縮約クエリが生成される。
【０１０６】
ステップ603の処理について、図８に示されているフローチャートに沿って説明する。
【０１０７】
最初にステップ801で、空の展開クエリ集合を生成する（qsとする）。次にステップ802に進み、処理済の変数束縛を記録する空のリストを生成する（doneとする）。
【０１０８】
次にステップ803に進み、未処理の変数束縛が残っているかを調べる。変数束縛はひとつしかないため、ステップ804に進み、それを取り出す。次にステップ805に進み、元のクエリ（図９Ｃ）をコピーして新しいクエリを生成する（qeとする）。次にステップ806に進み、処理済の変数を記録する空のリストを生成する（done2とする）。                                
次にステップ807に進み、未処理の変数が残っているかを調べる。未処理の変数が残っているので、ステップ808に進み、ひとつ取り出す。ここでは変数「?s1」が取り出されたとする。次にステップ809に進み、変数束縛（図１１Ｂ）から変数「?s1」の値を調べると、縮約値「cHdL」であることがわかる。そのためパターン「?s1 <abs> cHdL.」を新しいクエリqeのwhere節に追加する。  
次にステップ810に進み、変数?s1を処理済リストdone2に追加し、ステップ807に戻る。
【０１０９】
以降、未処理の変数について同様にステップ803〜810の処理が行われ、結果として図１１Ｃの展開クエリが生成される。図１１Ｃに示した展開クエリの中で（＊）で示した部分は、図９Ｃに示した元のクエリに対して追加された変数範囲制限節である。
【０１１０】
実施例によって生成された展開クエリ（図１１Ｄ）と元のクエリ（図９Ｃ）を比較すると、元のクエリでは変数?s1、?s2、?s3の検索範囲がＡ、Ｂ、Ｃ、Ｄ、Ｅのすべての組み合わせである５×５×５＝１２５個になる。
【０１１１】
一方、本実施例により生成された展開クエリでは、変数?s1、?s2、?s3の範囲を制限する変数範囲制限節「?s1 <abs> cHdL」、「?s2 <abs> cHdL」、および「?s3 <abs> cLdL」が追加されているため、変数?s1および?s2の取りうる値はそれぞれ縮約値cHdLに対応するＢおよびＤ、変数?s3の取りうる値は縮約値cLdLに対応するＥに限定され、変数?s1、?s2、?s3の検索範囲は２×２×１＝４個に絞り込まれる。そのため、展開クエリは、元のクエリに比べて実行効率が大幅に向上する。
【図１】
0005844824.tif 000002
【図２】
0005844824.tif 000003
【図３】
0005844824.tif 000004
【図４】
0005844824.tif 000005
【図５】
0005844824.tif 000006
【図６】
0005844824.tif 000007
【図７】
0005844824.tif 000008
【図８】
0005844824.tif 000009
【図９Ａ】
0005844824.tif 000010
【図９Ｂ】
0005844824.tif 000011
【図９Ｃ】
0005844824.tif 000012
【図１０Ａ】
0005844824.tif 000013
【図１０Ｂ】
0005844824.tif 000014
【図１１Ａ】
0005844824.tif 000015
【図１１Ｂ】
0005844824.tif 000016
【図１１Ｃ】
0005844824.tif 000017
【図１１Ｄ】
0005844824.tif 000018
【図１２】
0005844824.tif 000019