IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ ダッソー システムズの特許一覧

特開2024-86707グラフおよびリレーショナルデータのための統一されたクエリエンジン
<>
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図1
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図2
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図3
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図4
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図5
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図6
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図7
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図8
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図9A
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図9B
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図10
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図11
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図12
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図13
  • 特開-グラフおよびリレーショナルデータのための統一されたクエリエンジン 図14
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024086707
(43)【公開日】2024-06-27
(54)【発明の名称】グラフおよびリレーショナルデータのための統一されたクエリエンジン
(51)【国際特許分類】
   G06F 16/28 20190101AFI20240620BHJP
   G06F 16/903 20190101ALI20240620BHJP
【FI】
G06F16/28
G06F16/903
【審査請求】未請求
【請求項の数】13
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2023212808
(22)【出願日】2023-12-18
(31)【優先権主張番号】22306926.1
(32)【優先日】2022-12-16
(33)【優先権主張国・地域又は機関】EP
(71)【出願人】
【識別番号】500102435
【氏名又は名称】ダッソー システムズ
【氏名又は名称原語表記】DASSAULT SYSTEMES
(74)【代理人】
【識別番号】110001243
【氏名又は名称】弁理士法人谷・阿部特許事務所
(72)【発明者】
【氏名】ジャン-フィリップ サウト ディザーン
(72)【発明者】
【氏名】フレデリック ラバーテ
(72)【発明者】
【氏名】アルバン ルーリエ
(72)【発明者】
【氏名】エリック ヴァレ グレニッソン
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175AA02
5B175CA09
5B175CA11
(57)【要約】
【課題】リレーショナルデータおよびグラフデータを含むデータベース上でクエリエンジンによって問い合わせるためのコンピュータ実装方法を提供する。
【解決手段】本開示は、特に、リレーショナルデータおよびグラフデータを含むデータベース上でクエリエンジンによって問い合わせるためのコンピュータ実装方法に関する。本方法は、クエリエンジンによってクエリを受信するステップであって、クエリは、一階論理パラダイムと互換性のある言語でのクエリである、ステップを含む。本方法は、中間表現(IR)を生成するステップであって、IRは、一階論理パラダイムと互換性がある、ステップをさらに含む。本方法は、クエリの中間表現を使用して、データベースのリレーショナルデータおよびグラフデータに対してクエリを実行するステップをさらに含む。
【選択図】図1
【特許請求の範囲】
【請求項1】
リレーショナルデータおよびグラフデータを含むデータベース上でクエリエンジンによって問い合わせるためのコンピュータ実装方法であって、前記方法は、
クエリエンジンによってクエリを受信するステップ(S10)であって、前記クエリは、一階論理パラダイムと互換性のある言語でのクエリである、ステップと、
中間表現(IR)を生成するステップ(S20)であって、前記IRは、一階論理パラダイムと互換性がある、ステップと、
前記クエリの前記中間表現を使用して、前記データベースの前記リレーショナルデータおよび前記グラフデータに対して前記クエリを実行するステップ(S30)と
を含む方法。
【請求項2】
前記クエリがSPARQLクエリである場合、前記生成された中間表現は前記SPARQLクエリの一階論理の述語計算に変換される、
前記クエリがSQLクエリである場合、前記生成された中間表現は前記SQLクエリの一階論理の述語計算に変換される、及び/または、
前記データベースの前記リレーショナルデータは、1つもしくは複数のテーブルを含み、前記データベースの前記グラフデータは、1つもしくは複数の隣接行列を含む、請求項1に記載の方法。
【請求項3】
前記クエリは第1のSQLクエリであり、前記クエリの前記中間表現を使用して、前記データベースの前記グラフデータに対して前記クエリを実行するステップは、
前記データベースの前記グラフデータに対してSPARQL SELECTクエリを実行して、それにより、タプルを出力するステップと、
前記実行されたクエリのマテリアライズドビューを作成するステップと、
前記作成されたマテリアライズドビューに対して前記第1のSQLクエリを実行するステップとを含む、請求項1または2に記載の方法。
【請求項4】
第2のSQLクエリを受信するステップをさらに含み、
前記第2のSQLクエリの実行は、前記第1のSQLクエリの前記作成されたマテリアライズドビューに基づく、請求項3に記載の方法。
【請求項5】
前記マテリアライズドビューを作成するステップは、テーブルを作成するステップを含み、
前記テーブルの行は、前記タプルに関連付けられ、
前記テーブルの列は、前記クエリのそれぞれの変数に関連付けられる、請求項3または4に記載の方法。
【請求項6】
前記受信されたクエリは、SPARQLまたはSQLにおいて少なくとも1つのJOIN句を有し、前記生成された中間表現は、以下の型のバッカス-ナウア記法(BNF)文法、
<joined table> ::=
<cross join>
| <qualified join>
| <left paren> <joined table> <right paren>
<cross join> ::=
<table reference> CROSS JOIN <table reference>
<qualified join> ::=
<table reference> [ NATURAL ] [ <join type> ] JOIN <table reference>
[ <join specification> ]
<join type> ::=
INNER
| <outer join type> [ OUTER ]
| UNION
<outer join type> ::= LEFT | RIGHT | FULL
<join specification> ::= <join condition> | <named columns join>
<join condition> ::= ON <search condition>
<named columns join> ::= USING <left paren> <join column list> <right paren>
<join column list> ::= <column name list>
で記述される、請求項1乃至5のいずれか一項に記載の方法。
【請求項7】
前記受信されたクエリは、SPARQLまたはSQLにおいてFROM句を有し、前記生成された中間表現は、以下の型のBNF文法、
<from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]
<table reference> ::=
<table name> [ <correlation specification> ]
| <derived table> <correlation specification>
| <joined table>
で記述される、請求項1乃至6のいずれか一項に記載の方法。
【請求項8】
前記FROM句は、AS句を含み、前記生成された中間表現は、以下の型のBNF文法、
<correlation specification> ::=
[ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]
<derived column list> ::= <column name list>
で記述される、請求項7に記載の方法。
【請求項9】
前記受信されたクエリは、SPARQLまたはSQLにおいてWHERE句を有し、前記生成された中間表現は、以下の型のBNF文法、
<where clause> ::= WHERE <search condition>
<search condition> ::=
<boolean term>
| <search condition> OR <boolean term>
<boolean term> ::=
<boolean factor>
| <boolean term> AND <boolean factor>
<boolean factor> ::= [ NOT ] <boolean test>
<boolean test> ::= <boolean primary> [ IS [ NOT ] <truth value> ]
<boolean primary> ::= <predicate> | <left paren> <search condition> <right paren>
<predicate> ::=
<comparison predicate>
| <between predicate>
| <in predicate>
| <like predicate>
| <null predicate>
| <quantified comparison predicate>
| <exists predicate>
| <match predicate>
| <overlaps predicate>
で記述される、請求項1乃至8のいずれか一項に記載の方法。
【請求項10】
前記生成された中間表現は、少なくとも入力を有する少なくとも1つの第1のFIND演算子を含み、前記方法は、
前記第1のfind演算子を第2のfind演算子に置き換えることによって、前記生成された中間表現を更新するステップであって、前記第2のfind演算子は、前記入力がヌルのときに未定義値を返すように構成されているステップをさらに含む、請求項1乃至9のいずれか一項に記載の方法。
【請求項11】
請求項1乃至10のいずれか一項に記載の方法を実行するための命令を含むコンピュータプログラム。
【請求項12】
請求項11に記載のコンピュータプログラムを記録したコンピュータ可読記憶媒体。
【請求項13】
メモリに結合されたプロセッサを備えたシステムであって、前記メモリは請求項11に記載のコンピュータプログラムを記録している、システム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、コンピュータプログラムおよびシステムの分野に関し、より具体的には、リレーショナルデータおよびグラフデータを含むデータベース上でクエリエンジンによって問い合わせるための方法、システム、およびプログラムに関する。
【背景技術】
【0002】
複数のシステムおよびプログラムが、オブジェクトの設計、エンジニアリング、および製造の市場に提供されている。CADは、コンピュータ支援設計(Computer-Aided Design)の頭字語であり、例えば、オブジェクトを設計するためのソフトウェアソリューションに関する。CAEはコンピュータ支援エンジニアリング(Computer-Aided Engineering)の頭字語であり、例えば、将来の製品の物理的挙動をシミュレートするためのソフトウェアソリューションに関する。CAMはコンピュータ支援製造(Computer-Aided Manufacturing)の頭字語であり、例えば、製造プロセスおよび動作を定義するためのソフトウェアソリューションに関する。このようなコンピュータ支援設計システムでは、グラフィカルユーザインターフェースが技術の効率に関して重要な役割を果たす。これらの技術は、製品ライフサイクル管理(PLM)システム内に組み込まれることがある。PLMとは、会社が、拡張された企業の概念にわたって、製品データを共有し、共通のプロセスを適用し、製品の開発について着想から寿命の終末まで企業知識を活用するのに役立つ事業戦略のことである。Dassault Systemesによって(商標CATIA、ENOVIA、およびDELMIAのもとに)提供されるPLMソリューションは、製品エンジニアリング知識を編成するエンジニアリングハブ、製造エンジニアリング知識を管理する製造ハブ、およびエンジニアリングハブと製造ハブとの両方への企業の統合および接続を可能にする企業ハブを提供する。これらを合わせて、システムは、最適化された製品定義、製造準備、生産、およびサービスを促進する動的な知識ベースの製品作成および意思決定サポートを可能にするために、製品、プロセス、リソースをリンクするオープンオブジェクトモデルを提供する。
【0003】
さらに、ディスクまたはSSDにデータを格納するデータベースとは対照的に、インメモリデータベース、すなわち、データ格納を主にメモリに依存する専用データベースにおいて、上記の設計システムおよびプログラムを適用するために、いくつかのデータベース管理用のシステムが提供されている。そのようなデータベース管理システム(DBMS)は、リレーショナルデータベース管理システム(RDBMS)と、グラフデータベース管理システム(GDBMS)と呼ばれる2つの主なカテゴリを含み、これらは、アプリケーションデータをモデル化する中核的なデータ構造としてグラフおよびリレーションをそれぞれ使用している。
【0004】
RDBMSとGDBMSは、ユーザに訴求し得る補完的な機能を備えている。例えば、グラフとは異なり、リレーショナルモデルはバイナリ関係に制限されず、エンティティ間のn項関係を容易にモデル化する。同時に、リレーショナルモデルはデータの厳密な図式化を必要とするが、グラフモデルは半構造化されていることが多く、より柔軟なデータモデリングおよびデータ格納(例えば、疎なデータの格納)を提供する。他方で、SQLは標準データ解析タスクを表現するのに非常に適しているが、GDBMSの言語は再帰的結合でクエリを表現する表現形式のための特殊な構文を含んでいる。さらに、グラフモデルは、多くの再帰的および多対多結合を含むグラフワークロードに対して、より良好な性能を有する。
【0005】
GDBMSとRSBMSの各々の長所と短所があるため、統一されたクエリアプローチのためのいくつかの解決策および方法が提案されている。
【0006】
非特許文献1は、SQL Server PDW V2の特徴であるpolybaseを提示しており、polybaseは、標準SQLを使用してHadoopクラスタに格納されたデータをユーザが管理し問い合わせることを可能にし、HDFS常駐データに対するクエリ演算子は、PDWクエリオプティマイザによってMapReduceジョブに変換され、次いで、Hadoopクラスタ上で実行される。
【0007】
非特許文献2は、ポリグロットクエリ用に設計されたデータ処理エンジンであるBabelfishを提示している。Babelfishは、異なる実装言語からのクエリを統一する中間表現を導入している。
【0008】
非特許文献3は、グラフモデリング、クエリ、および可視化機能を提供するようにDuckDB RDBMSを拡張するシステムであるGrainDB実証を提示している。さらに、GrainDBは、DuckDBの内部を修正して、システムレベルレコードID(RID)および隣接リスト状RIDインデックスを使用する事前定義されたポインタベースの結合など、高速結合機能のセットを提供するようにして、DuckDBをグラフワークロードでより効率的にする。
【0009】
RDFox(非特許文献4参照)は、RDFデータモデルに従って表現されたグラフ構造化データをユーザが管理し、SPARQL1.1クエリ言語を使用してそのデータをクエリすることを可能にする、メインメモリでありスケーラブルである集中型データストアを開示している。RDFoxは、PostgreSQLまたはODBC(非特許文献5参照)などの外部ソースに接続することができる。
【0010】
この文脈において、リレーショナルデータおよびグラフデータを含むデータベース上でクエリエンジンによって問い合わせるための改良された方法が依然として必要である。
【先行技術文献】
【非特許文献】
【0011】
【非特許文献1】Dewitt et al.,“Split query processing in polybase.”,Proceedings of the 2013 ACM SIGMOD International Conference on Management of Data.2013.p.1255-1266
【非特許文献2】Grulich et al.,“Babelfish:efficient execution of polyglot queries.”,Proceedings of the VLDB Endowment,2021,vol. 15,no 2,p.196-210
【非特許文献3】Jin et al.,“GrainDB:A Relational-core Graph-Relational DBMS.”,Proceedings of the 12h Annual Conference on Innovative Data Systems Research (CIDR ’22),202
【非特許文献4】https://www.oxfordsemantic.tech/
【非特許文献5】https://en.wikipedia.org/wiki/Open_Database_Connectivity
【非特許文献6】“RDF 1.1 Concepts and Abstract Syntax”,W3C Recommendation 25 February 2014 (or additionally the draft version RDF-star)
【非特許文献7】“RDF 1.1 N-Quads,A line-based syntax for RDF datasets”,W3C Recommendation 25 February 2014
【非特許文献8】https://www.w3.org/TR/rdf-sparql-query/#rdfDataset
【非特許文献9】https://www.w3.org/TR/sparql11-query/#QueryForms
【非特許文献10】https://en.wikipedia.org/wiki/SQL-92
【非特許文献11】RDF 1.1 Semantics,W3C recommendation of 25 February 2014
【非特許文献12】https://en.wikipedia.org/wiki/SQL#Predefined_data_types
【非特許文献13】https://en.wikipedia.org/wiki/First-order_logic
【非特許文献14】https://en.wikipedia.org/wiki/Relational_model
【非特許文献15】https://www.w3.org/TR/sparql11-query/#basicpatterns
【非特許文献16】https://www.w3.org/TR/rdb-direct-mapping
【非特許文献17】https://en.wikipedia.org/wiki/Hash_join
【非特許文献18】Abiteboul et al.,“Foundations of databases.”,Reading:Addison-Wesley,1995
【非特許文献19】Angles and Gutierrez,“The expressive power of SPARQL.”,International Semantic Web Conference,Springer,Berlin,Heidelberg,2008,p.114-129
【非特許文献20】http://www.cs.rpi.edu/~sibel/csci4380/spring2016/course_notes/logic_bagsemantics.html
【非特許文献21】https://www.w3.org/TR/sparql11-query/#BasicGraphPatterns
【非特許文献22】https://en.wikipedia.org/wiki/Projection_(relational_algebra)
【非特許文献23】PostgreSQL:https://www.postgresql.org/docs/current/features.html
【非特許文献24】https://www.w3.org/TR/sparql11-query/#inline-data
【非特許文献25】https://github.com/postgres/postgres/blob/master/src/backend/parser
【非特許文献26】https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15#logical-processing-order-of-the-select-statement
【非特許文献27】https://ronsavage.github.io/SQL/sql-92.bnf.html
【非特許文献28】Melton and Simon,“Understanding the new SQL:a complete guide”,Morgan Kaufmann,1993)
【非特許文献29】[8]Date and Darwen,“A Guide to the SQL Standard”.New York:Addison-Wesley,third edition,1993
【非特許文献30】https://justinjaffray.com/query-engines-push-vs.-pull/
【非特許文献31】https://www.w3.org/TR/2012/REC-r2rml-20120927/
【非特許文献32】https://www.w3.org/TR/rdb-direct-mapping/
【非特許文献33】https://www.w3.org/TR/2012/REC-r2rml-20120927/#natural-mapping
【非特許文献34】https://en.wikipedia.org/wiki/Materialized_view
【非特許文献35】https://cloud.google.com/bigquery/docs/materialized-views-intro
【非特許文献36】https://www.w3.org/TR/rdf-sparql-query/#docResultDesc
【発明の概要】
【0012】
したがって、リレーショナルデータおよびグラフデータを含むデータベース上でクエリエンジンによって問い合わせるためのコンピュータ実装方法が提供される。本方法は、クエリエンジンによってクエリを受信するステップであって、クエリは、一階論理パラダイムと互換性のある言語でのクエリである、ステップを含む。本方法は、中間表現(IR)を生成するステップであって、IRは、一階論理パラダイムと互換性がある、ステップをさらに含む。次いで、本方法は、クエリの中間表現を使用して、データベースのリレーショナルデータおよびグラフデータに対してクエリを実行するステップを含む。
【0013】
本方法は、以下のうちの1つまたは複数を含むことが可能であり、すなわち、
- クエリがSPARQLクエリである場合、生成された中間表現はSPARQLクエリの一階論理の述語計算に変換される、
- クエリがSQLクエリである場合、生成された中間表現はSQLクエリの一階論理の述語計算に変換される、
- データベースのリレーショナルデータは、1つもしくは複数のテーブルを含み、データベースのグラフデータは、1つもしくは複数の隣接行列を含む、
- クエリは第1のSQLクエリであり、クエリの中間表現を使用して、データベースのグラフデータに対してクエリを実行するステップは、データベースのグラフデータに対してSPARQL SELECTクエリを実行して、それにより、タプルを出力するステップと、実行されたクエリのマテリアライズドビューを作成するステップと、作成されたマテリアライズドビューに対して第1のSQLクエリを実行するステップとを含む、
- 本方法は、第2のSQLクエリを受信するステップをさらに含み、第2のSQLクエリの実行は、第1のSQLクエリの作成されたマテリアライズドビューに基づく、
- マテリアライズドビューを作成するステップは、テーブルを作成するステップを含み、テーブルの行は、タプルに関連付けられ、テーブルの列は、クエリのそれぞれの変数に関連付けられる、および/または
- 生成された中間表現は、少なくとも入力(input)を有する少なくとも1つの第1のFIND演算子を含み、本方法は、第1のfind演算子を第2のfind演算子に置き換えることによって、生成された中間表現を更新するステップをさらに含み、第2のfind演算子は、上記入力がヌルのときに未定義値を返すように構成されている。
【0014】
受信されたクエリは、SPARQLまたはSQLにおいて少なくとも1つのJOIN句を有することができ、生成された中間表現は、以下の型のバッカス-ナウア記法(BNF)文法で記述される:
<joined table> ::=
<cross join>
| <qualified join>
| <left paren> <joined table> <right paren>
<cross join> ::=
<table reference> CROSS JOIN <table reference>
<qualified join> ::=
<table reference> [ NATURAL ] [ <join type> ] JOIN <table reference>
[ <join specification> ]
<join type> ::=
INNER
| <outer join type> [ OUTER ]
| UNION
<outer join type> ::= LEFT | RIGHT | FULL
<join specification> ::= <join condition> | <named columns join>
<join condition> ::= ON <search condition>
<named columns join> ::= USING <left paren> <join column list> <right paren>
<join column list> ::= <column name list>
【0015】
受信されたクエリは、SPARQLまたはSQLにおいてFROM句を有することができ、生成された中間表現は、以下の型のBNF文法で記述される:
<from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]
<table reference> ::=
<table name> [ <correlation specification> ]
| <derived table> <correlation specification>
| <joined table>
【0016】
FROM句は、AS句を含むことができ、生成された中間表現は、以下の型のBNF文法で記述される:
<correlation specification> ::=
[ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]
<derived column list> ::= <column name list>
【0017】
受信されたクエリは、SPARQLまたはSQLにおいてWHERE句を有することができ、生成された中間表現は、以下の型のBNF文法で記述される:
<where clause> ::= WHERE <search condition>
<search condition> ::=
<boolean term>
| <search condition> OR <boolean term>
<boolean term> ::=
<boolean factor>
| <boolean term> AND <boolean factor>
<boolean factor> ::= [ NOT ] <boolean test>
<boolean test> ::= <boolean primary> [ IS [ NOT ] <truth value> ]
<boolean primary> ::= <predicate> | <left paren> <search condition> <right paren>
<predicate> ::=
<comparison predicate>
| <between predicate>
| <in predicate>
| <like predicate>
| <null predicate>
| <quantified comparison predicate>
| <exists predicate>
| <match predicate>
| <overlaps predicate>
【0018】
さらに、本方法を実行するための命令を含むコンピュータプログラムが提供される。
【0019】
さらに、コンピュータプログラムを記録したコンピュータ可読記憶媒体が提供される。
【0020】
さらに、メモリに結合されたプロセッサを備えたシステムであって、前記メモリがコンピュータプログラムを記録しているシステムが提供される。
【図面の簡単な説明】
【0021】
ここで、添付図面を参照して非限定的な例が説明される。
図1】本方法の例のフローチャートである。
図2】システムの例を示す図である。
図3】本方法による中間表現の例を示す図である。
図4】本方法による中間表現の例を示す図である。
図5】本方法による中間表現の例を示す図である。
図6】本方法による中間表現の例を示す図である。
図7】本方法による中間表現の例を示す図である。
図8】本方法による中間表現の例を示す図である。
図9A】本方法による中間表現の例を示す図である。
図9B】本方法による中間表現の例を示す図である。
図10】本方法による中間表現の例を示す図である。
図11】本方法による中間表現の例を示す図である。
図12】本方法による中間表現の例を示す図である。
図13】本方法による中間表現の例を示す図である。
図14】本方法による中間表現の例を示す図である。
【発明を実施するための形態】
【0022】
図1のフローチャートを参照すると、リレーショナルデータおよびグラフデータを含むデータベース上でクエリエンジンによって問い合わせるためのコンピュータ実装方法であって、クエリエンジンによってクエリを受信するステップと、中間表現(IR)を生成するステップと、クエリの中間表現を使用して、データベースのリレーショナルデータおよびグラフデータに対してクエリを実行するステップとを含むコンピュータ実装方法が提案されている。クエリは、一階論理パラダイムと互換性のある言語でのクエリであり、IRは、一階論理パラダイムと互換性がある。
【0023】
本方法は、リレーショナルデータおよびグラフデータを含むデータベースを提供する(すなわち、取得する)ステップをさらに含むことができる。そのような例では、本方法は、オンラインクラウドを使用してデータベースを取得すること、リモートサーバからデータベースをダウンロードすること、または永続メモリ上でデータベースにアクセスすることができる。
【0024】
そのような方法は、リレーショナルデータとグラフデータとの両方のタイプを含むデータベース上でクエリを実行することができる改良された解決策を提供する。本方法は、一階論理と互換性のある言語でクエリを受信することができ、リレーショナルデータ部分とグラフデータ部分との両方に対して実行される、このクエリからのそれぞれのIRを形成する。言い換えれば、本方法は、ポリグロットデータベース、すなわち、いくつかの言語をサポートするデータベースのための解決策を提供する。
【0025】
特に、本方法によって提供される解決策は、コードを複製する必要がなく、また、低レベル構文への任意の変換に基づくため、異なる最適化技術が(例えば、辞書符号化からのインデックスでの結合に)適用され得る。さらに、そのような解決策では、グラフデータとリレーショナルデータの各々が、それらの本来のフォーマットで提示され得る。他方で、本方法はエミュレーションをしないので、エミュレーションの欠点、すなわち、達成困難な意味的互換性、および基礎となるモデルの追加制約を回避している。特に、本方法は、スキーマに依存しないので、データフォーマットにおける大きな柔軟性を提供し、それにより、本方法は、非構造化データを効率的に問い合わせることができる。
【0026】
クエリ、例えば、受信されたクエリは、読取りクエリ(例えば、SELECT)を意味する。「データベース」とは、検索(search)および取出し(retrieval)のために編成されたデータ(すなわち情報)の任意のコレクション(例えば、グラフ指向データベース)を意味する。データベースは分散されていることも、分散されていないこともある。当技術分野で知られているように、グラフ指向データベースは、グラフ理論を使用したオブジェクト指向データベースであり、したがって、ノードおよび弧を有し、データが表現および格納されることを可能にする。グラフは、ストア内のデータアイテムを、ノードとエッジのコレクションに関係付け、エッジは、ノード間の関係を表している。こうした関係は、ストア内のデータが互いに直接リンクされることを可能にし、多くの場合、1つの操作でデータが取り出されることを可能にする。グラフデータベースは、暗黙の接続によってデータをリンクする他のデータベースモデル(例えば、リレーショナルデータベース)とは対照的に、データ間の関係を優先的に保持する。メモリ(例えば、永続メモリ)上に格納された場合、グラフデータベースは、コンピュータによる迅速な検索および取出しを可能にする。特に、グラフデータベースは、様々なデータ処理操作と関連して、関係の高速な取出し、修正、および削除をするために構造化されている。グラフ指向データベースはグラフデータベースとも呼ばれ、「グラフ指向データベース」と「グラフデータベース」という表現は同義語である。
【0027】
例では、グラフデータベースはRDFグラフデータベースであり得る。RDFグラフは、グラフの格納および取出しに使用される従来のデータモデルである。RDFグラフは、有向のラベル付きグラフデータフォーマットである。そのようなフォーマットは、ウェブにおいて情報を表現するために広く使用されている。グラフとして情報のRDF表現を指定するための標準仕様がW3Cによって公表されている(例えば、非特許文献6参照)。RDFグラフデータベースは何十億のタプルを有することがあり、例えば、Uniprotデータセットはタンパク質配列および機能情報のリソースである。
【0028】
使用される抽象構文のコア構造は、タプルのセットであり、各タプルは述語を含む。そのようなRDFタプルのセットはRDFグラフと呼ばれる。
【0029】
例では、RDFタプルは、ノードおよびエッジを含む3つまたは4つの要素を含むことがある。例では、各RDFタプル(または各RDFタプルの要素)は、主語、述部、および目的語を含むトリプルであり得る。そのような例では、RDFグラフは、ノードおよび有向弧図として視覚化されてよく、そこでは、各トリプルは、ノード-弧-ノードリンクとして表される。あるいは、RDFトリプルは、主語と目的語である2つのノードと、それらを接続する述語である弧によって視覚化されてよい。
【0030】
例では、RDFタプルは、RDFクワッドであり得る。RDFクワッドは、RDFトリプルにグラフラベルを加えることによって得られる場合がある。そのような例では、RDFタプルはRDFグラフを含む。RDFクワッド(N-Quadsとも呼ばれる)を指定するための標準仕様がW3Cによって公表されている(例えば、非特許文献7参照)。RDFクワッドは、RDFトリプルにグラフ名を追加することで得られる場合がある。グラフ名は、空(すなわち、デフォルトもしくは無名グラフ)またはIRI(すなわち、グラフIRIのいずれかであってよい。例では、グラフの述語はグラフIRIと同じIRIを有することがある。各クワッドのグラフ名は、該当するRDFデータセットにおいてそのクワッドが部分であるグラフである。RDFデータセットは、それ自体知られているように、グラフのコレクションを表す(例えば、非特許文献8参照)。以下では、RDFタプル(またはタプル)という用語は、一方または他方の使用が明示的に言及されていない限り、RDFトリプルまたはRDFクワッドを無差別に指す。
【0031】
グラフデータベースのクエリエンジンについて可能な最適化は、グラフデータベースが開世界(Open World)または閉世界(Closed World)と相互作用しているという仮定に影響される。それ自体知られているように、知識表現に使用される論理の形式的体系において、開世界仮説(OWA)とは、文の真理値は、それが真であると知られているかどうかにかかわらず真であり得るという仮定である。これは、真であるいかなる文も真であることが知られていることが成り立つ閉世界仮説の逆である。他方で、閉世界システムでは、すべてのものを配置するために場所を必要とする(例えば、フレーム上のスロット、OOクラス上のフィールド、またはDB内の列)。OWAは、デフォルトで不完全な情報を仮定しており、意図的に不完全な指定をして、他者が再利用および拡張することを可能にする。セマンティックウェブは、再利用可能な形式の分散された知識およびデータである、コンピュータに理解可能なウェブの構想であり、RDFは、セマンティックウェブについてのW3C勧告であり、開世界仮説に従っている。それは、データモデル化およびデータ格納における柔軟性を高めることを可能にする。しかし、SQLを用いたリレーショナルモデルと同様に、閉世界仮説の制約は、どのようにデータが格納されるかについてより多くの情報を提供するので、クエリ最適化にとって有用である。例では、クエリはSPARQLクエリである。SPARQLは、RDFデータの問い合わせについてのW3C勧告であり、RDFトリプルのパターン上に構築されたグラフマッチング言語である。後述されるSPARQLクエリでは、読取りクエリは、SELECT、ASK、DESCRIBE、CONSTRUCTであり得る(非特許文献9参照)。「RDFタプルのパターン」は、RDFグラフによって形成されるパターン/テンプレートを意味する。言い換えれば、RDFタプルのパターンは、RDFグラフ(すなわち、RDFトリプルのセット)であり、そこでは、グラフの主語、述部、目的語、またはラベルが(クエリのための)変数で置き換えられることが可能である。SPARQLは、データがRDFとしてネイティブに格納されるか、またはミドルウェアを介してRDFとして見られるかにかかわらず、多様なデータソースわたってクエリを表現することができるRDFデータ用のクエリ言語である。SPARQLは主にグラフ準同型に基づいている。グラフ準同型は、2つのグラフの間のそれらの構造を尊重するマッピングである。より具体的には、隣接する頂点を隣接する頂点に対してマッピングする、2つのグラフの頂点セット間の関数である。
【0032】
SPARQLは、必要とされるグラフパターンおよび任意選択のグラフパターンをそれらの論理積および論理和と共に問い合わせる能力を含む。SPARQLはまた、集約、サブクエリ、否定、式による値の生成、拡張可能な値テスト、およびソースRDFグラフによるクエリの制約もサポートする。これは、SPARQLクエリが、SPARQLにおいて可能な8つの異なるトリプルパターンに対して応答する必要があることを意味する。そのような8つのトリプルパターンは、(S,P,O)、(S,?P,O)、(S,P,?O)、(S,?P,?O)、(?S,P,O)、(?S,?P,O)、(?S,P,?O)、および(?S,?P,?O)を含み、パターンにおいて変数に記号?が先行する。変数は、トリプルパターンの出力であり、SPARQLクエリの出力であり得る。いくつかの例では、変数は、SELECTクエリの出力であり得る。SPARQLクエリの出力は、変数(例えば、合計などのアグリゲータ)を使用して構築され得る。クエリにおける変数は、グラフ準同型(すなわち、クエリの結果を取得するために必要な中間ノード)を構築するために使用され得る。いくつかの例では、クエリにおける変数は、出力にも中間結果にも使用されなくてよい。基本グラフパターン(BGP)は、上述された8つのトリプルパターンのうちの1つであってよい。さらに、BGPは、クエリ変数としてグラフのラベルをさらに有するクワッドパターンであってもよい。本方法がタプルのグループの表現として1つまたは複数の隣接行列をそれぞれ取得する特定の例では、主語と目的語が1つの隣接行列上で問い合わされ得る。言い換えれば、これらの特定の例では、BGPは、(S,O)、(S,?O)、(?S,O)、および(?S,?O)のいずれかであり得る。SPARQLは、いくつかのBGPおよび場合によっては他の演算子の結果を結合することによって、より複雑なクエリを構築し得る。したがって、競争力のあるSPARQLエンジンは、少なくとも、高速なトリプルパターン解法および効率的な結合方法を必要とする。さらに、BGPにおいて結合される中間結果の量を最小化する効率的な実行プランを構築するために、クエリオプティマイザが必要とされる。
【0033】
例では、グラフデータベースが既存のトリプルストアを有する。トリプルストア(RDFストアとも呼ばれる)は、当技術分野で知られているように、セマンティッククエリを介したトリプルの格納および取出しのための専用データベースである。トリプルストアは、少なくとも、上述されたSPARQLの8つの基本トリプルパターンに対して応答することができる。それは、トリプルパターンと共にフィルタリング制約(例えば、「x>5」)にも応答し得る。そのようなトリプルストアは、クエリエンジンによりSPARQLクエリが実行されるストレージエンジンであると考えられる。ストレージエンジン(「データベースエンジン」とも呼ばれる)は、当技術分野で知られるように、データベースからデータの作成(Create)、読取り(Read)、更新(Update)および削除(Delete)(CRUD)をするためにデータベース管理システム(DBMS)が使用する基本的ソフトウェアコンポーネントである。
【0034】
当技術分野で知られているように、グラフデータベースの他に、リレーショナルデータベースが存在する。リレーショナルデータベースは、データのリレーショナルモデルに基づくデータベースである。リレーショナルモデルは、データを、列と行の1つまたは複数のテーブル(または「リレーション」)に編成し、一意のキーが各行を識別する。SQLは、リレーショナルデータベースの事実上標準の言語である。以下では、SQLの様々なバリエーションの中で、SQL-92標準(非特許文献10参照)が意図され、これは、本方法によるクエリエンジンによってサポートされる厳密な最低レベルである。業界の大半はリレーションを取り入れており、表形式のリレーションには暗黙のスキーマがあり、それが、リレーショナルデータベースのテーブルからグラフデータベースのグラフへの移行(または変換)を複雑にしている。
【0035】
より一般的なデータベースの分野では、データベース理論の基礎は一階論理に基づいている。一階論理は、関係計算(ひいてはSQL)を構成するが、再帰はしない。
【0036】
図1に戻ると、ステップS10において、本方法は、クエリエンジンによってクエリを受信するステップであって、クエリは、一階論理パラダイムと互換性のある言語でのクエリである、ステップを含んでいる。本方法は、任意の既知の方法に従ってクエリを受信してよい。「一階論理パラダイムと互換性のある言語」は、一階論理述語を使用してその構文が書き換えられることができる言語を意味する。それ自体知られているように、「一階論理」(一階述語計算または一階関数計算としても知られる)は、各文すなわちステートメントが、特定の要素間の関係を主張する述語に分解される記号化された推論である。例えば、述語は、主語の特性を修正または定義することができる。一階論理の構文は、定数記号のセット、関数記号のセット、および述語記号のセットからなるシグネチャに対して定義される。例では、クエリは、SQL言語またはSPARQL言語でのクエリであり得る。
【0037】
本方法は、次いで、ステップS20において、中間表現(IR)を生成する。データベース管理およびコンピュータ科学の分野で知られているように、IRはクエリに対応する演算子の有向非巡回グラフ(Direct Acyclic Graph:DAG)である。そのような演算子のDAG自体は、クエリのクエリプランに対応する。言い換えれば、演算子DAGは、「演算子」と呼ばれるノードが実行子の基本操作を表す、演算子のグラフである。さらに、「クエリプラン」または「クエリ実行プラン」は、(リレーショナルまたはグラフ)データベース管理システムにおけるデータにアクセスするために使用される一連のステップを意味する。それ自体知られているように、演算子のグラフは、ノード(すなわち頂点)およびエッジを含み、各ノードは演算子のシーケンス内の演算子に対応し、各エッジは、そのエッジによって接続された2つの演算子間のリレーションを定義する。演算子DAGは、単一のルート(すなわち、グラフの始点)および単一のリーフ(すなわち、グラフの終端)を有し得る。単一の葉は、emit演算子である。単一のルートおよび単一のリーフ以外で、演算子のグラフ内の他のノードの各々(すなわち、各演算子)は、先行するノードから入力を受信し、その出力を後続するノードに提供する。以下では、DAGおよびグラフという語は、演算子に適用されたとき、互換的に使用され得る。それ自体知られているように、演算子のそのようなグラフは、クエリエンジンによって生成されて実行可能である。実行は、一般にマルチスレッド化される。言い換えれば、タプルバッファ(すなわち、バッチにグループ化された各演算子によるタプルの形成されたストリームは、次の演算子によって直ちに消費され、または後で実行するためにキューに入れられることがあり、また、対応する演算子を実行する別のアイドルスレッドによって「盗まれる」(すなわち、引き継がれる)こともある。
【0038】
演算子のDAG内の演算子は、クエリ実行の基本要素に対応し、すなわち、各演算子は、タプルバッファ、すなわち、一般にバッファと呼ばれるバッチにグループ化されたタプルのストリームを生成する。次いで、各演算子のバッファは、DAG内の次の演算子によって消費される。演算子実行は、基礎となるトリプルストアの呼出し、RDFターム(RDF Terms)での一般的な計算(すなわち、算術演算、文字列変換など)に対応する。RDFタームは、非特許文献11に提示されている。SQL事前定義データ型については、非特許文献12を参照されたい。
【0039】
中間表現は、上述されたDAGに加えて、IRに含まれるすべての定数値およびインデックスを含む定数テーブルを備え、したがって、IRは、それらを単純な整数によって参照することができる。これにより、計算コストのかかり得るIR DAG自体に何度も値を格納することを回避する。生成されたIRは、一階論理パラダイムと互換性がある。言い換えれば、生成されたIRは、一階論理構文を使用して書き換えられることが可能である。IRの生成は、特に、クエリプランにおける構文解析ステップを含み得る。
【0040】
本方法は、ステップS30において、クエリの中間表現を使用して、データベースのリレーショナルデータおよびグラフデータに対してクエリを実行する。言い換えれば、本方法は、クエリエンジンによってDAGの基本演算子の各々を実行することができる。各基本演算子は、クエリエンジンによって1つまたは複数の呼出しに対して実行され、その結果、一般にバッファと呼ばれるバッチにグループ化されたタプルのストリームを形成することができる。その後、バッファは、DAG内の次の演算子によって消費され得る。
【0041】
例では、(受信された)クエリがSPARQLクエリである場合、生成された中間表現は、SPARQLクエリの一階論理の述語計算に変換され得る。例では、(受信された)クエリがSQLクエリである場合、生成された中間表現は、SQLクエリの一階論理の述語計算に書き込まれ得る(すなわち、変換され得る)。言い換えれば、IRは、一階セマンティックを使用する演算子から直接作られるので、本方法は、受信されたSPARQL/SQLクエリを解析し、次いで、一階論理の演算子を使用してIRを生成することができる。一階構文はSQLとSPARQLの両方の共通する基盤である。
【0042】
例では、データベースのリレーショナルデータは1つまたは複数のテーブルを含んでよく、データベースのグラフデータは、例えば垂直分割による、1つまたは複数の隣接行列を含んでよい。代替的または追加的に、データベースのグラフデータは、隣接行列の形式ではないグラフデータを含むことがある。これは、リレーショナルデータとグラフデータのクエリを統一して、それぞれの部分(すなわち、リレーショナルおよびグラフ)データベースをネイティブな形式で扱うことを可能にするという、改良された解決策を構成する。言い換えれば、本方法は、生成されたIRを使用して、任意の変換やエミュレーションを使用することなく、(例えば、テーブルの形式の)リレーショナルデータおよび(隣接行列またはグラフの形式の)グラフデータに対してクエリを実行することができる。
【0043】
例では、(受信された)クエリは、第1のSQLクエリであってよく、クエリの中間表現を使用してデータベースのグラフデータに対してクエリを実行するステップは、データベースのグラフデータに対してSPARQL SELECTクエリを実行して、それにより、タプルを出力するステップを含むことができる。次いで、本方法は、実行されたクエリのマテリアライズドビューを作成し、作成されたマテリアライズドビューに対して第1のSQLクエリを実行することができる。これは、グラフデータベース上でSQLクエリを高速かつ効率的に処理することができる改良された方法を構成する。言い換えれば、本方法は、データベース上のSPARQLクエリの結果からマテリアライズドビューのテーブルを形成する。例では、マテリアライズドビューを作成するステップは、テーブルを作成するステップを含み、テーブルの行は、(出力された)タプルに関連付けられ、テーブルの列は、クエリのそれぞれの変数に関連付けられる。
【0044】
上記の例による方法は、第2のSQLクエリを受信するステップをさらに含んでよく、第2のSQLクエリの実行は、第1のSQLクエリの作成されたマテリアライズドビューに基づく。それにより、本方法は、いくつかのSQLクエリの作成されたマテリアライズドビューを使用することができる。これは、特にユーザとデータベースとの間のリアルタイムの対話が保証されるべきときに、クエリエンジンの性能を改善する。このような改善は、大規模データベースとのそのような対話を処理する際に特に重要である。そのような対話の使用事例については後で論じられる。
【0045】
本方法で受信されたSQLクエリがSPARQL SELECTクエリ用に開発されたIRによってどのように実行され得るかを提示するために、SQLのSELECT文の例がここで説明される。これは、共通のIRがSQLクエリとSPARQLクエリの両方を実行し得ることを意味する。知られているように、select文の論理的処理順序は、FROM、ON、JOIN、WHERE、GROUP BY、HAVING、SELECT(クエリのselect変数リスト句を適用する)、DISTINCT、ORDER BYである。
【0046】
例では、受信されたクエリは、SPARQLまたはSQLにおいて少なくとも1つのJOIN句を有することができる。そのような例では、生成された中間表現は、以下の型のバッカス-ナウア記法(BNF)文法で記述され得る:
<joined table> ::=
<cross join>
| <qualified join>
| <left paren> <joined table> <right paren>
<cross join> ::=
<table reference> CROSS JOIN <table reference>
<qualified join> ::=
<table reference> [ NATURAL ] [ <join type> ] JOIN <table reference>
[ <join specification> ]
<join type> ::=
INNER
| <outer join type> [ OUTER ]
| UNION
<outer join type> ::= LEFT | RIGHT | FULL
<join specification> ::= <join condition> | <named columns join>
<join condition> ::= ON <search condition>
<named columns join> ::= USING <left paren> <join column list> <right paren>
<join column list> ::= <column name list>
【0047】
例では、受信されたクエリは、SPARQLまたはSQLにおいてFROM句を有することができる。そのような例では、生成された中間表現は、以下の型のBNF文法で記述される:
<from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]
<table reference> ::=
<table name> [ <correlation specification> ]
| <derived table> <correlation specification>
| <joined table>
【0048】
例では、FROM句は、AS句を含むことができ、生成された中間表現は、以下の型のBNF文法で記述され得る:
<correlation specification> ::=
[ AS ] <correlation name> [ <left paren> <derived column list> <right paren>]
<derived column list> ::= <column name list>
【0049】
さらに例では、受信されたクエリは、SPARQLまたはSQLにおいてWHERE句を有することができ、生成された中間表現は、以下の型のBNF文法で記述され得る:
<where clause> ::= WHERE <search condition>
<search condition> ::=
<boolean term>
| <search condition> OR <boolean term>
<boolean term> ::=
<boolean factor>
| <boolean term> AND <boolean factor>
<boolean factor> ::= [ NOT ] <boolean test>
<boolean test> ::= <boolean primary> [ IS [ NOT ] <truth value> ]
<boolean primary> ::= <predicate> | <left paren> <search condition> <right paren>
<predicate> ::=
<comparison predicate>
| <between predicate>
| <in predicate>
| <like predicate>
| <null predicate>
| <quantified comparison predicate>
| <exists predicate>
| <match predicate>
| <overlaps predicate>
【0050】
「生成された中間表現は、バッカス-ナウア記法(BNF)文法で記述される」は、SQLクエリに対して、IRが、(SQL文法である)BNF文法から本方法によって生成され得ることを意味する。しかしながら、本方法によって生成されたIRは、上述されたように、SQLとSPARQLと間の共通の一階論理であり、したがって、いったん生成されると、SQLクエリまたはSPARQLクエリのいずれも実行することが可能である。
【0051】
例では、生成された中間表現は、少なくとも入力(input)を有する少なくとも1つの第1のFIND演算子を含むことができる。そのような例では、本方法は、第1のfind演算子を第2のfind演算子に置き換えることによって、生成された中間表現を更新するステップをさらに含むことができる。第2のfind演算子は、上記入力がヌルのときに未定義値を返すように構成され得る。FIND演算子に対する入力が、FIND演算子の出力に対するフィルタ(すなわち条件)を形成することができる。これは、SQLとSPARQLの規格の統一を改善する。より詳細に後述されるように、SQLにおける値はヌルになり得るが、SPARQLクエリの場合はそうではない。SPARQLクエリとSQLクエリについてIRを統一するために、本方法はNOT NULL制約を必要とし、NULL(ヌル)と出力が存在しないこととの両方をUNDEF(未定義)として扱うか、または該当する入力がUNDEFである場合にUNDEFを出力するように入力を有するFIND演算子を修正する。
【0052】
本方法は、コンピュータに実装される。これは、本方法のステップ(または実質的にすべてのステップ)が、少なくとも1つのコンピュータまたは任意の同様のシステムによって実行されることを意味する。したがって、本方法のステップは、コンピュータによって、場合によっては完全に自動的に、または半自動的に実行される。例では、本方法の少なくともいくつかのステップのトリガは、ユーザとコンピュータの対話を通じて実行され得る。必要とされるユーザとコンピュータの対話のレベルは、予測される自動化のレベルに依存し、ユーザの希望を実装する必要性とバランスがとられてよい。例では、このレベルはユーザ定義および/または事前定義され得る。
【0053】
方法のコンピュータ実装の典型的な例は、この目的に適合されたシステムで方法を実行することである。システムは、メモリおよびグラフィカルユーザインターフェース(GUI)に結合されたプロセッサを備えることができ、メモリは、本方法を実行するための命令を含むコンピュータプログラムを記録している。メモリはデータベースを格納することもできる。メモリは、そのような格納に適合された任意のハードウェアであり、場合によっては、いくつかの物理的に異なる部品(例えば、プログラム用に1つ、および場合によってはデータベース用に1つ)を備える。
【0054】
図2は、システムの例を示し、システムは、クライアントコンピュータシステム、例えば、ユーザのワークステーションである。
【0055】
この例のクライアントコンピュータは、内部通信バス1000に接続された中央処理装置(CPU)1010、さらにバスに接続されたランダムアクセスメモリ(RAM)1070を含む。さらに、クライアントコンピュータは、バスに接続されたビデオランダムアクセスメモリ1100に関連付けられたグラフィック処理装置(GPU)1110が設けられている。ビデオRAM1100は、当技術分野でフレームバッファとしても知られている。マスストレージデバイスコントローラ1020は、例えばハードドライブ1030などのマスメモリデバイスへのアクセスを管理する。コンピュータプログラム命令およびデータを有形に具現化するのに適したマスメモリデバイスは、すべての形態の不揮発性メモリを含み、例として、EPROM、EEPROM、およびフラッシュメモリデバイスなどの半導体メモリデバイス、内蔵ハードディスクおよび取外し可能ディスクなどの磁気ディスク、ならびに光磁気ディスクを含む。上記のいずれも、特別に設計されたASIC(特定用途向け集積回路)に補完され、または組み込まれ得る。ネットワークアダプタ1050は、ネットワーク1060へのアクセスを管理する。クライアントコンピュータは、カーソル制御デバイスまたはキーボードなどのハプティックデバイス1090を含むこともできる。カーソル制御デバイスは、クライアントコンピュータにおいて、ユーザがディスプレイ1080上の任意の所望の位置にカーソルを選択的に配置できるように使用される。加えて、カーソル制御デバイスは、ユーザが様々なコマンドを選択し制御信号を入力することを可能にする。カーソル制御デバイスは、システムに制御信号を入力するためのいくつかの信号生成デバイスを含む。典型的には、カーソル制御デバイスはマウスであり、マウスのボタンが、信号を生成するために使用されることがある。代替的または追加的に、クライアントコンピュータシステムは、センシティブパッドおよび/またはセンシティブスクリーンを備えることができる。
【0056】
コンピュータプログラムは、コンピュータによって実行可能な命令を含むことができ、命令は、上記システムに方法を実行させるための手段を含む。プログラムは、システムのメモリを含む任意のデータ記憶媒体に記録可能であり得る。プログラムは、例えば、デジタル電子回路、もしくはコンピュータハードウェア、ファームウェア、ソフトウェア、またはそれらの組み合わせに実装され得る。プログラムは、装置として、例えば、プログラマブルプロセッサによる実行のために機械可読ストレージデバイスに有形に具現化された製品として実装され得る。方法ステップは、入力データを操作して出力を生成することによって方法の機能を実行する命令のプログラムをプログラマブルプロセッサが実行することによって実行され得る。したがって、プロセッサは、データストレージシステム、少なくとも1つの入力デバイス、および少なくとも1つの出力デバイスからデータおよび命令を受信し、またそれらにデータおよび命令を送信するように、プログラム可能に結合され得る。アプリケーションプログラムは、高水準手続きプログラミング言語もしくはオブジェクト指向プログラミング言語で、または必要に応じてアセンブリ言語もしくは機械言語で実装され得る。いずれの場合も、言語はコンパイル言語またはインタプリタ言語であり得る。プログラムは、完全インストールプログラムまたは更新プログラムであり得る。いずれの場合も、システムへのプログラムの適用が、本方法を実行するための命令をもたらす。あるいは、コンピュータプログラムは、クラウドコンピューティング環境のサーバに格納され実行されてもよく、サーバは、1つまたは複数のクライアントとネットワークを介して通信する。そのような場合、処理ユニットは、プログラムに含まれる命令を実行し、それにより、クラウドコンピューティング環境上で本方法が実行されるようにする。
【0057】
ここで、本方法の上述された例の実装が論じられる。
【0058】
実装は、同じデータベース内のリレーショナルデータとグラフデータを問い合わせる方法に関係付けられる。それにより、実装は、1つのデータベースから構造化データ(例えば、リレーショナル)と非構造化データ(例えば、グラフ)を問い合わせる必要性に応える。特に、実装は、先行技術におけるそれらの一般的な技術的課題、すなわち、データ変換コスト、クエリ実行時間オーバーヘッド、変換されたクエリの高い複雑性、および非構造化データに対するサポートの欠如に関する、ポリグロット(polyglot)データベースのための解決策に関係付けられる。言い換えれば、実装は、構造化データと非構造化データの両方のサポートを提供しながら、データ変換やエミュレーションなしに、単一のクエリエンジン内でグラフデータとリレーショナルデータの両方を問い合わせることを可能にする。実装は、特に、読取りクエリ、例えば、SELECTクエリに関係付けられ得る。
【0059】
実装によれば、データベースは、(例えば、隣接行列の形式の)非構造化データおよび(例えば、テーブルの形式の)構造化データのためのデータ構造を備える。
【0060】
これらのパラダイムの両方が、一階論理(非特許文献13参照)に基づいている。したがって、SQLクエリおよびSPARQLクエリは、両方のパラダイムで意味を有する中間表現を使用して、一階論理の述語計算に変換される。
【0061】
リレーショナルデータとグラフデータの両方は、それらのネイティブデータ構造を使用して(変換やエミュレーションなしで)表される。クエリエンジンは、両方のパラダイムで理解可能な中間表現を使用して統一され、それにより、SQLからSPARQL(またはその逆)の複雑なクエリ変換やエミュレーションを回避する。
【0062】
詳細には後述されるように、SPARQLと否定を伴う非再帰的で安全なDatalogとは、同等の表現力を有し、したがって、古典的な結果により、SPARQLは表現力の観点から関係代数と同等である。リレーショナルモデル(RM)は、すべてのデータがタプルで表現されリレーションにグループ化される一階述語論理と一致する構造および言語を使用してデータを管理する手法として定義され得る。リレーショナルモデルの観点から編成されたデータベースが、リレーショナルデータベースである。リレーショナルモデルの目的は、データおよびクエリを指定するための宣言的な方法を提供することである。言い換えれば、データベースがどんな情報を含み、ユーザがどんな情報をそれから欲しているかを、ユーザが直接宣言する場である(非特許文献14参照)。知られているように、Datalogは宣言型論理プログラミング言語であり、構文的にはPrologのサブセットである。それは、演繹データベース用のクエリ言語としてよく使用される。有限集合上のDatalogクエリは、終了することが保証されている。Datalogによるクエリ評価は一階論理に基づいており、したがって、健全で完全である。
【0063】
SQLとSPARQLが両方とも宣言型言語であることは、それらを同じ論理表現に変換するのに役立つ。リレーショナルモデルが構築される一階述語論理(非特許文献13参照)は、以下の通りである。
【0064】
一階論理は、非論理オブジェクトに対して量化された変数を使用し、変数を含む文の使用を可能にし、したがって、「ソクラテスは人間である」のような命題ではなく、「xはソクラテスでありxは人間であるようなxが存在する」という形式の表現が可能であり、「存在する(there exists)」は量化子であり、xは変数である。言い換えれば、SQLクエリを、タプルの集合(この集合内の所与のキーによってインデックス付けされる)において述語論理(すなわち「存在する」という量化子)を使用する宣言的方法としてみることができる。この量化子は次のように定義できる:
リレーションRにおいて属性Aに対して値Vを有するキーKによってインデックス付けされたタプルが存在する(There Exists)。
【0065】
(上記の「ソクラテス」定義に見られるように)キー、値、および属性はすべて変数とすることができることに留意されたい。
【0066】
集合論(SQL)からグラフ理論(SPARQL)に切り替えると、SPARQLの基本グラフパターン(非特許文献15参照)に沿って以下を描くことができる:
グラフGにおいて述語Pについての目的語Oを有する主語Sのトリプルが存在する(There Exists)。
【0067】
主語、述語、および目的語はすべて変数にも(さらにグラフにも)なり得る。この量化子は、実装によるクエリエンジンの基礎となる。この量化は、以下では、等価的にFindと呼ばれる。したがって、上記の文は、次のようになる:
グラフGにおいて述語Pについての目的語Oを有する主語SのトリプルをFindする。
【0068】
SQLの場合:
リレーションRにおいて属性Aについての値Vを有するキーKによってインデックス付けされたタプルをFindする、
またはSQLにおいてより一般的に使用されている用語を使用する:
テーブルTにおいて列Aについての値Vを有する主キーKによってインデックス付けされた行をFindする。
【0069】
このFind量化子は、クエリの抽象基本木(AST)から生成された中間表現(IR)の基本演算子でもある。一階述語論理の「存在する」量化子と並列に描くことにより、それは、リレーショナルモデルとグラフモデルの両方の共通する基礎となっている。これにより、実装は、同じクエリエンジンでリレーショナルデータとグラフデータの両方に問い合わせることができるようになる。
【0070】
特に、実装は(非特許文献16におけるような)「SPARQLからSQL」または「SQLからSPARQL」の変換を行うのではなく、IRによって実装された共通表現で両者の表現をする。
【0071】
リレーショナルデータはテーブルとして表現され、グラフデータは隣接行列として表現される。それらは、両方とも一級市民であり、同じ辞書符号化で圧縮され得る。同じデータベース内にあるとき、SPARQLクエリの結果からテーブルが作成された場合、隣接行列のグラフデータの修正は、表データへ容易に伝搬され得る。
【0072】
エミュレーションがなく、実装はグラフデータベース内にテーブルを作成し問い合わせることができ、それはグラフクエリに使用されるのと同じクエリエンジンを使用する。結果として、良好な性能でグラフデータと表データを結合するクエリを行うことが可能である。当技術分野で議論されている方法とは対照的に、表データは外部データから毎回フェッチされてはならず、データベース内の最適化(例えば、辞書符号化)およびデータの鮮度の利益を得ることができる。
【0073】
実装は、コードの重複を伴うグラフと表データのための統一されたクエリエンジンに関する解決策を提供し、例えば、(ハッシュテーブルがデータベースからの組み込みであることを除いて、ハッシュ結合(非特許文献17参照)と同じ精神の)辞書符号化からもたらされるインデックスに基づく結合のような可能な最適化を有する。これらの解決策は、表データがエミュレートされず、ページネーションに使用されるときの制限が伴わないので、さらに有利である。さらに、実施例による表データはグラフデータに変換も複製もされず、これは、例えばマッピング変換を伴う解決策と比較して、使用されるストレージが少ないことを示唆する。実装は、グラフクエリ結果からマテリアライズドビューを作成することも可能にし、結果として、それがグラフデータベース内で問い合わせされ得る。
【0074】
データベース内の論理
次に、実装の理論的側面について論じられる。
【0075】
それ自体知られているように(例えば、参照により本明細書に組み込まれる非特許文献18および/または非特許文献19)、関係代数と否定を伴う非再帰的で安全なDatalogとは、同じ表現力を有する(すなわち、それらはクエリの全く同じセットを表現する)。AnglesおよびGutierrezの非特許文献19がさらに示すように、以下の定理の形式でSPARQLも同じ表現力を有する:
定理.SPARQLは、バッグセマンティクス(bag semantics)のもとで関係代数と同じ表現力を有する。
【0076】
上で引用された定理の証明は、関係代数と否定を伴う非再帰的で安全Datalogとが同じ表現力を有するという事実に基づいている。「バッグ」は、マルチセット、すなわち、スキーマに応じて同じタプルの複数のコピーを潜在的に含むセットを意味する(例えば、非特許文献20参照)。
【0077】
実装は、特に、一階論理、または、言い換えれば、否定を伴う非再帰的で安全なDatalogが、SPARQLとSQLの両方の基礎となる理論的根拠であるという事実を利用している。それにより、実装は、一階論理でクエリの実行を表現することにより、SPARQLとSQLの両方に対処する。
【0078】
(RDFの意味でなく一階論理の意味で)基本述語は、SQL言語とSPARQL言語の両方で、IRのFind演算子と等価な存在識別子(すなわち、∃)である。言い換えれば、SPARQLの場合、それは次のようになる:
グラフGにおいて述語Pについての目的語Oを有する主語SのトリプルをFindする。
【0079】
SPARQLにおけるFind基本述語は、上述されたように基本グラフパターン(非特許文献21参照)と呼ばれる。他方で、SQLの場合、それは次のようになる:
テーブルTにおいて列Aについての値Vを有する主キーKによってインデックス付けされた行をFindする。
【0080】
SQLにおけるFind基本述語は、射影(非特許文献22参照)と呼ばれる。
【0081】
RDFにはスキーマがないため、実装によるクエリエンジンはデータ形式に対して非常に柔軟である。上述された「Find」演算子は、そのようなクエリエンジンでデータをフェッチするための基本単位である。「Find」演算子があれば、実行の残りは、演算子のグラフの論理処理である。
【0082】
上述されたようにSPARQLとSQLは同じ表現力を有するので、共通の論理処理を有している。詳細には後述されるように、実装は、SPARQL用に開発されたクエリエンジンIRを使用して、SPARQLクエリと同様にSQLクエリも実行することができる。
【0083】
次に、SQLに関する実装の態様について論じられる。
【0084】
実装は、少なくともSQL-92標準(非特許文献10参照)をサポートするクエリエンジンが採用され得る。すべてのSQLクエリエンジンが最新の標準(最新は2016年)例えば、非特許文献23)をサポートしているわけではないので、この低い要件により、実装はより広い適用範囲を有することになる。
【0085】
SQLとSPARQLの違いの1つは、SQLにはスキーマ(すなわち、暗黙のスキーム(implicit schemes))があることである。「暗黙のスキーマ(implicit schema)」は、主にワイルドカード*の使用により、スキーマがクエリにおいて暗黙であることを意味する。言い換えれば、テーブルのすべての列を取得することおよび他の同様の要求は、これらのメタデータをデータベース内に保持することによって応答される。
【0086】
さらに、SQLにおける値はヌルとなり得る。SQLでのヌル値は、実際の値とみなされない。これは、C1を主キーとする以下の表1では、次の質問:
テーブルT0において列C2についての値Vを有する主キー20によってインデックス付けされた行をFindする
に対する答えは、ヌルであり、一方、次の質問:
テーブルT0において列C2についての値Vを有する主キー42によってインデックス付けされた行をFindする
に対する答えは存在しないことを意味する。
【0087】
【表1】
【0088】
しかしながら、両方の質問に対して、クエリエンジンとストレージの間のプロトコルでは、非特許文献24に定義されるように、答えはUNDEF(「変数は値を有しない」ことを意味し、「境界のない値」とも定義される)である。このアプローチは、ストレージがすべてのヌル値を実体化しないようにすること、列間のヌル値に対するJOIN演算子を許可しないようにすること、および外部結合でヌル値を追加するためにIRノードを追加する必要性をなくすことに役立つ。これはまた、既に引用された非特許文献19における、SPARQLと関係代数の表現力が同じであることを保証するための選択と一致する。
【0089】
実装によれば、IRはヌル伝搬を管理し、つまり、変数が「ヌル」であるという事実は、IRによって演算子のすべてのDAGに伝搬される。
【0090】
実装はさらに、SQLパーサおよびSQL抽象構文木(AST)をクエリエンジンに組み込んでいる。これは、当技術分野で知られている方法(例えば、非特許文献25)に従って行われてよい。
【0091】
次に、IRとその表記法を提示するために表2に関して例が考察される:
【0092】
【表2】
【0093】
ごく基本的なSQL文は、テーブルからすべての行をフェッチしてユーザに返すクエリである。言い換えれば、次のようになる:
SELECT *
FROM T1
このクエリは、単純にテーブルT1からすべての行をフェッチする。クエリエンジンは、T1テーブルのすべての列名をストレージに要求することで開始し、{C1,C2}を入手する。また、ここではC1である主キーに対応する列も要求する。SELECT句とFROM句については後述される。
【0094】
SQL文を論理IRに変換するために、実装は上述された量化子を次のように使用する:
テーブルTにおいて属性についての値Vを有する主キーKによってインデックス付けされた行をFindする。
【0095】
図3は、IR表記法を使用するSQLクエリを提示する。図3は、実行それ自体を説明しているのではなく、IR、すなわち実行される演算子の流れを説明している。(Op#1)は、IR演算子および参照事項のための任意選択の識別子である。言い換えれば、それは実行のいかなる順序も意味しない。ワイルドカード*は、演算子によって生成された変数を表し、それらの名前は出力(output)[i0,i1]で与えられ、これはSELECT句の変数ではなく、列インデックスである。この表記法において、列インデックスは、iプレフィックスで提示され、vは値を参照するために使用される。この表記法において、クエリの定数(すなわち、変数/列インデックスではない)は、リテラルでは引用符(「...」)の間にあり、それ以外では<...>の間にある。
【0096】
図4は、列C2の値をフェッチするのに必要とされる演算子を提示する。演算子(Op#2)は、行の主キーを表す変数i0を入力(input)として取り、所与の行のすべての値を一緒にグループ化するために必要とされる。このステップまでは、インデックスのみが使用されている。
【0097】
図5は、実際の値を取得し、それを出力(emit)して結果のレコードを作成することを提示する。これで実行のフローを完了させる。
【0098】
実装は、以下に従って実行のフローを実行する。演算子(Op#1)は、入力がなく、表3に従って2つの行についての列C1におけるキーおよび値を出力する。
【0099】
【表3】
【0100】
この例では、整数のみが存在するため、インデックスを値として考えることができる。次に、演算子(Op#2)が{i0,i1}を入力とし、C2の対応する値をfindするために入力列i0を主キーとして使用する。その出力は、i2と呼ばれる結果列に追加されたC2の値である。以降のステップでは、i0は不要となり、実装はそれを保持しない。出力は表4に従う。
【0101】
【表4】
【0102】
(Op#3)GetValueの役割は、インデックスを値に変換することである。この例では、インデックスは値と同じとみなされるので、GetValueはno-opである。最後の演算子(Op#4)は、レコードを作成して呼出し元のアプリケーションコードに渡すポストプロセッサに、値を出力するものである。
【0103】
図6は、図5に提示されたIRの別バージョンを、簡略化された表記法を使用して提示する。この簡略化された表記法は以下で使用される。
【0104】
ヌル値でFindする
上記のようにすべての行がNOT NULL制約で作成されなくてよい例において、いずれのFindもundef値(未定義値)を生成することができる。Findは入力としてundefを有することができないので、実装は、入力を有する任意のFindを、if undef条件を有するオプションのFindで置き換える。言い換えれば、オプションのFindは、値が見つけ出されない場合(すなわち、ヌルとundefが等しいとみなされるため、ヌルの場合)を管理し、if undef条件は、undef入力をフィルタリングする。
【0105】
例えば、図7はIRグラフを示す。実装は、図7のIRグラフを図8の対応するもので置き換える。言い換えれば、これらの実装によるIRは、Find演算子への入力がundefの場合、undefを出力するように置き換えられる。図8の「FindOptional」演算子は、「Find」演算子と同じであり得る。
【0106】
図9A図9Bは、演算子のDAGを最適化する新しいノード「FindIfDef」をIRに導入することによるIRグラフの単純化を示す。そのような演算子の最適化されたDAGは、IR内のノードがより少なくなり得る。したがって、使用される列がNOT NULL制約で作成されない場合、実装は、入力を有する任意の「Find」演算子をFindIfDefで置き換えることができる。以下では、そのような「Find」演算子の各々が「FindIfDef」としても解釈されるべきである。これは、IRグラフのセマンティックを変更しない。さらに、「i0 is undef」は、IRにおける「FilterBound」と呼ばれる演算子である。
【0107】
SQL文:クエリ仕様
以下では、SQLのクエリ仕様(すなわち、SELECT文)に関係付けられた実装の例について論じられる。そのような例は、SQL文からIRへの変換を詳細に示す。select文の論理的処理順序は、FROM、ON、JOIN、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BYである(非特許文献26参照)。この順序が、1つのステップで定義されたオブジェクトが、後続のステップの句にいつ利用可能になるかを決定する。
【0108】
例は、非特許文献27の標準におけるBNF表現形式に基づいて提示されている。SELECTクエリは、この標準に従って次のように記述され得る:
<query specification> ::=
SELECT [ <set quantifier> ] <select list> <table expression>
FROM:テーブル式
テーブル式は、ベーステーブル(すなわち、データベースに物理的に格納されているもの)、マテリアライズドビュー(SQLでは、より一般的に「ビュー」と呼ばれる)、または他の句(例えば、join)からの出力として与えられる仮想テーブルのいずれかである。
【0109】
BNF文法におけるテーブル式は、以下の通りである:
<table expression> ::=
<from clause>
[ <where clause> ]
[ <group by clause> ]
[ <having clause> ]
FROM句は、この式では常に必要とされる。
【0110】
上述の順序の最初の6つの文すべて(すなわち、FROM、ON、JOIN、WHERE、GROUP BY、HAVING)と同様に、上記式における各句は、入力を受け取り、出力を生成する演算子として機能する(それ自体知られており、例えば、非特許文献28を参照されたい)。各句は仮想テーブルを生成し、FROM句の入力は1つまたは複数のテーブル(例えば、ベーステーブルまたはビュー)である。このテーブル参照は、JOIN式(後述される)、テーブル名、括弧内のテーブル式のいずれかである。
【0111】
テーブル参照がテーブル名である場合、テーブル参照は任意選択でAS句も含むことがある。テーブル参照がテーブル名である場合、テーブル参照はAS句を含まなければならない。例えば、FROM T AS MYTABLEの場合、BNFは以下の通りである:
<from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]
<table reference> ::=
<table name> [ <correlation specification> ]
| <derived table> <correlation specification>
| <joined table>
<correlation specification> ::=
[ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]
<derived column list> ::= <column name list>
【0112】
上記の式では、AS句は構文糖衣(すなわち、構文的に任意選択)であり、省略されてよい。このAS句は範囲変数を導入している。標準では相関名を使用するが、範囲変数はオーソドックスな用語であり、論理の意味で変数を意味する。論理の意味とは、通常のプログラミング言語の意味ではないということであり、その範囲は、いくらかのリレーションにおけるタプルのセット(SQL用語では、いくらかのテーブルの行のセット)に及ぶ。この範囲変数は、上の例のように暗黙的に宣言されることが可能であり、その範囲は、テーブルのすべての行にわたる。この変数のスコープは、IRにおいて変数決定性を定義するために重要である。決定的変数は、後でクエリによりトリプルパターンによって読み込まれる変数である。この変数のスコープは次のように定義される:テーブル参照がFROM句オペランドを表す場合、スコープはそのFROM句を直ちに含む選択式(すなわち、SELECT句、FROM句自体、もしあればWHERE句、もしあればGROUP BY句、もしあればHAVING句)であるが、別の範囲変数が同じ名前で導入される元の選択式内のいずれかにネストされる任意の選択式または結合式を除外する。
【0113】
したがって、実装はスコープを計算してIR変数決定性を決定し(すなわち、IRのどの変数が決定的であるかを決定し)、SPARQLのようにストレージから既存のテーブルに従ってテーブル名をフィルタリングする。
【0114】
FROM句の上記のBNF文法:
<table reference> ::=
<table name> [ <correlation specification> ]
| <derived table> <correlation specification>
| <joined table>
においては、単純なテーブル名の後に派生されたテーブルおよび結合されたテーブルが来る。結合されたテーブルの例については後述される。
【0115】
JOIN,ON式
実装は、マテリアライズドビュー上でクエリを実行するために結合を必要としない。これは後述される使用事例でも同じで、ページネーションはSPARQLクエリの結果によって作成されたビューだけを有する。
【0116】
それ自体知られているように、結合テーブル式は、2つのテーブル間のある種の明示的な結合を表し、その各々はテーブル参照によって表される(非特許文献29参照)。より正確には、結合式はクロス結合か、明示的または暗黙的なjoin型を含む結合のいずれかである。
【0117】
これは、以下の文法に対応する:
<joined table> ::=
<cross join>
| <qualified join>
| <left paren> <joined table> <right paren>
<cross join> ::=
<table reference> CROSS JOIN <table reference>
<qualified join> ::=
<table reference> [ NATURAL ] [ <join type> ] JOIN <table reference>
[ <join specification> ]
<join type> ::=
INNER
| <outer join type> [ OUTER ]
| UNION
<outer join type> ::= LEFT | RIGHT | FULL
<join specification> ::= <join condition> | <named columns join>
<join condition> ::= ON <search condition>
<named columns join> ::= USING <left paren> <join column list> <right paren>
<join column list> ::= <column name list>
【0118】
Cross join
第1の最も単純な結合はクロス結合で、これは単にデカルト積の別名である。A CROSS JOIN Bという式は、abがAからの行aとBからの行bの連結であるように、すべての可能な行abから構成されるテーブルを評価する。それは意味論的に以下に等しい。
【0119】
SELECT *
FROM A,B
Cross Joinアルゴリズムは、両方のテーブルのすべての行を受け取り、デカルト積を行い、または言い換えれば、両方のリレーションのすべてのタプルを受け取り、デカルト積を行う。前述されたFind演算子を使用して、次のように言い換えられ得る:
テーブルごとに、テーブルの各列について、すべての行をfindして、各テーブルの出力のデカルト積を行う必要がある。
【0120】
図10は、列{C11,...,C1n}および{C21,...,C2n}を有するテーブルT1およびT2について、IR規約を使用する例を提示する。
【0121】
上述されたようにIR実行はマルチスレッド化され得るので、実装は、Synchronize(同期化)演算子およびBufferize(バッファ化)演算子を使用することがある。Synchronize Cartesian演算子は、他のすべてのスレッドが終了するまで待ってから、それらの出力をデカルトマネージャ(cartesian manager)にマージする。他のすべてのスレッドはそれらの結果をバッファリングし、したがって、Bufferize演算子である。ここで、CreateBuffer演算子は、BufferizeとSynchronize間の同期が行われるフラグf0を宣言する。これら3つの演算子は、SPARQL OPTIONALパターンについてのSynchronizeおよびBufferizeのより複雑なバージョンであり、実装はIRにこれら3つを追加する必要があり得る。CreateBufferにより作成されたフラグは、SPARQLのOPTIONALによって使用されるものとは少し意味が異なる。実装では、synchronize Cartesianステップを行う前にすべての結果をバッファリングすることを意味する。
【0122】
IRにおいてBufferize演算子を使用することは、Bufferizeが中間仮想テーブルを作成するので、すべての中間結果を仮想テーブルとして表現するというSQL哲学と一貫している。実装は、この演算子を効率的に実装することができる。
【0123】
実装は、デカルト積に必要とされる両方のテーブルのすべての中間結果メモリをメモリに保持しない可能性がある。IRの実行がマルチスレッド化されると、実装は、結果の2つのストリーム間の同期メカニズムを使用し得る。実装のバリエーションでは、例えば次のようなデカルト積に似たSPARQLクエリがあり得る:
SELECT ?a ?b
WHERE {
<x> <p> ?a .
<y> <q> ?b
}
【0124】
実装の別のバリエーション(コンピュータ科学の分野でのいわゆるVolcano(モデル)実装であり、例えば、非特許文献30を参照)は、1番目の入力ごとに第2のパターンを再実行する。さらに、IRに基づくベクトル化実装は、入力バッファによって第2のパターン(Find演算子に対応する)を1回実行することにより、そのような実装を最適化する。
【0125】
これら2つのバリエーションでは、デカルト積に必要とされる中間結果はメモリに保持されないが、代償として第2の演算子が多数回実行される。2つのアルゴリズムは、CPU、メモリ、および同期の間の通常のトレードオフを伴って可能である。言い換えれば、Volcano実装では、メモリおよび同期はより少なくてすむが、CPUコストはより高くなる。一方、ベクトル化された実装は、より少ないCPUコストでより多くのメモリを必要とするとともに、追加の同期化作業を必要とする。
【0126】
Natural join
文法における次の結合は自然結合(natural join)であり、これは2つのテーブルにおいて同じ名前を共有するすべての列に基づく。C1が両者の主キーである2つのテーブルT1(以下の表5に示される第1および第2の列)およびT2(以下の表5に示される第3および第4の列)を考えると、次の操作の結果:
SELECT *
FROM T1 NATURAL JOIN T2
は、以下の表6に従う。
【0127】
【表5】
【0128】
【表6】
【0129】
言い換えれば、実装に従う自然結合は、すべての共通の列に基づいて一致する行を出力するが、同じ名前の列は一度しか現れない。
【0130】
実装は、両方のテーブルのすべての列名を事前にフェッチし、交差を計算することによって、それをIRに変換することができる。次いで、実装は、T1の共通列のすべての行をフェッチし、共通列上のT2の行と交差させ、選択された行で残りの列の値をフェッチする。
【0131】
図11は、実装による、Find演算子を使用する上記例のIRを提示する。Op#1は、以下の表7に従って、列C1についてのすべての主キーおよびT1の値をフェッチする。
【0132】
【表7】
【0133】
次に、Op#2において、実装は、テーブルT1のものと同じ値を有する列C1について、T2の主キーを取得するステップを実行する。そこで結合が起きる。そのような操作の結果が以下の表8に提示される。
【0134】
【表8】
【0135】
Op#3では、以下の表9に提示されるように、実装は、Op#1(i1)で見つけ出されたT1の主キーを使用して、T1における列C2の値を取得する。
【0136】
【表9】
【0137】
次いで、実装は、以下の表10に提示されるように、Op#2(i3)の主キーを使用してT2のC4の値を取得する。
【0138】
【表10】
【0139】
実装では主キーが必要なくなったため、それぞれの列は出力に破棄された。リテラル「BB」がそのインデックス(42)に置き換えられていることに留意されたい。最後に、実装は値を抽出する。抽出された値は、以下の表11に提示される。
【0140】
【表11】
【0141】
上図では、共通列:{C1}のリスト、ならびにT1:{C2}およびT2:{C4}の残りの列のリストを計算するためのストレージに対する要求を示していないことに留意されたい。これは、ストレージエンジンAPIに追加される必要があるスキーマプロトコルに基づいている。このスキーマプロトコルはSQLに特有であり、そのようなスキーマがSQLクエリにおいて暗黙的であるため、必要とされる。
【0142】
他の例では、実装は自然結合を採用して、他の結合型のいくつかであるinner、outer、およびunionを修飾することができる。
【0143】
条件結合
実装は、自然結合のように暗黙的に結合を行う代わりに、ON句を使用してテーブルの結合が適用される列を指定することができる。
【0144】
SELECT *
FROM T1 JOIN T2
ON T1.C1 = T2.C3
ONの代わりに、USINGは同じ目的を有する構文糖衣である:
SELECT *
FROM T1 JOIN T2
USING (C1,C2)
説明された両方の場合とも、自然結合アルゴリズムの適応である。後述されるようにWHERE句が指定されることも可能である。
【0145】
これまで説明された結合操作は、内部結合としても知られている。inner joinというキーワードは、構文糖衣として前の例の結合を置き換えることができる。
【0146】
Outer join
内部結合とは対照的に、外部結合(outer join)オペレーションは、使用されるキーワードであるleft、right、またはfullに応じて、片方または両方のテーブルから一致されない行を保持する。言い換えれば、内部結合は特定の検索条件が満たされない任意の行を除外するのに対し、外部結合は一致されないデータの一部またはすべてを保持する。表5のT1およびT2の例を考えると、
SELECT *
FROM T1 LEFT OUTER JOIN T2
ON T1.C1 = T2.C3
の結果は、以下の表12のようになる。
【0147】
【表12】
【0148】
定義により、左外部結合の入力(表5)の各行は結果テーブルに含まれる。C3=20となるT2の行がないため、第2の行はヌル値を有する。
【0149】
左外部結合と右外部結合は、意味論的にSPARQL OPTIONALパターンと同等であるが、OPTIONALがSPARQLにおいて値をfindしない場合、変数はワイルドカードになるという違いがある。SQLでは、ヌル値が返された場合、それらはヌルのままであり、ヌルと任意の値を結合するとヌルをもたらす。したがって、実装は、次の演算子がオプショナル(すなわち、ワイルドカードありまたはなし)の結果に依存し得るという事実を扱うために、OPTIONALのすべてのメカニズムを必要としない。
【0150】
図12は、実装による上記の例のIRを提示する。破線は、Optional f0の第2の子に対応する。
【0151】
テーブルT1から開始して、最初の演算子Op#1は、以下の表13のように列C1について出力する。
【0152】
【表13】
【0153】
IRは左結合を有するので、以下に帰着するように、Op#1の主キーi0を使用して、Op#2を適用すると、すべての列C2が結果に現れる:
【0154】
【表14】
【0155】
次の演算子は、フラグf0を作成するオプション演算子であり、それが決してセットされない場合、破線が実行される。この場合、演算子Op#6が使用され、i3列およびi4列をすべてundefに設定する。さもなければ、Op#3を使用して実際の結合を行い、T1.C1と同じ値を有するT2.C3のすべての行を取得する。これらの値は、Op#1によってi1として計算される。結果は、以下の表15である。
【0156】
【表15】
【0157】
テーブルT2の列C3に主キー20を有する応答がないため、i3の2行目にundefがある。結果が見つけ出されないときにこのundefを取得するために、実装は、単純なFindの代わりにFindOptionalを使用する。単純なFindは、一致が見つけ出されない場合に出力行を生成しないからである。
【0158】
次に、実装はOp#4を実行する。結合の結果は既に見つけ出されているので、フラグが設定され、Op#6は実行されない。Op#5は、主キーi3を有する列C4の値を取得する。i3にはundefがあるので、SPARQLではワイルドカードに変わってしまうため、それは起こり得ない。対照的に、SQLはそうすることなく、代わりに0はundefのままである。したがって、実装は、undef事例を異なる扱いをするためにIRにおいてIFを取得する。実際に、Findはundefを入力として受け付けない。このステップの結果は以下の表16の通りである。
【0159】
【表16】
【0160】
表16の結果において、i0は必要なくなったので破棄されている。次いで、インデックス42が「BB」を意味し、undefがヌルに変換されるので、実装は、以下の表17のように最終的な値を取得する。
【0161】
【表17】
【0162】
外部結合は連想的ではなく、右外部結合は左外部結合の対称である。完全外部結合は左外部結合と右外部結合の組み合わせであり、したがって、表5と同じテーブルT1およびT2を有し、
SELECT *
FROM T1 FULL OUTER JOIN T2
ON T1.C1 = T2.C3
の結果は、表18のようになる。
【0163】
【表18】
【0164】
図13は、左/外部結合とクロス結合との間の混合である上記のクエリのIR変換を提示する。クロス結合のデカルト積と同様に、IRはフラグf0を有するバッファを作成することから開始する。次いで、IRは、T2のすべての行(Op#4、Op#5)を取得し、それをバッファリングする一方、T1からすべての行を取得する。次いで、IRは、Op#2とOp#6からもたらされるバッファの各行に対して、i3=i4という条件で外部結合を行い、Op#3においてT1タスクをT2タスクと同期させる。これは、各行について、i3=i4の場合、IRは(以下の表19のように)行を結合することを意味する:
【0165】
【表19】
【0166】
そうでない場合、表20のように、Op#2からの値がundefで補完されて1行が追加される:
【0167】
【表20】
【0168】
そして、表21のように、Op#6からの値がundefで補完されて上記の結果に1行が追加される:
【0169】
【表21】
【0170】
これは、任意のON検索条件で一般化され得る。
【0171】
検索条件のSynchronize OuterJoinは、IRに追加される必要のある新しいノードである。それは、クロス結合によって既に導入されたのと同じCreateBufferノードおよびBufferizeノードを使用する。このBufferizeノードについては、いつ使用できるのか、いつ削除できるのかという2つの情報が知られるべきである。そのため、それが実際のIR実装におけるフラグの一般化のように見られる。
【0172】
Union join
統合結合(union join)は、上述された完全外部結合と同様に作用するが、列一致を指定できないという違いがある。代わりに、統合結合は以下を行う:
・ ソーステーブルからのすべての列の統合を有する新しい仮想テーブルを作成し、
・ 新しいテーブルの行を各ソーステーブルのそれぞれの列の値を用いて作成し、他方のテーブルの各行内の列にヌル値が割り当てられる。
【0173】
したがって、表5のテーブルT1およびT2について、
SELECT *
FROM T1 UNION JOIN T2
の結果は、以下の表22のようになる。
【0174】
【表22】
【0175】
図14は、完全外部結合のIR変換が次に単純なバッファ連結として統合結合のために単純化できることを提示する。
【0176】
スコープ
JOINオペランドでは、(先に定義されたような)範囲変数のスコープはその結合を直ちに含む結合式であるが、別の範囲変数が同じ名前で導入される元の結合式内のいずれかにネストされる任意の選択式または結合式を除外する。すべての列は名前を持つ必要があり、必要に応じて名前が割り当てられ得る。
【0177】
派生テーブル
BNFにおいてFROM句があることを思い出す:
<from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]
<table reference> ::=
<table name> [ <correlation specification> ]
| <derived table> <correlation specification>
| <joined table>
【0178】
次のテーブル参照は、次のように定義される派生テーブルである:
<derived table> ::= <table subquery>
<table subquery> ::= <subquery>
<subquery> ::= <left paren> <query expression> <right paren>
<query expression> ::= <non-join query expression> | <joined table>
<non-join query expression> ::=
<non-join query term>
| <query expression> UNION [ ALL ] [ <corresponding spec> ] <query term>
| <query expression> EXCEPT [ ALL ] [ <corresponding spec> ] <query term>
<non-join query term> ::=
<non-join query primary>
| <query term> INTERSECT [ ALL ] [ <corresponding spec> ] <query primary>
【0179】
ここで、式であるUNION、EXCEPT、INTERSECTは非結合クエリ式であり、集合論の和演算、差演算、交差演算に基づいている。
【0180】
基本的なクエリ式は、SPARQLにおけるそれらと同等のものにマッピングされる。それは、派生テーブル以外のUNION、EXCEPT、INTERSECTの場合である。SPARQLにおけるUNION、FILTER EXIST/NOT EXISTと同様に、上で詳述されたように、一階論理の量化子にマッピングされる両言語の演算子がごく自然に存在する。
【0181】
WHERE
WHERE句は、条件のセットを満たす特定の行を取り出すための手段である。それは、検索条件、すなわち、AND、OR、およびNOTと組み合わされた(RDFの意味ではなく述語論理の意味での)1つまたは複数の述語を必要とする。
<where clause> ::= WHERE <search condition>
<search condition> ::=
<boolean term>
| <search condition> OR <boolean term>
<boolean term> ::=
<boolean factor>
| <boolean term> AND <boolean factor>
<boolean factor> ::= [ NOT ] <boolean test>
<boolean test> ::= <boolean primary> [ IS [ NOT ] <truth value> ]
<boolean primary> ::= <predicate> | <left paren> <search condition> <right paren>
<predicate> ::=
<comparison predicate>
| <between predicate>
| <in predicate>
| <like predicate>
| <null predicate>
| <quantified comparison predicate>
| <exists predicate>
| <match predicate>
| <overlaps predicate>
【0182】
次に、上記の文法で使用されている述語型のリストが説明される。
【0183】
Comparison
比較(comparison)述語は、通常の自明な<,=,>=,...であり、等しくないことは<>である。between述語は、以下の形式を有する比較述語の変形である:
value1 BETWEEN value2 AND value3
value1 NOT BETWEEN value2 AND value3
これらは、以下と同等である:
value1>=value2 AND value1<=value3
NOT(value1>=value2 AND value1<=value3)
IRはこれらの操作のためのバイトコードを生成し、RDFタームを比較する。「R2RML:RDB to RDF Mapping Language」(非特許文献31参照)を使用するW3C勧告「A Direct Mapping of Relational Data to RDF」(非特許文献32参照)に基づいて、実装は、SQL値の自然なマッピング(natural mapping)(非特許文献33参照)を有する:
SQLデータ値に対応する自然なRDFリテラルは、以下のステップを適用した結果である:
・ SQLデータ値のSQLデータ型をdtとする。
【0184】
・ dtが文字列型(Core SQL 2008では:CHARACTER、CHARACTER VARYING、CHARACTER LARGE OBJECT、NATIONAL CHARACTER、NATIONAL CHARACTER VARYING、NATIONAL CHARACTER LARGE OBJECT)である場合、結果は言語タグなしのプレーンリテラルとなり、その字句形式はSQLデータ値である。
【0185】
・ そうではなく、dtが以下の表にリストされている場合、結果は、データ型IRIが、dtと同じ行のRDFデータ型列に示されたIRIである、型付きリテラルである。字句形式は、RDFデータ型の定義に従って、SQLデータ値と同じ値を表す任意の字句形式であり得る。同じ値を表す利用可能な複数の字句形式がある場合(例えば、1、+1、1.0、および1.0E0)、選択は実装に依存する。しかしながら、選択は、目標RDFデータ型および値が与えられると、同じ字句形式が一貫して選択されるようにされる必要がある(例えば、INTEGER 5とBIGINT 5は、両方ともRDFデータ型xsd:integerにマッピングされ、等しい値であり、同じ字句形式にマッピングされなければならない。一方を5に、他方を+5にマッピングすることはエラーとなる)。正規の字句表現XMLSCHEMA2 MAYが選択される(Summary of XSD Lexical Formsも参照されたい)。
【0186】
・ そうでない場合、結果は言語タグなしのプレーンリテラルとなり、その字句形式は文字列にキャストされたSQLデータ値である。
【0187】
概要が以下の表23に提示されている。
【0188】
【表23】
【0189】
INTERVALの変換は、その変換が複雑であるために未定義のままとなっている。SQL14では、INTERVALからxdt:yearMonthDurationおよびxdt:dayTimeDurationへの変換が記述されている。
【0190】
実装によるデータベースは、xsd:numericに基づく数値の実装定義を有する。SQLおよびSQL2では、多くのSQLデータ型の精度は固定されず、実装に定義がまかされる。したがって、XML Schemaデータ型へのマッピングは、xsd:decimal、xsd:integer、およびxsd:dateTimeなどの任意精度型に依存しなければならない。マッピングの実装者は、これらのXSD型のサポートされる精度の上限を設定することを望むかもしれない。XMLスキーマ仕様は、無限データ型XMLSCHEMA2のそのような部分実装を可能にし、特定の最小要件を定義する。
【0191】
したがって、実装はxsd:numericと同じであり、同じ規則が適用される。
【0192】
RDFタームは、データ型、字句形式、および正規形式を有することができる。規則は、以下の通りである:
SQLデータ型に対応する自然なRDFデータ型は、上記の表23のSQLデータ型に対応する行におけるRDFデータ型列の値である。SQLデータ値に対応する自然なRDF字句形式は、その対応する自然なRDFリテラルの字句形式であり、XMLSCHEMA2 SHOULDの正規の字句表現が選択されるという追加の制約を有する。SQLデータ値に対応する正規のRDF字句形式は、その対応する自然なRDFリテラルの字句形式であり、正規の字句表現XMLSCHEMA2 MUSTが選択されるという追加の制約を有する。
【0193】
GROUP BY
入力テーブルは、1つまたは複数のグループに分割され、グループの数は、各グループ化列参照について、どのグループの2行もそのグループ化列に対して異なる値を持たないような最小数である。すなわち、結果でグループ化されたテーブルのどのグループについても、そのグループ内のすべての行はグループ化列に同じ値を有する。文法は以下の通りである:
<group by clause> ::= GROUP BY <grouping column reference list>
<grouping column reference list> ::=
<grouping column reference> [ { <comma> <grouping column reference> }... ]
<grouping column reference> ::= <column reference> [ <collate clause> ]
<collate clause> ::= COLLATE <collation name>
<collation name> ::= <qualified name>
【0194】
これはSPARQLと同じ挙動である。COLLATE句は、順序付けに使用される照合(例えば、SQL_Latin1_General_CP1_CS_AS)を指定するために使用され得る。これは、IRではサポートされていない。実装は、単純化のために、照合なしでGROUP BYをサポートする。
【0195】
HAVING
having句は、前の句の結果のグループ化されたテーブルに、すなわち、group byがあればその結果、そうでなければwhere句(またはWHERE句がなければfrom句、FROMは必須である)の結果に適用される別のフィルタである。これらの最後の2つの場合では、入力は、正確に1つのグループを有するグループ化されたテーブルとして扱われる。having句が参照できる入力テーブルの列は、列がセット関数(例えば、count、max、avgなど、専用セクションを参照)で使用されない限り、グループ化列のみである。これは、SPARQLと同じ挙動である。文法は以下の通りである:
<having clause> ::= HAVING <search condition>
【0196】
SELECTリスト
SELECT文は、selectリストで始まるクエリ仕様を与える。このリストの前に集合量化子を置くことができ、ALLは重複を排除しないことを意味し、DISTINCTは冗長な重複を排除することを意味する。selectリストは、テーブル式に対応するテーブルの一部であるすべての列に対するアスタリスクとされ得るか、または明示的なselectサブリストが使用され得る。選択サブリストは、派生列、または修飾子(先に見られたように、修飾子は、テーブル名、もしくは特定のスコープ内のテーブルを識別する相関名(範囲変数)のいずれかである)にピリオドおよびアスタリスクが続くもの:t.*であり得る。
<query specification> ::=
SELECT [ <set quantifier> ] <select list> <table expression>
<select sublist> ::= <derived column> | <qualifier> <period> <asterisk>
<derived column> ::= <value expression> [ <as clause> ]
<as clause> ::= [ AS ] <column name>
<set quantifier> ::= DISTINCT | ALL
【0197】
派生列は値式(例えば、列名)であり、任意選択でキーワードASおよび列名が続く。値式は明示的でない名前(例えば「price/2」)を有することができる。この場合、標準は、実装が名前を割り当てなければならないことを明示的に要求する。
【0198】
これは、SPARQLにおけるのと同じ挙動である。
【0199】
DISTINCTおよびORDERBYもSPARQLとSQLにおいて同じである。
【0200】
使用事例
態様では、実装は、大規模データベース、例えば、大規模な表データとの対話に関連付けられ得る。具体的には、実装は、各行について数列を有する部品表(BOM)(例えば、100万のオーダのウェブテーブル)のインスタンスの大きなテーブルの対話スクロールを提供することができる。BOMは、セマンティックグラフ(例えばRDF)を使用して記述される。ユーザは、所与のある瞬間に画面上の限られた行数(例えば、100行)を見ることがあるため、リスト上で対話的にスクロールしようとする。
【0201】
リレーショナルデータベースにおける従来のアプローチでは、クエリ全体を一度だけ実行するために、マテリアライズドビュー上でページネーション(例えば、最初に1行から100行、次いで101行から200行など)を使用する。そのようなアプローチでは、orderby句のみを含む(すなわち、offset句およびlimit句を含まない)クエリの結果のマテリアライズドビュー(非特許文献34参照)を作成する。次いで、ユーザは、オフセット/リミットを用いてビューに問い合わせることができる。このアプローチの例については、非特許文献35で説明されている。
【0202】
上述されたアプローチは、入力データがテーブルに格納されるリレーショナルデータである場合、クエリの出力データはテーブルの行として見られ得るタプルであるため、うまく機能する。そのような出力タプルは、これらのタプルからマテリアライズドビューを作成するために使用され、テーブルとして格納され得る。テーブルは、SQLによってネイティブに問い合わされ表示され得る。
【0203】
しかしながら、BOMがセマンティックグラフを使用して記述された場合、行はインスタンス名(例えば、列の1つ)で順序付けられる。したがって、次の行(例えば、100行)を表示させるためにオフセットする前にすべての行をソートすることが必須である。SPARQLクエリの結果も、テーブルの行として見られ得るタプル(非特許文献36参照)である。しかしながら、従来のアプローチであるGDBMSは、これらの結果をテーブルとして格納することができず、グラフクエリ言語を使用してSPARQLでネイティブにテーブルに問い合わせることもできない。一般的なルールとして、双方向性は、応答時間が約300msまでと考えられており、そのようなクエリの計算は、双方向性が考えられるには遅すぎる可能性がある。例えば、テーブルが100万行で8列を有する場合、クエリ全体で約3秒かかる。そのような使用事例を扱う解決策は、スクロール時にクエリを再評価することなく、リスト内で後方または前方に進む能力を必要とする。リスト内のすべてのデータは一貫していなければならない。言い換えれば、すべてのデータはデータベースの同じ状態を反映しなければならない(例えば、状態の一部が書込みトランザクションの前で、状態の一部が書込みトランザクションの後とはならない)。そのため、orderby/offset/limitを有する標準的SPARQLクエリは、(再評価を必要とするため、)この目的には効率的ではない。RDFoxのようにカーソルを使用しても、カーソルが後方に移動できず、すべての動きは前方であるため、役に立たない。
【0204】
この使用事例の実装は、以下のようにSPARQLで定義され、SQLに類似する「CREATE VIEW」句によって、SPARQLを拡張することができる;
<create view> ::= CREATE VIEW <view name> AS <SELECT QUERY>
ここで、「view name」はIRIであり、「SELECT QUERY」は標準のSELECT SPARQLクエリである。
【0205】
上述されたように、SELECTクエリの結果は、タプルのテーブルである。実装は、これらのタプルからテーブルを作成し、テーブルの列はSELECTの出力変数であり、行はタプルである。実装は、タプルをインデックスとして保持し、格納コストを低くするために、値は保持しない。
【0206】
このテーブルを作成すると、インタラクション(例えば、ユーザによるスクロール)により、limit/offsetを有するSQLクエリを発行してページネーションを行い、ユーザに行を表示することができる。実装によれば、ビューの作成は約3秒を要し、ページネーションクエリは約100msを要する。
図1
図2
図3
図4
図5
図6
図7
図8
図9A
図9B
図10
図11
図12
図13
図14
【外国語明細書】