SPARQL 1.2 クエリ言語

W3C作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-sparql12-query-20260625/
最新公開バージョン:
https://www.w3.org/TR/sparql12-query/
最新編集者草案:
https://w3c.github.io/sparql-query/spec/
履歴:
https://www.w3.org/standards/history/sparql12-query/
コミット履歴
テストスイート:
https://w3c.github.io/rdf-tests/
最新の勧告:
https://www.w3.org/TR/2013/REC-sparql11-query-20130321
編集者:
Olaf Hartig
Andy Seaborne
Ruben Taelman
Gregory Williams
Thomas Pellissier Tanon
旧編集者:
Steve Harris
Andy Seaborne
Eric Prud'hommeaux
フィードバック:
GitHub w3c/sparql-query (プルリクエスト, 新しい課題, 未解決の課題)
public-rdf-star-wg@w3.org 件名行を [sparql12-query] … メッセージのトピック … としてください(アーカイブ

要約

RDFは、Web上の情報を表現するための有向ラベル付きグラフ・データモデルです。 この仕様は、RDFのためのSPARQLクエリ言語の構文と意味論を定義します。 SPARQLは、データがRDFとしてネイティブに保存されている場合でも、 ミドルウェアを介してRDFとして見なされる場合でも、多様なデータソースにまたがる クエリを表現するために使用できます。SPARQLには、必須および任意の グラフ・パターンを、それらの連言および選言とともにクエリする機能が含まれます。 SPARQLはまた、集約、サブクエリ、否定、式による値の作成、 拡張可能な値テスト、およびソースRDFグラフによるクエリの制約をサポートします。 SPARQLクエリの結果は、結果セットまたはRDFグラフになり得ます。

この文書のステータス

この節は、公開時点におけるこの 文書のステータスを説明します。現在のW3C 公開物の一覧およびこの技術報告書の最新改訂は、 W3C標準および草案 インデックスで確認できます。

この仕様は、 RDF Starワーキンググループによって、 形式および正誤表のための仕様更新の一部として公開されています。

この文書は、RDF & SPARQLワーキング グループによって、 勧告 トラックを用いた作業草案として公開されました。

作業草案としての公開は、 W3Cおよびそのメンバーによる承認を 意味するものではありません。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される 可能性があります。この文書を、作業中の文書以外のものとして引用することは 不適切です。 この今後の勧告に対する将来の更新には、 新機能が 組み込まれる可能性があります。

この文書は、 W3C 特許 ポリシーの下で運営されるグループによって作成されました。 W3Cは、 そのグループの成果物に関連して行われた 特許開示の公開一覧を 維持しています。そのページには、特許を開示するための 手順も含まれています。個人が、含まれていると考える特許について実際の 知識を有する場合、 必須クレームを 含むものについては、 W3C特許ポリシー第6節に従って その情報を開示しなければなりません。

この文書は、 2025年8月18日のW3Cプロセス文書に従います。

1. 序論

RDFは、Web上の情報を表現するための有向ラベル付きグラフ・データモデルです。RDFは、 とりわけ、個人情報、ソーシャルネットワーク、デジタル成果物に関するメタデータを 表現するため、また異種の情報源を統合する手段を提供するために、しばしば用いられます。 この仕様は、RDFのためのSPARQLクエリ言語の構文と意味論を定義します。

RDFのためのSPARQLクエリ言語は、[RDF-DAWG-UC]で RDF Data Accessワーキンググループにより特定されたユースケースおよび要件、 [SPARQL-FEATURES]でSPARQL 1.1ワーキング グループにより特定されたもの、ならびにRDF-starワーキンググループによるものを満たすように 設計されています。

1.1 文書の概要

節見出しに特に明記されていない限り、この文書のすべての節および附録は 規範的です。

この文書のこの節、第1節では、SPARQL クエリ言語仕様を紹介します。この仕様文書の構成および 仕様全体で用いられる規約を示します。

仕様の第2節では、一連のクエリ例および クエリ結果を通じて、SPARQLクエリ言語そのものを紹介します。 第3節では、クエリ結果に現れるRDF用語に対して 制約を表現できるSPARQLの能力を示す追加例によって、 SPARQLクエリ言語の紹介を続けます。

第4節では、SPARQLクエリ言語の 構文の詳細を示します。これは言語の完全な文法に対応するものであり、 文法構造がIRI、空白ノード、リテラル、および変数をどのように表すかを定義します。 第4節はまた、より冗長な式に対する構文糖として機能する いくつかの文法構造の意味も定義します。

第5節では、より複雑なSPARQLクエリ・パターンを構築する 構成要素である、基本グラフ・パターンおよびグループ・グラフ・ パターンを紹介します。第6節、第7節、および第8節では、SPARQLグラフ・パターンを より大きなグラフ・パターンへ結合する構造を示します。特に、 第6節は、クエリの一部を任意にする能力を紹介し、 第7節は、代替グラフ・パターンの選言を 表現する能力を紹介し、第8節は、 情報の欠如をテストするパターンを紹介します。

第9節では、プロパティ・パスをグラフ・パターン照合に追加し、 クエリのコンパクトな表現と、グラフ内の任意長パスを照合する能力も 提供します。

第10節では、SPARQLで可能な割り当て形式について 説明します。

第11節では、結果をグループ化して 集約する仕組みを紹介します。これは第12節で説明されるように サブクエリとして組み込むことができます。

第13節では、クエリの一部を特定のソースグラフへ 制約する能力を紹介します。第13節はまた、クエリのためのソースグラフを 定義するSPARQLの仕組みを示します。

第14節は、別文書 SPARQL 1.1フェデレーテッドクエリを参照します。

第15節では、解の列に対して 並べ替え、スライス、投影、制限、および重複の除去によって 影響を与える構造を定義します。

第16節では、異なる形式で結果を生成する 4種類のSPARQLクエリを定義します。

第17節では、SPARQLの拡張可能な値テスト および式フレームワークを定義します。クエリ結果に現れる値を制約し、 またクエリによって返される新しい値を計算するために用いることができる 関数および演算子を示します。

第18節は、SPARQLグラフ・パターンおよび 解修飾子の評価の形式的定義です。

第19節には、SPARQLクエリおよび SPARQL 1.1更新言語の構文に関する 規範的定義が含まれ、EBNF 記法で表現された文法として与えられます。

1.2 文書規約

1.2.1 名前空間

この文書では、特に明記されていない限り、例は次の名前空間接頭辞定義を 前提とします。

接頭辞 IRI
rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs: http://www.w3.org/2000/01/rdf-schema#
xsd: http://www.w3.org/2001/XMLSchema#
fn: http://www.w3.org/2005/xpath-functions#

1.2.2 データ記述

この文書では、各トリプルを明示的に示すために、 RDF 1.1 Turtle [TURTLE]データ 形式を用います。Turtleでは、IRIを接頭辞で省略できます。

PREFIX dc:   <http://purl.org/dc/elements/1.1/>
PREFIX :     <http://example.org/book/>

:book1  dc:title  "SPARQL Tutorial" .

1.2.3 結果記述

結果セットは表形式で示されます。

x y z
"Alice" <http://example/a>      

「束縛」は、(変数, RDF用語)の対です。 この結果セットには3つの変数、 xy、およびzがあります(列見出しとして示されています)。各解は 表の本体内の1行として示されます。ここでは、単一の解があり、 その中で変数x"Alice"に束縛され、変数y<http://example/a>に束縛され、変数zは RDF用語に束縛されていません。変数は、解において必ずしも束縛されている必要は ありません。

1.2.4 用語

SPARQL言語にはIRIが含まれます。 SPARQLクエリ内のすべてのIRIは絶対IRIであることに注意してください。それらはフラグメント 識別子を含んでも含まなくてもかまいません [RFC3987] 第3.1節。IRIには URI [RFC3986] およびURLが含まれます。 SPARQL構文における省略形 (相対IRIおよび接頭辞付き名前)は、 絶対IRIを生成するために解決されます。

次の用語は、RDF 1.2概念および抽象データ モデル [RDF12-CONCEPTS]で定義され、 SPARQLで使用されます。

空白ノード識別子は、 SPARQLおよび RDF具象シリアル化の一部です。 この文書では、構文形式「_:abc」は、 空白ノード識別子abcである場合に用いられます。また「_:」は、 識別子付きの空白ノードを導入するために用いられる TurtleおよびSPARQL構文です。

2. 単純なクエリの作成 (参考)

SPARQLクエリの多くの形式は、基本グラフ・パターンと呼ばれる トリプル・パターンの集合を含みます。トリプル・パターンはRDFトリプルに似ていますが、 主語、述語、および目的語のそれぞれが変数であってもよい点が異なります。 RDFデータの部分グラフからのRDF用語を 変数の代わりに代入でき、その結果がその部分グラフと等価なRDFグラフになるとき、 基本グラフ・パターンはRDFデータの部分グラフに一致します。

2.1 単純なクエリを書く

次の例は、与えられたデータグラフから本のタイトルを見つけるSPARQLクエリを 示しています。クエリは2つの部分で構成されます。SELECT節は クエリ結果に現れる変数を特定し、WHERE節は データグラフと照合する基本グラフ・パターンを提供します。この例の基本グラフ・パターンは、 目的語位置に単一の変数(?title)を持つ単一のトリプル・パターンで 構成されています。

データ:

<http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> "SPARQL Tutorial" .

クエリ:

SELECT ?title
WHERE
{
    <http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> ?title .
}

このクエリは、上記のデータに対して、1つの解を持ちます。

クエリ結果:

title
"SPARQL Tutorial"

2.2 複数の一致

クエリの結果は、クエリのグラフ・パターンがデータと一致する方法に対応する 解列です。 クエリに対する解は、0個、1個、または複数個存在し得ます。

データ:

PREFIX foaf:  <http://xmlns.com/foaf/0.1/> .

_:a  foaf:name   "Johnny Lee Outlaw" .
_:a  foaf:mbox   <mailto:jlow@example.com> .
_:b  foaf:name   "Peter Goodguy" .
_:b  foaf:mbox   <mailto:peter@example.org> .
_:c  foaf:mbox   <mailto:carol@example.org> .

クエリ:

PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE
{ ?x foaf:name ?name .
  ?x foaf:mbox ?mbox }

クエリ結果:

name mbox
"Johnny Lee Outlaw" <mailto:jlow@example.com>
"Peter Goodguy" <mailto:peter@example.org>

各解は、クエリ・パターンがデータと一致するように、選択された変数を RDF用語へ束縛できる1つの方法を与えます。結果セットは、可能なすべての解を示します。 上の例では、提供されたデータの次の2つの部分集合が、2つの一致を提供しました。

_:a foaf:name  "Johnny Lee Outlaw" .
_:a foaf:box   <mailto:jlow@example.com> .
_:b foaf:name  "Peter Goodguy" .
_:b foaf:box   <mailto:peter@example.org> .

これは基本グラフ・パターン照合です。クエリ・パターンで 用いられるすべての変数は、すべての解で束縛されていなければなりません。

2.3 RDFリテラルの照合

下のデータには3つのRDFリテラルが含まれます。

PREFIX dt:   <http://example.org/datatype#>
PREFIX ns:   <http://example.org/ns#>
PREFIX :     <http://example.org/ns#>
PREFIX xsd:  <http://www.w3.org/2001/XMLSchema#>

:x   ns:p     "cat"@en .
:y   ns:p     "42"^^xsd:integer .
:z   ns:p     "abc"^^dt:specialDatatype .

Turtleでは、"cat"@enは字句形式"cat"と 言語タグ"en"を持つRDFリテラルであり、"42"^^xsd:integerは データ型http://www.w3.org/2001/XMLSchema#integerを持つリテラルであり、 "abc"^^dt:specialDatatypeはデータ型 http://example.org/datatype#specialDatatypeを持つリテラルであることに 注意してください。

このRDFデータは、第2.3.1節〜第2.3.3節のクエリ例のためのデータグラフです。

2.3.1 言語タグ付き リテラルの照合

SPARQLにおける言語タグは、言語を識別するためのタグ [BCP47]で定義されるように、 @と言語タグを用いて表現されます。

次のクエリは、"cat""cat"@enと同じRDF リテラルではないため、解を持ちません。

SELECT ?v WHERE { ?v ?p "cat" }
   v    

しかし下のクエリは、言語タグが指定され、与えられたデータと一致するため、 変数v:xに束縛される解を見つけます。

SELECT ?v WHERE { ?v ?p "cat"@en }
v
<http://example.org/ns#x>

SPARQL は、指定された 基底方向の照合もサポートする。 Turtle と同様に、これは言語タグに続けて記述され、たとえば、 @en--ltr である。 基底方向は、ltr または rtl のいずれかに制限される。 言語タグとは異なり、これは常に小文字である。

2.3.2 数値型付き リテラルの照合

SPARQLクエリ内の整数は、データ型 xsd:integerを持つRDFリテラルを示します。 例: 42は  "42"^^<http://www.w3.org/2001/XMLSchema#integer>の短縮形です。

次のクエリのパターンは、変数v:yに束縛された解を持ちます。

SELECT ?v WHERE { ?v ?p 42 }
v
<http://example.org/ns#y>

第4.1.2節は、 xsd:floatおよびxsd:doubleのためのSPARQL短縮形を定義します。

2.3.3 任意のデータ型付き リテラルの照合

次のクエリは、変数v:zに束縛された解を持ちます。クエリ処理系は、 そのデータ型の値空間内の値について何ら理解している必要はありません。 字句形式とデータ型IRIの両方が一致するため、 リテラルは一致します。

SELECT ?v WHERE { ?v ?p "abc"^^<http://example.org/datatype#specialDatatype> }
v
<http://example.org/ns#z>

2.4 クエリ結果における空白ノード 識別子

クエリ結果には空白ノードが含まれる場合があります。この文書の例の 結果セット内の空白ノードは、"_:"の後に 空白ノード識別子が続く形式で 書かれます。

空白ノード識別子は、結果セット(「SPARQLクエリ結果XML形式(第2 版)」および 「SPARQL 1.1クエリ結果JSON 形式」を参照)、またはCONSTRUCTクエリ形式では結果 グラフにスコープを持ちます。結果セット内で同じ識別子を使用することは、同じ空白ノードを示します。

データ:
PREFIX foaf:  <http://xmlns.com/foaf/0.1/>

_:a  foaf:name   "Alice" .
_:b  foaf:name   "Bob" .
クエリ:
PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
SELECT ?x ?name
WHERE  { ?x foaf:name ?name }
x name
_:c "Alice"
_:d "Bob"

上の結果は、異なる空白ノード識別子で同等に与えることができます。 これは、結果内の空白ノード識別子が、解におけるRDF用語が 同一であるか、異なるかだけを示すためです。

x name
_:r "Alice"
_:s "Bob"

これら2つの結果は同じ情報を持ちます。クエリに一致するために使用された 空白ノードは、2つの解で異なります。結果セット内の空白ノード識別子 _:aと、データの構文で用いられる空白ノード識別子との間に 何らかの関係がある必要はありません。

アプリケーション作成者は、クエリ内の空白ノード識別子が データ内の特定の空白ノードを参照することを期待すべきではありません。

2.5 式による値の 作成

SPARQL 1.2では、複雑な式から値を作成できます。下のクエリは、 CONCAT関数を使用してFOAFデータから名と 姓を連結し、その値を SELECT節内の式を使用して割り当てる方法、および BIND形式を使用してその値を割り当てる方法を示しています。

データ:
PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
            
_:a  foaf:givenName   "John" .
_:a  foaf:surname  "Doe" .
クエリ:
PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
SELECT ( CONCAT(?G, " ", ?S) AS ?name )
WHERE  { ?P foaf:givenName ?G ; foaf:surname ?S }
クエリ:
PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE  { 
    ?P foaf:givenName ?G ; 
       foaf:surname ?S 
    BIND(CONCAT(?G, " ", ?S) AS ?name)
}
name
"John Doe"

2.6 RDFグラフの構築

SPARQLにはいくつかのクエリ形式があります。 SELECTクエリ形式は変数束縛を返します。CONSTRUCTクエリ 形式はRDFグラフを返します。グラフは、クエリのグラフ・パターン照合の 結果に基づいてRDFトリプルを生成するために使用されるテンプレートに基づいて 構築されます。

データ:

PREFIX org:    <http://example.com/ns#>

_:a  org:employeeName   "Alice" .
_:a  org:employeeId     12345 .

_:b  org:employeeName   "Bob" .
_:b  org:employeeId     67890 .

クエリ:

PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
PREFIX org:    <http://example.com/ns#>

CONSTRUCT { ?x foaf:name ?name }
WHERE  { ?x org:employeeName ?name }

結果:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
                
_:x foaf:name "Alice" .
_:y foaf:name "Bob" .

これはRDF/XMLで次のようにシリアル化できます。

<rdf:RDF
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:foaf="http://xmlns.com/foaf/0.1/" >

  <rdf:Description>
    <foaf:name>Alice</foaf:name>
  </rdf:Description>
  <rdf:Description>
    <foaf:name>Bob</foaf:name>
  </rdf:Description>
</rdf:RDF>

3. RDF用語制約(参考)

グラフ・パターン照合は解列を生成し、各解は変数からRDF用語への 束縛の集合を持ちます。SPARQLのFILTERは、フィルター式が TRUEに評価される解に制限します。

この節では、SPARQLのFILTERについて非形式的に紹介します。 その意味論は「式および値のテスト」節で定義されており、 そこには包括的な関数ライブラリがあります。この節の例は、 1つの入力グラフを共有します。

データ:
PREFIX dc:   <http://purl.org/dc/elements/1.1/>
PREFIX :     <http://example.org/book/>
PREFIX ns:   <http://example.org/ns#>

:book1  dc:title  "SPARQL Tutorial" .
:book1  ns:price  42 .
:book2  dc:title  "The Semantic Web" .
:book2  ns:price  23 .

3.1 文字列値の 制限

regexのようなSPARQLのFILTER関数は、 RDFリテラルをテストできます。regex文字列 リテラルにのみ一致します。regexは、 str関数を使用することで、他のリテラルの字句形式と 照合するために使用できます。

クエリ:

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
SELECT  ?title
WHERE   { 
    ?x dc:title ?title
    FILTER regex(?title, "^SPARQL") 
}

クエリ結果:

title
"SPARQL Tutorial"

正規表現照合は、「i」フラグを用いて大文字小文字を区別しないように できます。

クエリ:

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
SELECT  ?title
WHERE   { 
    ?x dc:title ?title
    FILTER regex(?title, "web", "i" ) 
}

クエリ結果:

title
"The Semantic Web"

正規表現言語は、XQuery およびXPath Functions and Operatorsによって定義され、 XML Schema正規表現に基づいています。

3.2 数値の制限

SPARQLのFILTERは、算術式に基づいて制限できます。

クエリ:

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>

SELECT  ?title ?price
WHERE   {
    ?x ns:price ?price .
    FILTER (?price < 30.5)
    ?x dc:title ?title . 
}

クエリ結果:

title price
"The Semantic Web" 23

price変数を制約することにより、:book2だけがクエリに一致します。 これは、フィルター条件が要求するように、:book2だけが 30.5未満の価格を持つためです。

3.3 その他の用語制約

数値型に加えて、SPARQLは xsd:stringxsd:boolean、およびxsd:dateTime型を サポートします(オペランドのデータ型を参照)。 演算子マッピング節は演算子を説明し、 関数定義節は RDF用語に適用できる関数を説明します。

4. SPARQL構文

この節では、SPARQLが RDF 用語 およびトリプル・パターンに用いる構文を扱います。 完全な文法は第19節に示されています。

4.1 RDF用語構文

4.1.1 IRIの構文

iri生成規則はIRIの集合 [RFC3987] を表します。IRIは URI [RFC3986] の一般化であり、URIおよびURLと 完全に互換性があります。 PrefixedName生成規則は接頭辞付き名前を表します。 接頭辞付き名前からIRIへの対応付けは、以下で説明します。IRI参照(相対IRIまたは 絶対IRI)はIRIREF生成規則によって表されます。このとき、 「<」および「>」の区切り文字はIRI参照の一部を構成しません。相対IRIは、 [RFC3987]のIRI参照およびIRIに関する 第2.2節ABNFにおけるirelative-ref参照に一致し、以下で説明するように IRIへ解決されます。

4.1.1.1 接頭辞付き名前

PREFIXキーワードは、接頭辞ラベルをIRIに関連付けます。接頭辞付き名前は、 コロン「:」で区切られた接頭辞ラベルとローカル部です。接頭辞付き 名前は、接頭辞に関連付けられたIRIとローカル部を連結することによってIRIに 対応付けられます。接頭辞ラベルまたはローカル部は空であってもかまいません。 SPARQLローカル名は先頭の数字を許可しますが、 XMLローカル名は許可しないことに 注意してください。 SPARQLローカル名はまた、バックスラッシュ 文字エスケープ(例: ns:id\=123)を介して、IRIで許可される 非英数字文字も許可します。SPARQLローカル 名は、 CURIEよりも 多くの構文上の制限を持ちます。

4.1.1.2 相対IRI

相対IRIは、Uniform Resource Identifier (URI): Generic Syntax [RFC3986] に従い、 第5.2節の基本アルゴリズムのみを用いて基底IRIと結合されます。[RFC3986]の第6.2.2節および第6.2.3節で説明されている、 構文ベースの正規化もスキームベースの正規化も 実行されません。 IRI参照で追加的に許可される文字は、Internationalized Resource Identifiers (IRIs) [RFC3987]の第6.5節に従い、 URI参照における非予約文字と同じ方法で扱われます。

BASEキーワードは、[RFC3986]第5.1.1節 「Base URI Embedded in Content」に従って相対IRIを解決するために用いられる基底IRIを定義します。 第5.1.2節「Base URI from the Encapsulating Entity」は、xml:base指令を持つSOAPエンベロープや、 Content-Locationヘッダーを持つMIMEマルチパート文書など、包含する 文書から基底IRIがどのように得られるかを定義します。5.1.3「Base URI from the Retrieval URI」で特定される「取得URI」は、特定のSPARQLクエリが取得されたURLです。 上記のいずれも基底URIを指定しない場合、既定の基底URI(第5.1.4節「Default Base URI」)が用いられます。

次の断片は、同じIRIを書くいくつかの異なる方法です。

<http://example.org/book/book1>
BASE <http://example.org/book/>
<book1>
PREFIX book: <http://example.org/book/>
book:book1

4.1.2 リテラルの構文

リテラルの一般的な構文は、二重引用符 "..."または単一引用符'...'で囲まれた文字列であり、 任意の言語タグ(@で導入)または任意のデータ型IRIもしくは接頭辞付き名前 (^^で導入)を伴います。

便宜上、整数は直接(引用符および明示的なデータ型IRIなしで)書くことができ、 データ型xsd:integerを持つリテラルとして解釈されます。 数値中に「.」があり指数を持たない十進数はxsd:decimalとして解釈され、 指数を持つ数値はxsd:doubleとして解釈されます。 xsd:boolean型の値も、trueまたはfalseとして 書くことができます。

引用符を含むリテラル値、または長く改行文字を含むリテラル値を書きやすくするため、 SPARQLは、リテラルを3つの単一引用符または二重引用符で囲む 追加の引用構造を提供します。

SPARQLにおけるリテラル構文の例には次のものがあります。

  • "chat"
  • 言語タグ"fr"付きの'chat'@fr
  • "xyz"^^<http://example.org/ns/userDatatype>
  • "abc"^^appNS:appDataType
  • '''The librarian said, "Perhaps you would enjoy 'War and Peace'."'''
  • 1。これは"1"^^xsd:integerと同じです
  • 1.3。これは"1.3"^^xsd:decimalと同じです
  • 1.300。これは"1.300"^^xsd:decimalと同じです
  • 1.0e6。これは"1.0e6"^^xsd:doubleと同じです
  • true。これは"true"^^xsd:booleanと同じです
  • false。これは"false"^^xsd:booleanと同じです

生成規則 INTEGERDECIMALDOUBLE、または BooleanLiteralのいずれかに一致するトークンは、 そのトークンの字句値と対応するデータ型 (xsd:integerxsd:decimalxsd:double、またはxsd:boolean)を持つリテラルと等価です。

4.1.3 クエリ変数の構文

クエリ変数は、「?」または「$」のいずれかを用いることで示されます。「?」または「$」は 変数名の一部ではありません。クエリ内では、$abc?abcは同じ 変数を識別します。変数に使える名前は、 SPARQL文法に示されています。

4.1.4 空白ノードの構文

グラフ・パターン内の 空白ノードは、 クエリ対象のデータ内の特定の空白ノードへの参照ではなく、変数として 機能します。空白ノードは、「_:abc」のような 識別子形式、または「[]」もしくは「[...]」を用いる 省略形式によって示されます。

空白ノード識別子は、識別子「abc」を持つ 空白ノードに対して「_:abc」として書かれます。同じ空白ノード 識別子を、同じクエリ内の2つの異なる基本グラフ・パターンで使用することは できません。

クエリ構文内の1箇所でのみ使用される空白ノードは、 []で示すことができます。一意な空白ノードが、 トリプル・パターンを形成するために使用されます。

[:p :v]構造は、含まれる述語-目的語対の主語として 一意な空白ノードを持つトリプル・パターンを作成するために使用できます。

次の2つの形式

[ :p "v" ] .
[] :p "v" .

は、一意な空白ノード(ここでは 「_:b57」で例示)を割り当て、どちらも次のように書くことと等価です。

_:b57 :p "v" .

割り当てられた空白ノードは、以降のトリプル・パターンの主語または目的語として 使用できます。たとえば主語としては次のようになります。

[ :p "v" ] :q "w" .

これは次の2つのトリプルと等価です。

_:b57 :p "v" .
_:b57 :q "w" .

また目的語としては次のようになります。

:x :q [ :p "v" ] .

これは次の2つのトリプルと等価です。

:x  :q _:b57 .
_:b57 :p "v" .

空白ノードの省略構文は、 共通主語 および共通述語のための他の省略形と組み合わせることができます。

[ foaf:name  ?name ;
  foaf:mbox  <mailto:alice@example.org> ]

これは、代わりに空白ノード識別子を用いて次の基本グラフ・パターンを書くことと 同じです。

_:b18  foaf:name  ?name .
_:b18  foaf:mbox  <mailto:alice@example.org> .

4.2 トリプル・パターンの構文

トリプル・パターンは、主語、述語、目的語として書かれます。 いくつかの一般的なトリプル・パターン構造には、省略して書く方法があります。

次の例は同じクエリを表します。

PREFIX  dc: <http://purl.org/dc/elements/1.1/>
SELECT  ?title
WHERE   { <http://example.org/book/book1> dc:title ?title }
PREFIX  dc: <http://purl.org/dc/elements/1.1/>
PREFIX  : <http://example.org/book/>

SELECT  $title
WHERE   { :book1  dc:title  $title }
BASE    <http://example.org/book/>
PREFIX  dc: <http://purl.org/dc/elements/1.1/>

SELECT  $title
WHERE   { <book1>  dc:title  ?title }

4.2.1 述語-目的語リスト

共通の主語を持つトリプル・パターンは、「;」 記法を用いることで、主語を1回だけ書き、複数のトリプル・パターンに対して 使用するように書くことができます。

?x  foaf:name  ?name ;
foaf:mbox  ?mbox .

これは、次のトリプル・パターンを書くことと同じです。

?x  foaf:name  ?name .
?x  foaf:mbox  ?mbox .

4.2.2 目的語リスト

トリプル・パターンが主語と述語の両方を共有する場合、目的語は 「,」で区切ることができます。

?x foaf:nick  "Alice" , "Alice_" .

これは、次のトリプル・パターンを書くことと同じです。

?x  foaf:nick  "Alice" .
?x  foaf:nick  "Alice_" .

目的語リストは述語-目的語リストと組み合わせることができます。

?x  foaf:name ?name ; foaf:nick  "Alice" , "Alice_" .

これは次と等価です。

?x  foaf:name  ?name .
?x  foaf:nick  "Alice" .
?x  foaf:nick  "Alice_" .

4.2.3 RDFコレクション

RDFコレクションは、トリプル・ パターン内で「(element1 element2 ...)」という構文を用いて書くことができます。 形式「()」は、IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#nilの 代替です。 (1 ?x 3 4)のようにコレクション要素とともに用いる場合、 コレクションのために空白ノードを持つトリプル・パターンが割り当てられます。 コレクションの先頭にある空白ノードは、他のトリプル・パターンで主語または目的語として 使用できます。コレクション構文によって割り当てられる空白ノードは、 クエリ内の他の場所には現れません。

(1 ?x 3 4) :p "w" .

これは(b0b1b2 およびb3はクエリ内の他のどこにも現れないことに注意して)次の構文糖です。

_:b0  rdf:first  1 ;
      rdf:rest   _:b1 .
_:b1  rdf:first  ?x ;
      rdf:rest   _:b2 .
_:b2  rdf:first  3 ;
      rdf:rest   _:b3 .
_:b3  rdf:first  4 ;
      rdf:rest   rdf:nil .
_:b0  :p         "w" .

RDFコレクションは入れ子にでき、他の構文形式を含むことができます。

(1 [:p :q] ( 2 ) ) .

これは次の構文糖です。

_:b0  rdf:first  1 ;
      rdf:rest   _:b1 .
_:b1  rdf:first  _:b2 .
_:b2  :p         :q .
_:b1  rdf:rest   _:b3 .
_:b3  rdf:first  _:b4 .
_:b4  rdf:first  2 ;
      rdf:rest   rdf:nil .
_:b3  rdf:rest   rdf:nil .

4.2.4 rdf:type

キーワード「a」は、トリプル・パターン内で述語として使用でき、 IRI  http://www.w3.org/1999/02/22-rdf-syntax-ns#typeの 代替です。 このキーワードは大文字小文字を区別します。

?x  a  :Class1 .
[ a :appClass ] :p "v" .

これは次の構文糖です。

?x    rdf:type  :Class1 .
_:b0  rdf:type  :appClass .
_:b0  :p        "v" .

4.3 バージョン宣言

SPARQLの言語進化に対応するために、 VERSION指令を使用できます。 トリプル用語トリプル用語に対する関数などの新機能を用いて SPARQLクエリを書く場合、著者は、この指令と、 含まれる機能を処理するために必要なバージョンを示すバージョン・ラベルを続けることにより、 新しい構文形式の使用を宣言してもよいです。

バージョン・ラベルは次の節で定義されます。 処理系は、認識できないラベルをエラーまたは警告として扱うことができます。

VERSION "1.2"
PREFIX : <http://example/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?s ?date {
    ?s ?p ?o .
    BIND( <<( ?s ?p ?o )>> AS ?tt )
    :myreifier rdf:reifies ?tt .
    :myreifier :tripleAdded ?date .
}

SPARQL 1.2 Protocol は、 バージョン通知も提供し、これは メディア型version パラメーターを用いる。 これは VERSION 指令がない場合に考慮される。

4.3.1 バージョン・ラベル

SPARQL バージョンラベルとは、SPARQL クエリの 構文および意味論への適合性を識別する 文字列である。

注記

SPARQL におけるバージョンラベル文字列は、 RDF によって定義された バージョンラベルと同じであるものの、その意味は異なる。具体的には、SPARQL の バージョンラベルは SPARQL の構文および意味論を指すのに対し、RDF のバージョンラベルは RDF の構文 および意味論を指す。

SPARQLバージョン・ラベル
バージョン・ラベル 構文 意味論
"1.2" SPARQL 1.2クエリまたは更新構文 SPARQL 1.2クエリ 言語SPARQL 1.2更新
"1.2-basic" SPARQL 1.2クエリまたは更新構文。ただし、トリプル用語、および 主語または目的語位置にトリプル・パターンを持つトリプル・パターンを含まないもの SPARQL 1.2クエリ 言語SPARQL 1.2更新
"1.1" SPARQL 1.1クエリまたは更新構文。ただし、バージョン指令の使用を除く SPARQL 1.1クエリ 言語SPARQL 1.1更新

クエリがバージョン"1.1"に適合する場合、それはバージョン"1.2-basic"にも適合し、 クエリがバージョン"1.2-basic"に適合する場合、それはバージョン"1.2"にも適合します。

"1.1"は許容されるバージョン・ラベルですが、 VERSION指令での使用は推奨されません。 それはSPARQL 1.1パーサーを不要に失敗させるためです。

5. グラフ・パターン

SPARQLはグラフ・パターン照合を中心に構成されています。より複雑なグラフ・パターンは、 小さなパターンをさまざまな方法で組み合わせることで形成できます。

この節では、連言によってパターンを組み合わせる2つの形式、すなわち トリプル・パターンを組み合わせる基本グラフ・パターンと、その他すべての グラフ・パターンを組み合わせるグループ・グラフ・パターンについて説明します。

クエリ内で最も外側にあるグラフ・パターンはクエリ・パターンと呼ばれます。これは文法上、 次に示すGroupGraphPatternによって識別されます。

[17]   WhereClause   ::=   'WHERE'? GroupGraphPattern

5.1 基本グラフ・パターン

基本グラフ・パターンは、トリプル・パターンの集合です。SPARQLのグラフ・パターン照合は、 基本グラフ・パターンの照合結果を組み合わせるという観点から定義されます。

任意のフィルターを伴うトリプル・パターンの列は、単一の基本グラフ・ パターンを構成します。その他のグラフ・パターンは、基本グラフ・パターンを終了させます。

5.1.1 空白ノード識別子

_:abc形式の空白ノードを使用する場合、空白ノードの識別子は 基本グラフ・パターンにスコープを持ちます。 空白ノード識別子は、 いかなるクエリにおいても1つの基本グラフ・パターンでのみ使用できます。

5.1.2 基本 グラフ・パターン照合の拡張

SPARQLは、単純含意について定義される部分グラフ照合を用いて 基本グラフ・パターンを評価します。SPARQLは、以下で説明するように、 一定の条件が与えられれば、他の形式の含意へ拡張できます。 文書 SPARQL 1.1含意体制は、 いくつかの具体的な含意体制を説明しています。

5.2 グループ・グラフ・パターン

SPARQLクエリ文字列では、グループ・グラフ・パターンは波括弧{}で区切られます。 たとえば、このクエリのクエリ・パターンは、1つの基本グラフ・ パターンからなるグループ・グラフ・パターンです。

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE  {
    ?x foaf:name ?name .
    ?x foaf:mbox ?mbox .
}
同じ解は、トリプル・パターンを2つの基本グラフ・パターンにグループ化した クエリからも得られます。たとえば、下のクエリは異なる構造を持ちますが、 前のクエリと同じ解を生成します。
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE  { 
   { ?x foaf:name ?name . }
   { ?x foaf:mbox ?mbox . }
}

5.2.1 空のグループ・パターン

グループ・パターン:

{ }

は、どの変数も束縛しない1つの解をもって、任意のグラフ(空グラフを含む)に 一致します。たとえば:

SELECT ?x
WHERE {}

は、変数xが束縛されていない1つの解で一致します。

5.2.2 フィルターのスコープ

キーワードFILTERで表される制約は、そのフィルターが現れる グループ全体にわたる解の制限です。次のパターンはすべて 同じ解を持ちます。

{  ?x foaf:name ?name .
   ?x foaf:mbox ?mbox .
   FILTER regex(?name, "Smith")
}
{  FILTER regex(?name, "Smith")
   ?x foaf:name ?name .
   ?x foaf:mbox ?mbox .
}
{  ?x foaf:name ?name .
   FILTER regex(?name, "Smith")
   ?x foaf:mbox ?mbox .
}

5.2.3 グループ・グラフ・パターンの 例

{ ?x foaf:name ?name .
  ?x foaf:mbox ?mbox .
}

は、1つの基本グラフ・パターンからなるグループであり、その基本グラフ・パターンは 2つのトリプル・パターンからなります。

{
  ?x foaf:name ?name . FILTER regex(?name, "Smith")
  ?x foaf:mbox ?mbox .
}

は、1つの基本グラフ・パターンと1つのフィルターからなるグループであり、その基本グラフ・パターンは 2つのトリプル・パターンからなります。フィルターは、基本グラフ・パターンを2つの 基本グラフ・パターンに分割しません。

{
  ?x foaf:name ?name .
  {}
  ?x foaf:mbox ?mbox .
}

は、3つの要素、すなわち1つのトリプル・パターンからなる基本グラフ・パターン、 空のグループ、および1つのトリプル・パターンからなる別の基本グラフ・パターンの グループです。

6. 任意の値を含める

基本グラフ・パターンにより、アプリケーションは、解が存在するためにはクエリ・パターン全体が 一致しなければならないクエリを作成できます。少なくとも1つの基本グラフ・パターンを持つ グループ・グラフ・パターンのみを含むクエリの各解では、すべての変数が解内のRDF用語に 束縛されます。しかし、すべてのRDFグラフで規則的で完全な構造を仮定できるわけではありません。 情報が利用可能な場合にはその情報を解に追加できる一方で、クエリ・パターンの一部が 一致しないという理由で解を拒否しないクエリを持てることは有用です。任意照合はこの機能を 提供します。任意部分が一致しない場合、それは束縛を作成しませんが、解を除去することも ありません。

6.1 任意パターン照合

グラフ・パターンの任意部分は、グラフ・パターンに適用されるOPTIONAL キーワードを用いて構文的に指定できます。

pattern OPTIONAL { pattern }

構文形式:

{ OPTIONAL { pattern } }

は、次と等価です。

{ { } OPTIONAL { pattern } }

OPTIONALキーワードは左結合です。

pattern OPTIONAL { pattern } OPTIONAL { pattern }

これは次と同じです。

{ pattern OPTIONAL { pattern } } OPTIONAL { pattern }

任意照合では、任意グラフ・パターンがグラフに一致して、 1つ以上の解に束縛を定義して追加するか、または追加の束縛を何も追加せずに 解を変更しないままにします。

データ:

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>
PREFIX rdf:        <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

_:a  rdf:type        foaf:Person .
_:a  foaf:name       "Alice" .
_:a  foaf:mbox       <mailto:alice@example.com> .
_:a  foaf:mbox       <mailto:alice@work.example> .

_:b  rdf:type        foaf:Person .
_:b  foaf:name       "Bob" .
クエリ:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE  {
    ?x foaf:name  ?name .
    OPTIONAL { ?x  foaf:mbox  ?mbox }
}

上記のデータでは、クエリ結果は次のようになります。

name mbox
"Alice" <mailto:alice@example.com>
"Alice" <mailto:alice@work.example>
"Bob"

名前が"Bob"である解には、mboxの値がありません。

このクエリは、データ内の人物の名前を見つけます。同じ主語を持ち、述語 mboxを持つトリプルがある場合、解にはそのトリプルの目的語も 含まれます。この例では、クエリの任意照合部分に単一のトリプル・パターンだけが 与えられていますが、一般には任意部分は任意のグラフ・パターンであってかまいません。 任意グラフ・パターンがクエリ解に影響を与えるには、その任意グラフ・パターン全体が 一致しなければなりません。

6.2 任意パターン照合における 制約

任意グラフ・パターン内に制約を与えることができます。例:

PREFIX dc:   <http://purl.org/dc/elements/1.1/>
PREFIX :     <http://example.org/book/>
PREFIX ns:   <http://example.org/ns#>

:book1  dc:title  "SPARQL Tutorial" .
:book1  ns:price  42 .
:book2  dc:title  "The Semantic Web" .
:book2  ns:price  23 .
PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>
SELECT  ?title ?price
WHERE   { 
    ?x dc:title ?title .
    OPTIONAL { ?x ns:price ?price . FILTER (?price < 30) }
}
title price
"SPARQL Tutorial"
"The Semantic Web" 23

タイトルが"SPARQL Tutorial"である本には価格が表示されません。これは、任意グラフ・ パターンが変数「price」を含む解を導かなかったためです。

6.3 複数の任意グラフ・ パターン

グラフ・パターンは再帰的に定義されます。グラフ・パターンは0個以上の任意 グラフ・パターンを持つことができ、クエリ・パターンのどの部分にも任意部分を持たせることが できます。この例には2つの任意グラフ・パターンがあります。

データ:
PREFIX foaf:       <http://xmlns.com/foaf/0.1/>

_:a  foaf:name       "Alice" .
_:a  foaf:homepage   <http://work.example.org/alice/> .

_:b  foaf:name       "Bob" .
_:b  foaf:mbox       <mailto:bob@work.example> .
クエリ:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox ?hpage
WHERE  {
    ?x foaf:name  ?name .
    OPTIONAL { ?x foaf:mbox ?mbox } .
    OPTIONAL { ?x foaf:homepage ?hpage }
}

クエリ結果:

name mbox hpage
"Alice" <http://work.example.org/alice/>
"Bob" <mailto:bob@work.example>

7. 代替の照合

SPARQLは、複数の代替グラフ・パターンのうち1つが一致できるように、 グラフ・パターンを組み合わせる手段を提供します。代替のうち複数が一致する場合、 可能なすべてのパターン解が見つかります。

パターンの代替は、UNIONキーワードを用いて構文的に指定されます。

データ:
PREFIX dc10:  <http://purl.org/dc/elements/1.0/>
PREFIX dc11:  <http://purl.org/dc/elements/1.1/>

_:a  dc10:title     "SPARQL Query Language Tutorial" .
_:a  dc10:creator   "Alice" .

_:b  dc11:title     "SPARQL Protocol Tutorial" .
_:b  dc11:creator   "Bob" .

_:c  dc10:title     "SPARQL" .
_:c  dc11:title     "SPARQL (updated)" .
クエリ:
PREFIX dc10:  <http://purl.org/dc/elements/1.0/>
PREFIX dc11:  <http://purl.org/dc/elements/1.1/>

SELECT ?title
WHERE  { { ?book dc10:title  ?title } UNION { ?book dc11:title  ?title } }

クエリ結果:

title
"SPARQL Protocol Tutorial"
"SPARQL"
"SPARQL (updated)"
"SPARQL Query Language Tutorial"

このクエリは、タイトルがバージョン1.0またはバージョン1.1の Dublin Coreプロパティを用いて記録されているかどうかに かかわらず、データ内の本のタイトルを見つけます。情報が正確にどのように記録されたかを 判定するには、クエリは2つの代替に異なる変数を使用できます。

PREFIX dc10:  <http://purl.org/dc/elements/1.0/>
PREFIX dc11:  <http://purl.org/dc/elements/1.1/>

SELECT ?x ?y
WHERE  { { ?book dc10:title ?x } UNION { ?book dc11:title  ?y } }
x y
"SPARQL (updated)"
"SPARQL Protocol Tutorial"
"SPARQL"
"SPARQL Query Language Tutorial"

これにより、UNIONの左分岐からの解では変数xが 束縛され、右分岐からの解ではyが束縛された結果が返されます。 UNIONパターンのどちらの部分も一致しない場合、そのグラフ・ パターンは一致しません。

UNIONパターンはグラフ・パターンを組み合わせます。各代替可能性は 複数のトリプル・パターンを含むことができます。

PREFIX dc10:  <http://purl.org/dc/elements/1.0/>
PREFIX dc11:  <http://purl.org/dc/elements/1.1/>

SELECT ?title ?author
WHERE {
    { ?book dc10:title ?title .  ?book dc10:creator ?author }
      UNION
    { ?book dc11:title ?title .  ?book dc11:creator ?author }
}
title author
"SPARQL Query Language Tutorial" "Alice"
"SPARQL Protocol Tutorial" "Bob"

このクエリは、同じバージョンのDublin Coreからのタイトル述語と作成者述語の両方を 持つ場合にのみ本に一致します。

8. 否定

SPARQLクエリ言語は、2つの形式の否定を組み込みます。1つは、フィルター対象の クエリ解の文脈でグラフ・パターンが一致するかどうかに応じて結果をフィルタリングするもの、 もう1つは、別のパターンに関連する解を除去するものです。

8.1 グラフ・パターンを用いた フィルタリング

クエリ解のフィルタリングは、FILTER式内で NOT EXISTSおよびEXISTSを用いて行われます。 フィルター・スコープ規則は、 フィルターが現れるグループ全体に適用されることに注意してください。

8.1.1 パターンが 存在しないことのテスト

NOT EXISTSフィルター式は、フィルターが現れるグループ・グラフ・ パターン内の変数の値が与えられたとき、グラフ・パターンがデータセットに 一致しないかどうかをテストします。追加の束縛は生成しません。

データ:

PREFIX  :       <http://example/>
PREFIX  rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  foaf:   <http://xmlns.com/foaf/0.1/>

:alice  rdf:type   foaf:Person .
:alice  foaf:name  "Alice" .
:bob    rdf:type   foaf:Person .

クエリ:

PREFIX  rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX  foaf:   <http://xmlns.com/foaf/0.1/> 

SELECT ?person
WHERE 
{
    ?person rdf:type  foaf:Person .
    FILTER NOT EXISTS { ?person foaf:name ?name }
}

クエリ結果:

person
<http://example/bob>

8.1.2 パターンが 存在することのテスト

フィルター式EXISTSも提供されています。これはパターンがデータ内で 見つかるかどうかをテストします。追加の束縛は生成しません。

クエリ:

PREFIX  rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX  foaf:   <http://xmlns.com/foaf/0.1/> 

SELECT ?person
WHERE {
    ?person rdf:type  foaf:Person .
    FILTER EXISTS { ?person foaf:name ?name }
}

クエリ結果:

person
<http://example/alice>

8.2 可能な解の除去

SPARQLで提供されるもう1つの否定形式はMINUSです。これは両方の 引数を評価し、その後、左辺の解のうち右辺の解と互換でないものを計算します。

データ:
PREFIX :       <http://example/>
PREFIX foaf:   <http://xmlns.com/foaf/0.1/>

:alice  foaf:givenName "Alice" ;
        foaf:familyName "Smith" .

:bob    foaf:givenName "Bob" ;
        foaf:familyName "Jones" .

:carol  foaf:givenName "Carol" ;
        foaf:familyName "Smith" .
クエリ:
PREFIX :       <http://example/>
PREFIX foaf:   <http://xmlns.com/foaf/0.1/>

SELECT DISTINCT ?s
WHERE {
    ?s ?p ?o .
    MINUS {
        ?s foaf:givenName "Bob" .
    }
}

結果:

s
<http://example/carol>
<http://example/alice>

8.3 NOT EXISTSとMINUSの関係および相違

NOT EXISTSMINUSは、否定について考える2つの方法を表します。 1つは、クエリ・パターンによってすでに決定された束縛が与えられたとき、 データ内にパターンが存在するかどうかをテストするものです。もう1つは、2つの パターンの評価に基づいて一致を除去するものです。場合によっては異なる答えを 生成することがあります。

8.3.1 例: 変数の共有

PREFIX : <http://example/>
:a :b :c .
SELECT * { 
    ?s ?p ?o
    FILTER NOT EXISTS { ?x ?y ?z }
}

は、解を持たない結果セットに評価されます。これは、任意の?s ?p ?oに 対して{ ?x ?y ?z }が一致するため、 NOT EXISTS { ?x ?y ?z }がすべての解を除去するからです。

s p o

一方、MINUSでは、最初の部分(?s ?p ?o)と 2番目の部分(?x ?y ?z)の間に共有変数がないため、束縛は 除去されません。

SELECT * { 
    ?s ?p ?o 
    MINUS 
    { ?x ?y ?z }
}

結果:

s p o
<http://example/a> <http://example/b> <http://example/c>

8.3.2 例: 固定パターン

別のケースとして、例に具象パターン(変数なし)がある場合があります。

PREFIX : <http://example/>
SELECT * {  
    ?s ?p ?o 
    FILTER NOT EXISTS { :a :b :c }
}

は、クエリ解を持たない結果セットに評価されます。

結果:
s p o

一方、

PREFIX : <http://example/>
SELECT * 
{ 
    ?s ?p ?o 
    MINUS { :a :b :c }
}

は、1つのクエリ解を持つ結果セットに評価されます。

結果:

s p o
<http://example/a> <http://example/b> <http://example/c>

これは、束縛の一致がないため、解が除去されないからです。

8.3.3 例: 内側のFILTER

フィルター内では、グループの変数がスコープ内に あるため、相違も生じます。 この例では、NOT EXISTS内のFILTERは、 検討中の解に対する?nの値にアクセスできます。

PREFIX : <http://example.com/>
:a :p 1 .
:a :q 1 .
:a :q 2 .

:b :p 3.0 .
:b :q 4.0 .
:b :q 5.0 .

FILTER NOT EXISTSを使用する場合、テストは ?x :p ?nに対する各可能な解に対して行われます。

PREFIX : <http://example.com/>
SELECT * WHERE {
    ?x :p ?n
    FILTER NOT EXISTS {
        ?x :q ?m .
        FILTER(?n = ?m)
    }
}
x n
<http://example.com/b> 3.0

一方、MINUSでは、パターン内のFILTERは ?nの値を持たず、常に未束縛です。

PREFIX : <http://example/>
SELECT * WHERE {
    ?x :p ?n
    MINUS {
        ?x :q ?m .
        FILTER(?n = ?m)
    }
}
x n
<http://example.com/b> 3.0
<http://example.com/a> 1

9. プロパティ・パス

プロパティ・パスは、2つのグラフ・ノード間でグラフを通る可能な経路です。 自明な場合は、長さが正確に1のプロパティ・パスであり、これはトリプル・パターンです。 パスの両端はRDF用語または変数であってかまいません。変数はパス自体の一部としては 使用できず、両端にのみ使用できます。

プロパティ・パスにより、一部のSPARQL基本グラフ・パターンをより簡潔に表現でき、 また任意長のパスによって2つのリソースの接続性を照合する能力も追加されます。

9.1 プロパティ・パス構文

以下の説明では、iri完全に書かれたIRIまたは 接頭辞付き名前で省略されたIRI、あるいはキーワードaです。 elt はパス要素であり、それ自体がパス構造から構成されていてもかまいません。

構文形式 プロパティ・パス式名 一致対象
iri PredicatePath IRI。長さ1のパス。
^elt InversePath 逆パス(目的語から主語へ)。
elt1 / elt2 SequencePath elt1の後にelt2が続く連続パス。
elt1 | elt2 AlternativePath elt1またはelt2の代替パス(すべての 可能性が試行される)。
elt* ZeroOrMorePath eltの0回以上の一致によって、パスの主語と目的語を 接続するパス。
elt+ OneOrMorePath eltの1回以上の一致によって、パスの主語と目的語を 接続するパス。
elt? ZeroOrOnePath eltの0回または1回の一致によって、パスの主語と目的語を 接続するパス。
!iri or !(iri1| ...|irin) NegatedPropertySet 否定プロパティ集合。iriiのいずれでもないIRI。 !iri!(iri)の短縮形です。
!^iri or !(^iri1| ...|^irin) NegatedPropertySet 除外される一致が逆パスに基づく否定プロパティ集合。
すなわち、逆パスとしてのiri1...irinの いずれでもないもの。 !^iri!(^iri)の短縮形です。
!(iri1| ...|irij|^irij+1| ...|^irin) NegatedPropertySet 否定プロパティ集合における順方向および逆方向プロパティの組み合わせ。
(elt)   グループ化されたパスelt。括弧は優先順位を制御します。

否定プロパティ集合内のIRIおよび逆IRIの順序には意味がなく、混在した順序で 出現できます。

構文形式の優先順位は、高いものから低いものへ次のとおりです。

グループ内では、優先順位は左から右です。

9.2

代替: 一方または両方の可能性に一致する

{ :book1 dc:title|rdfs:label ?displayString }

これは次のようにも書けます。

{ 
   :book1 <http://purl.org/dc/elements/1.1/title> | <http://www.w3.org/2000/01/rdf-schema#label> ?displayString
}

連続: Aliceが知っている任意の人物の名前を見つける。

{
    ?x foaf:mbox <mailto:alice@example> .
    ?x foaf:knows/foaf:name ?name .
}

連続: 2つの「foaf:knows」リンク先にいる人物の名前を見つける。

{ 
    ?x foaf:mbox <mailto:alice@example> .
    ?x foaf:knows/foaf:knows/foaf:name ?name .
}

これは次のSPARQLクエリと同じです。

SELECT ?x ?name {
    ?x  foaf:mbox <mailto:alice@example> .
    ?x  foaf:knows [ foaf:knows [ foaf:name ?name ]]. 
}

または、明示的な変数を用いると次のようになります。

SELECT ?x ?name {
    ?x  foaf:mbox <mailto:alice@example> .
    ?x  foaf:knows ?a1 .
    ?a1 foaf:knows ?a2 .
    ?a2 foaf:name ?name .
}

重複のフィルタリング: Aliceが知っている人物がAlice自身を知っている可能性も十分あるため、 上の例にはAlice自身が含まれる場合があります。これは次のようにして避けられます。

{ ?x foaf:mbox <mailto:alice@example> .
  ?x foaf:knows/foaf:knows ?y .
  FILTER ( ?x != ?y )
  ?y foaf:name ?name 
}

逆プロパティ・パス: これら2つは同じクエリです。2番目はプロパティの方向を逆にして、 主語と目的語の役割を入れ替えているだけです。

{ ?x foaf:mbox <mailto:alice@example> }
{ <mailto:alice@example> ^foaf:mbox ?x }

逆パス連続: ある?xが知っている人を知っている、すべての人物を見つける。

{
  ?x foaf:knows/^foaf:knows ?y .  
  FILTER(?x != ?y)
}

これは(?gen1がシステム生成変数であるとして)次と等価です。

{
  ?x foaf:knows ?gen1 .
  ?y foaf:knows ?gen1 .  
  FILTER(?x != ?y)
}

任意長照合: foaf:knowsによってAliceから到達できる すべての人物の名前を見つける。

{
  ?x foaf:mbox <mailto:alice@example> .
  ?x foaf:knows+/foaf:name ?name .
}

任意長パス内の代替:

{ ?ancestor (ex:motherOf|ex:fatherOf)+ <#me> }

任意長パス照合: 限定的な推論のいくつかの形式も可能です。 たとえばRDFSについて、あるリソースのすべての型および上位型を取得できます。

{ <http://example/thing> rdf:type/rdfs:subClassOf* ?type }

すべてのリソースと、それらの推論されたすべての型:

{ ?x rdf:type/rdfs:subClassOf* ?type }

サブプロパティ:

{ ?x ?p ?v . ?p rdfs:subPropertyOf* :property }

否定プロパティ・パス: rdf:typeによってではなく、どちらの向きでも接続されている ノードを見つける。

{ ?x !(rdf:type|^rdf:type) ?y }

RDFコレクション内の要素:

{ :list rdf:rest*/rdf:first ?element }

注: このパス式は結果の順序を保証しません。

9.3 プロパティ・パスと 等価なパターン

SPARQLプロパティ・パスは、RDFトリプルを名前付き辺を持つ有向で循環し得る グラフとして扱います。プロパティ・パス式の評価は重複を導くことがあります。これは、 等価なパターンで導入される変数が結果の一部ではなく、また他の場所ですでに 使用されていないためです。それらは、クエリで与えられた変数だけに結果を暗黙的に 投影することによって隠されます。

たとえば、次のデータに対して:

PREFIX :       <http://example/>

:order  :item :z1 .
:order  :item :z2 .

:z1 :name "Small" .
:z1 :price 5 .

:z2 :name "Large" .
:z2 :price 5 .

クエリ:

PREFIX :   <http://example/>
SELECT * 
{  ?s :item/:price ?x . }

結果:

s x
<http://example/order> 5
<http://example/order> 5

一方、クエリを中間変数(?_a)を含めて書き出した場合、 結果内のどの行も重複しません。

PREFIX :   <http://example/>
SELECT * 
{  ?s :item ?_a .
   ?_a :price ?x .
}

結果:

s _a x
<http://example/order> <http://example/z1> 5
<http://example/order> <http://example/z2> 5

グラフ・パターンとの等価性は、クエリが集約操作も含む場合に特に重要です。 注文の総額は次で求められます。

PREFIX :   <http://example/>
SELECT (sum(?x) AS ?total) { 
    :order :item/:price ?x
}
total
10

9.4 任意長パス照合

任意長のプロパティ・パスによる主語と目的語の接続性は、「0回以上」の プロパティ・パス演算子*、および「1回以上」の プロパティ・パス演算子+を用いて見つけられます。 「0回または1回」の接続性プロパティ・パス演算子?もあります。

これらの各演算子は、演算子によって制限される回数だけパス・ステップを用いて、 主語と目的語の間の接続を見つけようとするためにプロパティ・パス式を使用します。

たとえば、リソースの上位型を含め、リソースの可能なすべての型を見つけることは、 次のように実現できます。

PREFIX  rdfs:   <http://www.w3.org/2000/01/rdf-schema#> . 
PREFIX  rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?x ?type
{ 
    ?x rdf:type/rdfs:subClassOf* ?type
}

同様に、:xfoaf:knows関係を介して接続する すべての人物を見つけるには、

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX :     <http://example/>
SELECT ?person
{ 
    :x foaf:knows+ ?person
}

このような接続性照合は、繰り返されるパス自体がそうでなければ重複を生じる場合でも、 重複を導入しません(接続を行う方法の数を取り込みません)。

照合されるグラフには循環が含まれる場合があります。接続性照合は、循環の照合が 未定義または無限の結果を導かないように定義されています。

10. 割り当て

式の値は、新しい変数をその式の値、すなわちRDF用語に束縛することで、 解マッピングに追加できます。その変数は、その後クエリ内で使用でき、 結果でも返すことができます。

これを可能にする構文形式は3つあります。BINDキーワードSELECT節内の式、および GROUP BY節内の式です。割り当て形式は (expression AS ?var)です。

式の評価がエラーを生成した場合、その解について変数は未束縛のままになりますが、 クエリ評価は継続します。

インラインデータとして VALUESを用いることで、データをクエリに直接含めることもできます。

10.1 BIND: 変数への割り当て

BIND形式により、基本グラフ・パターンまたはプロパティ・パス式から 変数へ値を割り当てることができます。BINDを使用すると、その前の基本グラフ・ パターンは終了します。BIND節によって導入される変数は、BINDでの 使用時点までに、グループ・グラフ・パターン内で使用されていてはなりません。

例:

データ:

PREFIX dc:   <http://purl.org/dc/elements/1.1/>
PREFIX :     <http://example.org/book/>
PREFIX ns:   <http://example.org/ns#>

:book1  dc:title     "SPARQL Tutorial" .
:book1  ns:price     42 .
:book1  ns:discount  0.2 .

:book2  dc:title     "The Semantic Web" .
:book2  ns:price     23 .
:book2  ns:discount  0.25 .

クエリ:

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>

SELECT  ?title ?price
{   
    ?x ns:price ?p .
    ?x ns:discount ?discount
    BIND (?p*(1-?discount) AS ?price)
    FILTER(?price < 20)
    ?x dc:title ?title . 
}

等価なクエリ(BINDは基本グラフ・パターンを終了し、 FILTERはグループ・グラフ・パターン全体に適用されます):

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>

SELECT  ?title ?price
{  { ?x ns:price ?p .
     ?x ns:discount ?discount
     BIND (?p*(1-?discount) AS ?price)
    }
    {?x dc:title ?title . }
    FILTER(?price < 20)
}

結果:

title price
 "The Semantic Web" 17.25

10.2 VALUES: インラインデータの提供

データは、グラフ・パターン内に直接書くことも、VALUESを用いて クエリに追加することもできます。VALUESは、 解列としてインラインデータを提供し、これは 結合操作によってクエリ評価の結果と組み合わされます。 アプリケーションがクエリ結果に対する特定の要件を提供するためにも、 SERVICEキーワードを通じてフェデレーテッドクエリを 提供するSPARQLクエリエンジン実装が、より制約されたクエリをリモート・クエリサービスへ 送信するためにも使用できます。

10.2.1 VALUES構文

VALUESでは、データブロック内で複数の変数を指定できます。 1つの変数といくつかの値だけを指定する一般的な場合のために、特別な構文があります。

次の例には、?x?yという2つの変数の表があります。2行目には?yの値がありません。

VALUES (?x ?y) {
    (:uri1 1)
    (:uri2 UNDEF)
}

任意で、単一の変数といくつかの値がある場合:

VALUES ?z { "abc" "def" }

これは一般形式を用いることと同じです。

VALUES (?z) { ("abc") ("def") }

同じ変数をVALUES節の変数リスト内で複数回言及することはできないことに注意してください。

10.2.2 VALUESの例

VALUESデータブロックは、クエリ・パターン内、または サブクエリを含むSELECTクエリの末尾に現れることができます。

データ:

PREFIX dc:   <http://purl.org/dc/elements/1.1/>
PREFIX :     <http://example.org/book/>
PREFIX ns:   <http://example.org/ns#>

:book1  dc:title  "SPARQL Tutorial" .
:book1  ns:price  42 .
:book2  dc:title  "The Semantic Web" .
:book2  ns:price  23 .

クエリ:

PREFIX dc:   <http://purl.org/dc/elements/1.1/> 
PREFIX :     <http://example.org/book/> 
PREFIX ns:   <http://example.org/ns#> 

SELECT ?book ?title ?price
{
    VALUES ?book { :book1 :book3 }
    ?book dc:title ?title ;
          ns:price ?price .
}

結果:

book title price
<http://example.org/book/book1> "SPARQL Tutorial" 42

VALUES節内の特定の解について変数に値がない場合、 RDF用語の代わりにキーワードUNDEFが用いられます。

PREFIX dc:   <http://purl.org/dc/elements/1.1/> 
PREFIX :     <http://example.org/book/> 
PREFIX ns:   <http://example.org/ns#> 

SELECT ?book ?title ?price
{
    ?book dc:title ?title ;
          ns:price ?price .
    VALUES (?book ?title) {
        (UNDEF "SPARQL Tutorial")
        (:book2 UNDEF)
    }
}
book title price
<http://example.org/book/book1> "SPARQL Tutorial" 42
<http://example.org/book/book2> "The Semantic Web" 23

この例では、VALUESSELECTクエリの結果に対して 実行するよう指定することもできました。

PREFIX dc:   <http://purl.org/dc/elements/1.1/> 
PREFIX :     <http://example.org/book/> 
PREFIX ns:   <http://example.org/ns#> 

SELECT ?book ?title ?price {
    ?book dc:title ?title ;
          ns:price ?price .
}
VALUES (?book ?title) {
    (UNDEF "SPARQL Tutorial")
    (:book2 UNDEF)
}

これは異なるクエリですが、この例の状況では同じ結果を持ちます。

11. 集約

集約は、解のグループに対して式を適用します。既定では、解集合は すべての解を含む単一のグループで構成されます。

グループ化は、GROUP BY構文を用いて指定できます。

SPARQLのバージョン1.1で定義された集約は、COUNTSUMMINMAXAVGGROUP_CONCAT、および SAMPLEです。

集約は、問い合わせる者が、単一の解ではなく解のグループに対して計算される 結果を見たい場合に使用されます。たとえば、特定の変数が取る各値を個別に見るのではなく、 その最大値を見る場合です。

11.1 集約の例

データ:

PREFIX : <http://books.example/>

:org1 :affiliates :auth1, :auth2 .
:auth1 :writesBook :book1, :book2 .
:book1 :price 9 .
:book2 :price 5 .
:auth2 :writesBook :book3 .
:book3 :price 7 .
:org2 :affiliates :auth3 .
:auth3 :writesBook :book4 .
:book4 :price 7 .

クエリ:

PREFIX : <http://books.example/>
SELECT (SUM(?lprice) AS ?totalPrice)
WHERE {
    ?org :affiliates ?auth .
    ?auth :writesBook ?book .
    ?book :price ?lprice .
}
GROUP BY ?org
HAVING (SUM(?lprice) > 10)

結果:

totalPrice
21

この例は、集約の2つの機能を示しています。GROUP BYは、 1つ以上の式(この場合は?org)に従ってクエリ解をグループ化し、 HAVINGFILTER式に類似していますが、個々の解ではなく グループに対して作用します。

この例は、GROUP BY式に従って解をグループ化し (すなわち、?orgが特定の値を取るすべての解が同じグループ内に現れます)、 そのグループに対して集合関数SUMを評価することによって生成されます。 その後、グループはHAVING式によってフィルタリングされ、 SUM(?lprice)が10より大きくないすべてのグループが除去されます。

集約クエリおよびサブクエリでは、クエリ・パターンに現れるが GROUP BY節には含まれない変数は、集約されている場合にのみ、 投影またはSELECT式内で使用できます。この目的にはSAMPLE集約を 使用できます。詳細については、投影制約の節を参照してください。

関数の場合と同様に、集約式をクエリまたはサブクエリから 投影するには、(BIND節と同様に、キーワードASを用いて) 別名を付ける必要があることに注意してください。上の例では、変数 ?totalPriceを用いてこれを行っています。他の集約投影または WHERE節で既に使用されている名前を持つ変数へ集約を投影することはエラーです。

11.2 GROUP BY

解に対する集約値を計算するには、まず解を1つ以上のグループに分割し、 各グループについて集約値を計算します。

SELECTHAVING、または ORDER BYのクエリレベルで集約が使用されているが、 GROUP BY項が使用されていない場合、これはすべての解が属する 単一の暗黙的グループとして扱われます。

GROUP BY節内では、GROUP BY (?x + ?y AS ?z)のように、 束縛キーワードASを使用できます。これは { ... BIND (?x + ?y AS ?z) } GROUP BY ?zと等価です。

たとえば、解列S( {?x→2, ?y→3}, {?x→2, ?y→5}, {?x→6, ?y→7} )が与えられたとき、 解を?xの値に従ってグループ化し、各グループについて ?yの値の平均を計算したい場合があります。

これは次のように書けます。

SELECT (AVG(?y) AS ?avg)
WHERE {
    ?a :x ?x ;
    :y ?y .
}
GROUP BY ?x

11.3 HAVING

HAVINGは、FILTERがグループ化されていない解集合に対して 作用するのと同じように、グループ化された解集合に対して作用します。

HAVING式は、次の節で説明されるように、グループ化された クエリからの投影と同じ評価規則を持ちます。

HAVINGの使用例を以下に示します。

PREFIX : <http://data.example/>
SELECT (AVG(?size) AS ?asize)
WHERE {
    ?x :size ?size
}
GROUP BY ?x
HAVING(AVG(?size) > 10)

これは、主語でグループ化された平均サイズを返しますが、平均サイズが 10より大きい場合に限ります。

11.4 集約投影 制約

グループ化を使用するクエリレベル(明示的なGROUP BY節の使用によるもの、 または投影、HAVING、もしくはORDER BY節内での集約の使用によるもの)では、 そのクエリレベルの投影またはSELECT式に現れる変数のすべての出現は、 次の条件のいずれかを満たさなければなりません

そのような変数の出現がこれらの条件のいずれも満たさない場合、そのクエリは 構文的に無効です。

たとえば、次のクエリは、?xがGROUP BY項として与えられているため 正当です。

PREFIX : <http://example.com/data/#>
SELECT ?x (MIN(?y) * 2 AS ?min)
WHERE {
    ?x :p ?y .
    ?x :q ?z .
} GROUP BY ?x (STR(?z))

STR(?z)を投影することは正当ではないことに注意してください。この式は単純な 変数でも、名前付きGROUP BY式でもないためです。しかし、 GROUP BY ?x (STR(?z) AS ?strZ)を用いれば、 ?strZを投影することが可能です。

上記の条件を満たさない変数を使用するその他の式は、SAMPLE集約を用いて そのグループから投影できます。

11.5 集約の例(エラーあり)

この節では、集約を使用するクエリ例を示し、集約が存在する場合に 結果内でエラーがどのように扱われるかを示します。

データ:

PREFIX : <http://example.com/data/#>

:x :p 1, 2, 3, 4 .
:y :p 1, _:b2, 3, 4 .
:z :p 1.0, 2.0, 3.0, 4 .

クエリ:

PREFIX : <http://example.com/data/#>
SELECT ?g (AVG(?p) AS ?avg) ((MIN(?p) + MAX(?p)) / 2 AS ?c)
WHERE {
    ?g :p ?p .
}
GROUP BY ?g

結果:

g avg c
<http://example.com/data/#x> 2.5 2.5
<http://example.com/data/#y>
<http://example.com/data/#z> 2.5 2.5

:yグループの束縛は、Avg({1, _:b2, 3, 4})および (_:b2 + 4) / 2の評価がエラーとなり、その束縛が解から除去されるため、 結果に含まれないことに注意してください。

12. サブクエリ

サブクエリは、SPARQLクエリを他のクエリ内に埋め込む方法であり、通常は クエリ内の何らかの部分式からの結果数を制限するなど、他の方法では達成できない 結果を達成するために用いられます。

SPARQLクエリ評価のボトムアップな性質により、サブクエリは論理的に 先に評価され、その結果が外側のクエリへ投影されます。

サブクエリから投影された変数のみが、外側のクエリに対して可視、すなわち スコープ内になることに注意してください。

12.1

データ:

PREFIX : <http://people.example/>

:alice :name "Alice", "Alice Foo", "A. Foo" .
:alice :knows :bob, :carol .
:bob :name "Bob", "Bob Bar", "B. Bar" .
:carol :name "Carol", "Carol Baz", "C. Baz" .

Aliceを知っており、名前を持つすべての人物について、名前(ソート順が最も低いもの)を返します。

クエリ:

PREFIX : <http://people.example/>
PREFIX : <http://people.example/>

SELECT ?y ?minName
WHERE {
    :alice :knows ?y .
    {
      SELECT ?y (MIN(?name) AS ?minName)
      WHERE {
          ?y :name ?name .
      } GROUP BY ?y
    }
}

結果:

y minName
:bob "B. Bar"
:carol "C. Baz"

この結果は、まず内側のクエリを評価することによって達成されます。

SELECT ?y (MIN(?name) AS ?minName)
WHERE {
    ?y :name ?name .
} GROUP BY ?y

これは次の解列を生成します。

y minName
:alice "A. Foo"
:bob "B. Bar"
:carol "C. Baz"

これは外側のクエリの結果と結合されます。

y
:bob
:carol

13. RDFデータセット

RDFデータモデルは、主語、述語、目的語を持つトリプルからなるグラフとして情報を表現します。 多くのRDFデータストアは複数のRDFグラフを保持し、各グラフに関する情報を記録します。 これにより、アプリケーションは複数のグラフからの情報を含むクエリを行うことができます。

SPARQLクエリは、グラフの集合を表す RDFデータセット [RDF12-CONCEPTS]に対して実行されます。 RDFデータセットは、名前を持たないデフォルトグラフである1つのグラフと、 0個以上の名前付きグラフから構成されます。各名前付きグラフは、IRIまたは空白ノードによって識別されます。 SPARQLクエリは、 13.3 データセットのクエリ節で説明されるように、 クエリ・パターンの異なる部分を異なるグラフに対して照合できます。

RDFデータセットは、0個の名前付きグラフを含む場合があります。RDFデータセットは常に1つの デフォルトグラフを含みます。クエリはデフォルトグラフの照合を含む必要はなく、 名前付きグラフの照合だけを含めることもできます。

基本グラフ・パターンの照合に使用されるグラフは、アクティブグラフです。 前の節では、すべてのクエリは、RDFデータセットのデフォルトグラフである単一のグラフを アクティブグラフとして実行されるものとして示されました。GRAPHキーワードは、 クエリの一部について、アクティブグラフをデータセット内の名前付きグラフのいずれかにするために使用されます。

13.1 RDFデータセットの例

RDFデータセットの定義 [RDF12-CONCEPTS]は、名前付きグラフと デフォルトグラフの関係を制限しません。情報は異なるグラフで繰り返されることがあり、 グラフ間の関係が公開されることもあります。有用な2つの構成は次のとおりです。

例1:
PREFIX dc: <http://purl.org/dc/elements/1.1/>

<http://example.org/bob>    dc:publisher  "Bob" .
<http://example.org/alice>  dc:publisher  "Alice" .

GRAPH <http://example.org/bob> {
    _:a foaf:name "Bob" .
    _:a foaf:mbox <mailto:bob@oldcorp.example.org> .
}

GRAPH <http://example.org/alice> {
    _:a foaf:name "Alice" .
    _:a foaf:mbox <mailto:alice@work.example.org> .
}

この例では、デフォルトグラフには2つの名前付きグラフの公開者の名前が含まれます。 この例では、名前付きグラフ内のトリプルはデフォルトグラフでは可視ではありません。

例2:

RDFデータは、グラフの RDFマージ [RDF12-SEMANTICS]によって 結合できます。RDFデータセット内のグラフの1つの可能な構成は、 デフォルトグラフを、名前付きグラフ内の一部または全部の情報のRDFマージにすることです。

次の例では、名前付きグラフには以前と同じトリプルが含まれます。RDFデータセットは、 空白ノードを区別したまま、名前付きグラフの RDFマージを デフォルトグラフに含みます。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

_:x foaf:name "Bob" .
_:x foaf:mbox <mailto:bob@oldcorp.example.org> .

_:y foaf:name "Alice" .
_:y foaf:mbox <mailto:alice@work.example.org> .

GRAPH <http://example.org/bob> {
    _:a foaf:name "Bob" .
    _:a foaf:mbox <mailto:bob@oldcorp.example.org> .
}

GRAPH <http://example.org/alice> {
    _:a foaf:name "Alice" .
    _:a foaf:mbox <mailto:alice@work.example> .
}

RDFマージでは、マージされたグラフ内の空白ノードは、マージ対象のグラフ由来の 空白ノードとは共有されません。

13.2 RDFデータセットの指定

SPARQLクエリは、RDFデータセットを記述するためにFROM節および FROM NAMED節を用いることで、照合に使用するデータセットを指定できます。 クエリがそのようなデータセット記述を提供する場合、クエリ内にデータセット記述が 提供されないときにクエリサービスが使用する任意のデータセットの代わりに、それが使用されます。 RDFデータセットは SPARQLプロトコル要求で 指定されることもあり、 その場合、プロトコル記述はクエリ自体の任意の記述を上書きします。クエリサービスは、 データセット記述がそのサービスにとって受け入れられない場合、クエリ要求を拒否できます。

FROMおよびFROM NAMEDキーワードにより、クエリは 参照によってRDFデータセットを指定できます。これらは、与えられたIRI(すなわち、 与えられたIRI参照の絶対形式)によって識別されるリソースの表現から取得される グラフをデータセットが含むべきであることを示します。複数のFROM節および FROM NAMED節から得られるデータセットは次のとおりです。

FROM節がなく、1つ以上のFROM NAMED節がある場合、 データセットはデフォルトグラフとして空グラフを含みます。

13.2.1 デフォルト グラフの指定

FROM節は、デフォルトグラフを形成するために使用される グラフを示すIRIを含みます。これは、そのグラフを名前付きグラフとして入れるものではありません。

この例では、RDFデータセットは単一のデフォルトグラフを含み、名前付き グラフを含みません。

# Default graph (located at http://example.org/foaf/aliceFoaf)
PREFIX  foaf:  <http://xmlns.com/foaf/0.1/>

_:a  foaf:name     "Alice" .
_:a  foaf:mbox     <mailto:alice@work.example> .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT  ?name
FROM    <http://example.org/foaf/aliceFoaf>
WHERE   { ?x foaf:name ?name }
name
"Alice"

クエリがデフォルトグラフを示すために複数のIRIを提供する複数の FROM節を提供する場合、デフォルトグラフは、与えられたIRIによって識別される リソースの表現から取得されたグラフの RDFマージです。

13.2.2 名前付きグラフの指定

クエリは、FROM NAMED節を用いて、RDFデータセット内の名前付きグラフのIRIを供給できます。 各IRIは、RDFデータセット内で1つの名前付きグラフを提供するために使用されます。 同じIRIを2つ以上のFROM NAMED節で使用すると、そのIRIを持つ 1つの名前付きグラフがデータセット内に現れます。

# Graph: http://example.org/bob
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

_:a foaf:name "Bob" .
_:a foaf:mbox <mailto:bob@oldcorp.example.org> .
# Graph: http://example.org/alice
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example> .
...
FROM NAMED <http://example.org/alice>
FROM NAMED <http://example.org/bob>
...

FROM NAMED構文は、IRIが対応するグラフを識別することを示唆しますが、 RDFデータセット内のIRIとグラフの関係は間接的です。 IRIはリソースを識別し、そのリソースはグラフによって(より正確には、 グラフをシリアル化する文書によって)表現されます。 詳細については [WEBARCH]を参照してください。

13.2.3 FROMと FROM NAMEDの組み合わせ

FROM節とFROM NAMED節は同じクエリ内で使用できます。

# Default graph (located at http://example.org/dft.ttl)
PREFIX dc: <http://purl.org/dc/elements/1.1/>

<http://example.org/bob>    dc:publisher  "Bob Hacker" .
<http://example.org/alice>  dc:publisher  "Alice Hacker" .
# Named graph: http://example.org/bob
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

_:a foaf:name "Bob" .
_:a foaf:mbox <mailto:bob@oldcorp.example.org> .
# Named graph: http://example.org/alice
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example.org> .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

SELECT ?who ?g ?mbox
FROM <http://example.org/dft.ttl>
FROM NAMED <http://example.org/alice>
FROM NAMED <http://example.org/bob>
WHERE
{
    ?g dc:publisher ?who .
    GRAPH ?g { ?x foaf:mbox ?mbox }
}

このクエリのRDFデータセットは、デフォルトグラフと2つの名前付きグラフを含みます。 GRAPHキーワードについては以下で説明します。

データセットを構築するために必要な動作は、データセット記述だけでは決定されません。 データセット記述でIRIが2回与えられる場合、2つのFROM節を使用する場合でも、 FROM節とFROM NAMED節を使用する場合でも、 そのIRIに関連付けられたRDFグラフを取得する試行が正確に1回または正確に2回行われるとは 仮定されません。したがって、データセット記述内の2つの出現から取得されたトリプル内の 空白ノード同一性について、いかなる仮定もできません。一般に、グラフの等価性についても いかなる仮定もできません。

13.3 データセットのクエリ

グラフの集合をクエリする場合、名前付きグラフに対してパターンを照合するために GRAPHキーワードが用いられます。GRAPHは、1つのグラフを選択するための IRIを提供することも、クエリのRDFデータセット内のすべての名前付きグラフのIRIを範囲とする 変数を使用することもできます。

GRAPHを使用すると、クエリのその部分内でグラフ・パターンを照合するための アクティブグラフが変わります。GRAPHの使用外では、デフォルトグラフを用いて 照合が行われます。

次の2つのグラフを例で使用します。

# Named graph: http://example.org/foaf/aliceFoaf
PREFIX  foaf:     <http://xmlns.com/foaf/0.1/>
PREFIX  rdf:      <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  rdfs:     <http://www.w3.org/2000/01/rdf-schema#>

_:a  foaf:name     "Alice" .
_:a  foaf:mbox     <mailto:alice@work.example> .
_:a  foaf:knows    _:b .

_:b  foaf:name     "Bob" .
_:b  foaf:mbox     <mailto:bob@work.example> .
_:b  foaf:nick     "Bobby" .
_:b  rdfs:seeAlso  <http://example.org/foaf/bobFoaf> .

<http://example.org/foaf/bobFoaf>
rdf:type      foaf:PersonalProfileDocument .
# Named graph: http://example.org/foaf/bobFoaf
PREFIX  foaf:     <http://xmlns.com/foaf/0.1/>
PREFIX  rdf:      <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  rdfs:     <http://www.w3.org/2000/01/rdf-schema#>

_:z  foaf:mbox     <mailto:bob@work.example> .
_:z  rdfs:seeAlso  <http://example.org/foaf/bobFoaf> .
_:z  foaf:nick     "Robert" .

<http://example.org/foaf/bobFoaf>
        rdf:type      foaf:PersonalProfileDocument .

13.3.1 グラフ名へのアクセス

下のクエリは、データセット内の各名前付きグラフに対してグラフ・パターンを照合し、 照合されているグラフのIRIにsrc変数が束縛された解を形成します。 グラフ・パターンは、アクティブグラフがデータセット内の各名前付きグラフであるものとして 照合されます。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?src ?bobNick
FROM NAMED <http://example.org/foaf/aliceFoaf>
FROM NAMED <http://example.org/foaf/bobFoaf>
WHERE
{
    GRAPH ?src
    { ?x foaf:mbox <mailto:bob@work.example> .
      ?x foaf:nick ?bobNick
    }
}

クエリ結果は、情報が見つかったグラフの名前とBobのニックネームの値を示します。

src bobNick
<http://example.org/foaf/aliceFoaf> "Bobby"
<http://example.org/foaf/bobFoaf> "Robert"

13.3.2 グラフIRIによる制限

クエリは、グラフIRIを供給することで、特定のグラフに適用される照合を 制限できます。これにより、アクティブグラフはそのIRIによって名付けられたグラフに設定されます。 このクエリは、グラフhttp://example.org/foaf/bobFoaf内に与えられたBobの ニックネームを探します。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX data: <http://example.org/foaf/>

SELECT ?nick
FROM NAMED <http://example.org/foaf/aliceFoaf>
FROM NAMED <http://example.org/foaf/bobFoaf>
WHERE
{
    GRAPH data:bobFoaf {
        ?x foaf:mbox <mailto:bob@work.example> .
        ?x foaf:nick ?nick 
    }
}

これは単一の解を生成します。

nick
"Robert"

13.3.3 可能な グラフIRIの制限

GRAPH節で使用される変数は、別の GRAPH節内、またはデータセット内のデフォルトグラフに対して照合される グラフ・パターン内でも使用できます。

下のクエリは、IRIhttp://example.org/foaf/aliceFoafを持つグラフを用いて、 Bobのプロフィール文書を見つけ、その後そのグラフに対して別のパターンを照合します。 2番目のGRAPH節のパターンは、最初のGRAPH節で見つかった (変数whom)のメールボックス(変数mboxで与えられるもの)と 同じメールボックスを持つ人物の空白ノード(変数w)を見つけます。 これは、AliceのFOAFファイルから変数whomに一致するために使用された 空白ノードが、プロフィール文書内の空白ノードと同じではないためです (それらは異なるグラフ内にあります)。

PREFIX  data:  <http://example.org/foaf/>
PREFIX  foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX  rdfs:  <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?mbox ?nick ?ppd
FROM NAMED <http://example.org/foaf/aliceFoaf>
FROM NAMED <http://example.org/foaf/bobFoaf>
WHERE {
    GRAPH data:aliceFoaf {
        ?alice foaf:mbox <mailto:alice@work.example> ;
               foaf:knows ?whom .
        ?whom  foaf:mbox ?mbox ;
               rdfs:seeAlso ?ppd .
        ?ppd  a foaf:PersonalProfileDocument .
    }
    GRAPH ?ppd {
        ?w foaf:mbox ?mbox ;
           foaf:nick ?nick
    }
}
mbox nick ppd
<mailto:bob@work.example> "Robert" <http://example.org/foaf/bobFoaf>

AliceのFOAFファイル内でBobのnickを与える任意のトリプルは、 Bobのニックネームを提供するためには使用されません。これは、変数nickを含む パターンが、ppdによって特定の個人プロフィール文書に制限されているためです。

13.3.4 名前付きグラフとデフォルトグラフ

クエリ・パターンは、デフォルトグラフと名前付きグラフの両方を含むことができます。 この例では、アグリゲーターが2つの異なる機会にWebリソースを読み込んでいます。 各回でグラフがアグリゲーターに読み込まれると、ローカルシステムによってIRIが与えられます。 グラフはほぼ同じですが、"Bob"のメールアドレスが変更されています。

この例では、デフォルトグラフが来歴情報を記録するために使用されており、 実際に読み込まれたRDFデータは、それぞれシステムによって異なるIRIが与えられた 2つの別個のグラフに保持されています。RDFデータセットは、2つの名前付きグラフと それらに関する情報から構成されます。

RDFデータセット:

# Default graph
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX g:  <tag:example.org,2005-06-06:>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

g:graph1 dc:publisher "Bob" .
g:graph1 dc:date "2004-12-06"^^xsd:date .

g:graph2 dc:publisher "Bob" .
g:graph2 dc:date "2005-01-10"^^xsd:date .
# Graph: locally allocated IRI: tag:example.org,2005-06-06:graph1
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example> .

_:b foaf:name "Bob" .
_:b foaf:mbox <mailto:bob@oldcorp.example.org> .
# Graph: locally allocated IRI: tag:example.org,2005-06-06:graph2
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example> .

_:b foaf:name "Bob" .
_:b foaf:mbox <mailto:bob@newcorp.example.org> .

このクエリは、人物の名前と情報が発見された日付を詳述して、メールアドレスを見つけます。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc:   <http://purl.org/dc/elements/1.1/>

SELECT ?name ?mbox ?date
WHERE {
   ?g dc:publisher ?name ;
      dc:date ?date .
   GRAPH ?g { 
       ?person foaf:name ?name ; foaf:mbox ?mbox
   }
}

結果は、"Bob"のメールアドレスが変更されたことを示しています。

name mbox date
"Bob" <mailto:bob@oldcorp.example.org> "2004-12-06"^^xsd:date
"Bob" <mailto:bob@newcorp.example.org> "2005-01-10"^^xsd:date

14. 基本フェデレーテッドクエリ

この文書は、SPARQLフェデレーション拡張の構文を取り込みます。

この機能は、文書SPARQL 1.1フェデレーテッドクエリで定義されています。

15. 解列および修飾子

クエリ・パターンは、順序付けされていない解の集合を生成します。各 は、変数からRDF 用語への部分関数です。これらの解はその後、列(解列)として扱われます。初期状態では特定の 順序はありません。その後、任意の列修飾子が適用されて別の列が作成されます。最後に、 この後者の列は、SPARQL クエリ形式の結果の1つを生成するために使用されます。

解列修飾子は次のいずれかです。

修飾子は、上のリストで示された順序で適用されます。

15.1 ORDER BY

ORDER BY節は、解列の順序を確立します。

ORDER BY節の後には、式と任意の順序修飾子(ASC()または DESC()のいずれか)から構成される順序比較子の列が続きます。 各順序比較子は、昇順(ASC()修飾子または修飾子なしで示される)または 降順(DESC()修飾子で示される)のいずれかです。

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>

SELECT ?name
WHERE { ?x foaf:name ?name }
ORDER BY ?name
PREFIX     :    <http://example.org/ns#>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>

SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp }
ORDER BY DESC(?emp)
PREFIX     :    <http://example.org/ns#>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>

SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp }
ORDER BY ?name DESC(?emp)

「<」演算子演算子 マッピングおよび演算子の拡張性を参照)は、 numericsxsd:stringsxsd:booleansおよびxsd:dateTimesの対の 相対順序を定義します。IRIの対は、データ型xsd:stringのリテラルとして 比較することで順序付けられます。

SPARQLはまた、そうでなければ順序付けられないいくつかの種類のRDF用語の間に 順序を定めます。

  1. (最小)この解で変数または式に値が割り当てられていない。
  2. 空白ノード
  3. IRI
  4. RDFリテラル
  5. トリプル用語

SPARQLは、すべての可能なRDF用語の全順序を定義しません。実装は 演算子の拡張性を通じて全順序を定義できます。以下は、 相対順序が未定義である用語の対のいくつかの例です。

この変数束縛のリストは昇順です。

RDF用語 理由
未束縛の結果は最も早くソートされます。
_:z 空白ノードは未束縛の後に続きます。
_:a 空白ノード間には相対順序がありません。
<http://script.example/Latin> IRIは空白ノードの後に続きます。
<http://script.example/Кириллица> 23番目の位置にある文字「К」はUnicodeコードポイント0x41Aを持ち、 0x4C("L")より大きい。
<http://script.example/漢字> 23番目の位置にある文字「漢」はUnicodeコードポイント0x6F22を持ち、 0x41A("К")より大きい。
"http://script.example/Latin" xsd:stringsはIRIの後に続きます。

順序比較子に関する2つの解の昇順は、解の束縛を式に代入し、 それらを「<」演算子で比較することによって確立されます。 降順は昇順の逆です。

2つの解の相対順序は、列内の最初の順序比較子に関する2つの解の相対順序です。 解束縛の代入が同じRDF用語を生成する解については、順序は 次の順序比較子に関する2つの解の相対順序です。2つの解について評価された順序式が 区別できるRDF用語を生成しない場合、2つの解の相対順序は未定義です。

解の列を順序付けると、常に同じ数の解を含む列になります。

CONSTRUCTまたはDESCRIBEクエリの解列に ORDER BYを使用しても、直接的な効果はありません。これは、 SELECTだけが結果の列を返すためです。LIMITおよび OFFSETと組み合わせて使用すると、ORDER BYは、解列の別の スライスから生成された結果を返すために使用できます。ASKクエリには ORDER BYLIMITまたはOFFSETは含まれません。

15.2 投影

解列は、変数の部分集合だけを含むものへ変換できます。列内の各解について、 SELECTクエリ形式を用いて、指定された変数の選択を使用する新しい解が形成されます。

次の例は、FOAFプロパティを用いてRDFグラフ内に記述された人々の名前だけを 抽出するクエリを示しています。

PREFIX foaf:        <http://xmlns.com/foaf/0.1/>

_:a  foaf:name       "Alice" .
_:a  foaf:mbox       <mailto:alice@work.example> .

_:b  foaf:name       "Bob" .
_:b  foaf:mbox       <mailto:bob@work.example> .
PREFIX foaf:       <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE
{ ?x foaf:name ?name }
name
"Bob"
"Alice"

15.3 重複する解

DISTINCTまたはREDUCEDクエリ修飾子を持たない解列は、 重複する解を保持します。

データ:

PREFIX  foaf:  <http://xmlns.com/foaf/0.1/>

_:x    foaf:name   "Alice" .
_:x    foaf:mbox   <mailto:alice@example.com> .

_:y    foaf:name   "Alice" .
_:y    foaf:mbox   <mailto:asmith@example.com> .

_:z    foaf:name   "Alice" .
_:z    foaf:mbox   <mailto:alice.smith@example.com> .

クエリ:

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
SELECT ?name WHERE { ?x foaf:name ?name }

結果:

name
"Alice"
"Alice"
"Alice"

修飾子DISTINCTおよびREDUCEDは、重複が クエリ結果に含まれるかどうかに影響します。

DISTINCT

DISTINCT解修飾子は、重複する解を除去します。 同じ変数を同じRDF用語に束縛する解は、1つの解だけが クエリから返されます。

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?name WHERE { ?x foaf:name ?name }
name
"Alice"

解列修飾子の順序に従い、 重複はlimitまたはoffsetのいずれかが適用される前に除去されることに注意してください。

REDUCED

DISTINCT修飾子は重複する解が解集合から 除去されることを保証しますが、REDUCEDは単にそれらが 除去されることを許可します。REDUCED 解集合内の任意の解の多重度は少なくとも1であり、かつ DISTINCTまたはREDUCED修飾子を持たない解集合内での その解の多重度を超えません。たとえば、上のデータを使用すると、クエリ

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
SELECT REDUCED ?name WHERE { ?x foaf:name ?name }

は、1個、2個(ここに示す)または3個の解を持つ場合があります。

name
"Alice"
"Alice"

15.4 OFFSET

OFFSETは、生成される解が指定された数の解の後から開始するようにします。 OFFSETが0の場合、効果はありません。

LIMITおよびOFFSETを使用してクエリ解の異なる部分集合を選択することは、 ORDER BYを用いて順序を予測可能にしない限り、有用ではありません。

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>

SELECT  ?name
WHERE   { ?x foaf:name ?name }
ORDER BY ?name
LIMIT   5
OFFSET  10

15.5 LIMIT

LIMIT節は、返される解の数に上限を設定します。 OFFSETが適用された後の実際の解の数がlimitより大きい場合、 高々limit個の解が返されます。

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>

SELECT ?name
WHERE { ?x foaf:name ?name }
LIMIT 20

LIMITが0の場合、結果は返されません。limitは 負であってはなりません。

16. クエリ形式

SPARQLには4つのクエリ形式があります。これらのクエリ形式は、パターン照合からの解を用いて 結果セットまたはRDFグラフを形成します。クエリ形式は次のとおりです。

SELECT
クエリ・パターン照合で束縛された変数のすべて、またはその部分集合を返します。
CONSTRUCT
トリプル・テンプレートの集合内の変数を代入することによって構築されたRDFグラフを返します。
ASK
クエリ・パターンが一致するかどうかを示すブール値を返します。
DESCRIBE
見つかったリソースを記述するRDFグラフを返します。

SPARQL 1.1クエリ結果JSON形式SPARQL クエリ結果XML形式(第2版)、または SPARQL 1.1クエリ結果CSVおよびTSV 形式などの形式を使用して、 SELECTクエリからの結果セット、またはASKクエリのブール結果を シリアル化できます。

16.1 SELECT

SELECT形式の結果は、変数とその束縛を直接返します。これは、 必要な変数を投影する操作と、新しい変数束縛をクエリ解へ導入する操作を組み合わせます。

16.1.1 投影

SELECT節に変数名のリストが与えられると、特定の変数とその束縛が返されます。 構文SELECT *は、その時点でクエリ内にスコープ内にある すべての変数を選択する省略形です。 これは、FILTER内でのみ使用される変数、MINUSの右辺で 使用される変数を除外し、サブクエリを考慮します。

SELECT *の使用は、クエリがグループ化を使用しない場合にのみ許可されます (GROUP BY節の使用によるもの、またはHAVINGもしくは ORDER BY節に集約が存在することによるもののいずれもない場合)。

PREFIX  foaf:  <http://xmlns.com/foaf/0.1/>

_:a    foaf:name   "Alice" .
_:a    foaf:knows  _:b .
_:a    foaf:knows  _:c .

_:b    foaf:name   "Bob" .

_:c    foaf:name   "Clare" .
_:c    foaf:nick   "CT" .
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
SELECT ?nameX ?nameY ?nickY
WHERE
{ ?x foaf:knows ?y ;
  foaf:name ?nameX .
  ?y foaf:name ?nameY .
  OPTIONAL { ?y foaf:nick ?nickY }
}
nameX nameY nickY
"Alice" "Bob"
"Alice" "Clare" "CT"

結果セットはローカルAPIによってアクセスできますが、JSON、XML、CSV、またはTSVのいずれかへ シリアル化することもできます。

SPARQL 1.1クエリ結果JSON 形式:

{
    "head": {
        "vars": [ "nameX" , "nameY" , "nickY" ]
    } ,
    "results": {
        "bindings": [
          {
            "nameX": { "type": "literal" , "value": "Alice" } ,
            "nameY": { "type": "literal" , "value": "Bob" }
          } ,
          {
            "nameX": { "type": "literal" , "value": "Alice" } ,
            "nameY": { "type": "literal" , "value": "Clare" } ,
            "nickY": { "type": "literal" , "value": "CT" }
          }
        ]
    }
}

SPARQLクエリ結果XML形式 (第2版):

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="nameX"/>
<variable name="nameY"/>
<variable name="nickY"/>
</head>
<results>
<result>
<binding name="nameX">
<literal>Alice</literal>
</binding>
<binding name="nameY">
<literal>Bob</literal>
</binding>
</result>
<result>
<binding name="nameX">
<literal>Alice</literal>
</binding>
<binding name="nameY">
<literal>Clare</literal>
</binding>
<binding name="nickY">
<literal>CT</literal>
</binding>
</result>
</results>
</sparql>

16.1.2 SELECT式

パターン照合からどの変数を結果に含めるかを選ぶだけでなく、 SELECT節は新しい変数を導入することもできます。SELECT式における割り当て規則は、 BINDにおける割り当てと同じです。式は、クエリ解内に既にある変数束縛、または SELECT節内でより前に定義された変数束縛を組み合わせ、クエリ解内に束縛を生成します。

(expr AS v)のスコープ付けは直ちに適用されます。SELECT 式では、変数は同じSELECT節内の後続の式で使用できますが、同じ SELECT節内で再び割り当てることはできません。

例:

データ:

PREFIX dc:   <http://purl.org/dc/elements/1.1/>
PREFIX :     <http://example.org/book/>
PREFIX ns:   <http://example.org/ns#>

:book1  dc:title  "SPARQL Tutorial" .
:book1  ns:price  42 .
:book1  ns:discount 0.2 .

:book2  dc:title  "The Semantic Web" .
:book2  ns:price  23 .
:book2  ns:discount 0.25 .

クエリ:

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>
SELECT  ?title (?p*(1-?discount) AS ?price)
{ ?x ns:price ?p .
  ?x dc:title ?title . 
  ?x ns:discount ?discount 
}

結果:

title price
"The Semantic Web" 17.25
"SPARQL Tutorial" 33.6

新しい変数は、同じSELECT節内で構文上より前に導入されている場合、 式内でも使用できます。

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>
SELECT  ?title (?p AS ?fullPrice) (?fullPrice*(1-?discount) AS ?customerPrice)
{ ?x ns:price ?p .
  ?x dc:title ?title . 
  ?x ns:discount ?discount 
}

結果:

title fullPrice customerPrice
"The Semantic Web" 23 17.25
"SPARQL Tutorial" 42 33.6

16.2 CONSTRUCT

CONSTRUCTクエリ形式は、グラフ・テンプレートによって指定された単一のRDFグラフを 返します。結果は、解列内の各クエリ解を取り、グラフ・テンプレート内の変数を代入し、 集合和によってトリプルを単一のRDFグラフに結合することで形成されたRDFグラフです。

そのようなインスタンス化によって、未束縛変数、または主語もしくは述語位置のリテラルなど 不正なRDF構造を含むトリプルが生成される場合、そのトリプルは出力RDFグラフに 含まれません。グラフ・テンプレートは、変数を持たないトリプル(グラウンド・トリプルまたは 明示的トリプルとして知られる)を含むことができ、これらもCONSTRUCTクエリ形式によって 返される出力RDFグラフに現れます。

「集合和」による結果グラフの構築は、 重複したトリプルがグラフのシリアル化に現れるかどうかを強制しません。 実装は、重複トリプルを生成することも、それらを重複排除することも許可されます。

PREFIX  foaf:  <http://xmlns.com/foaf/0.1/>

_:a    foaf:name   "Alice" .
_:a    foaf:mbox   <mailto:alice@example.org> .
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
PREFIX vcard:   <http://www.w3.org/2001/vcard-rdf/3.0#>
CONSTRUCT   { <http://example.org/person#Alice> vcard:FN ?name }
WHERE       { ?x foaf:name ?name }

FOAF情報からvcardプロパティを作成します。

PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>

<http://example.org/person#Alice> vcard:FN "Alice" .

16.2.1 空白ノードを含む テンプレート

テンプレートは、空白ノードを含むRDFグラフを作成できます。 テンプレート内の空白ノード識別子は、各解について テンプレートにスコープを持ちますが、クエリ解からの空白ノードは スコープを持ちません。 同じ識別子がテンプレート内に2回現れる場合、すべての出現は、 各クエリ解ごとに作成される同じ空白ノードに置き換えられ、 異なるクエリ解によって生成されたトリプルについては異なる空白ノードになります。

PREFIX  foaf:  <http://xmlns.com/foaf/0.1/>

_:a    foaf:givenname   "Alice" .
_:a    foaf:family_name "Hacker" .

_:b    foaf:firstname   "Bob" .
_:b    foaf:surname     "Hacker" .
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
PREFIX vcard:   <http://www.w3.org/2001/vcard-rdf/3.0#>

CONSTRUCT {
     ?x  vcard:N _:v .
    _:v vcard:givenName ?gname .
    _:v vcard:familyName ?fname
} WHERE {
    { ?x foaf:firstname ?gname } UNION  { ?x foaf:givenname   ?gname } .
    { ?x foaf:surname   ?fname } UNION  { ?x foaf:family_name ?fname } .
}

FOAF情報に対応するvcardプロパティを作成します。

PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>

_:a vcard:N         _:v1 .
_:v1 vcard:givenName  "Alice" .
_:v1 vcard:familyName "Hacker" .

_:b vcard:N         _:v2 .
_:v2 vcard:givenName  "Bob" .
_:v2 vcard:familyName "Hacker" .

テンプレート内の識別子_:vを持つ空白ノードは、 テンプレートが2つのクエリ解のそれぞれに適用されるとき、 異なる空白ノードに置き換えられます。 この例では、これによりテンプレートは、結果グラフ内で 識別子_:v1および_:v2を持つ空白ノードを 生成します。

識別子_:aおよび_:bで示される クエリ解内の空白ノードは、基礎となるRDFデータセットに由来し、 変更されません。

16.2.2 RDFデータセット内の グラフへのアクセス

CONSTRUCTを使用すると、対象RDFデータセットからグラフの一部または全体を 抽出できます。この最初の例は、IRIラベルhttp://example.org/aGraphを持つ グラフ(それがデータセット内にある場合)を返します。そうでない場合は、空の グラフを返します。

CONSTRUCT { ?s ?p ?o } WHERE { GRAPH <http://example.org/aGraph> { ?s ?p ?o } . }

グラフへのアクセスは、他の情報を条件にすることができます。たとえば、 デフォルトグラフがデータセット内の名前付きグラフに関するメタデータを含む場合、 次のようなクエリは、名前付きグラフに関する情報に基づいて1つのグラフを抽出できます。

PREFIX  dc: <http://purl.org/dc/elements/1.1/>
PREFIX app: <http://example.org/ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

CONSTRUCT { ?s ?p ?o } WHERE
{
    GRAPH ?g { ?s ?p ?o } .
    ?g dc:publisher <http://www.w3.org/> .
    ?g dc:date ?date .
    FILTER ( app:customDate(?date) > "2005-02-28T00:00:00Z"^^xsd:dateTime ) .
}

ここでapp:customDateは、日付形式をxsd:dateTimeRDF用語へ変換する 拡張 関数を識別します。

16.2.3 解修飾子 とCONSTRUCT

クエリの解修飾子は、CONSTRUCTクエリの結果に影響します。 この例では、CONSTRUCTテンプレートからの出力グラフは、 グラフ・パターン照合からの解のうち2つだけから導出されます。クエリは、 ヒット数で評価された上位2サイトの人々の名前を持つグラフを出力します。 RDFグラフ内のトリプルは順序付けされません。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX site: <http://example.org/stats#>

_:a foaf:name "Alice" .
_:a site:hits 2349 .

_:b foaf:name "Bob" .
_:b site:hits 105 .

_:c foaf:name "Eve" .
_:c site:hits 181 .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX site: <http://example.org/stats#>

CONSTRUCT { [] foaf:name ?name }
WHERE
{ [] foaf:name ?name ;
  site:hits ?hits .
}
ORDER BY desc(?hits)
LIMIT 2
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
_:x foaf:name "Alice" .
_:y foaf:name "Eve" .

16.2.4 CONSTRUCT WHERE

CONSTRUCTクエリ形式の短縮形は、テンプレートとパターンが同じであり、 そのパターンが単なる基本グラフ・パターンである場合に提供されます(短縮形では FILTERも複雑なグラフ・パターンも許可されません)。 短縮形ではキーワードWHEREが必須です。

次の2つのクエリは同じです。1つ目は2つ目の短縮形です。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
CONSTRUCT WHERE { ?x foaf:name ?name }
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

CONSTRUCT { ?x foaf:name ?name } 
WHERE
{ ?x foaf:name ?name }

16.3 ASK

アプリケーションは、クエリ・パターンに解があるかどうかをテストするために ASK形式を使用できます。可能なクエリ解に関する情報は返されず、 解が存在するかどうかだけが返されます。

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>

_:a  foaf:name       "Alice" .
_:a  foaf:homepage   <http://work.example.org/alice/> .

_:b  foaf:name       "Bob" .
_:b  foaf:mbox       <mailto:bob@work.example> .
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
ASK  { ?x foaf:name  "Alice" }
true

この結果セットのSPARQLクエリ結果XML形式(第2 版)形式は次を与えます。

<?xml version="1.0"?>
                <sparql xmlns="http://www.w3.org/2005/sparql-results#">
                <head></head>
                <boolean>true</boolean>
                </sparql>

同じデータに対して、Aliceのmboxが 言及されていないため、次は一致を返しません。

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
ASK  {
   ?x foaf:name  "Alice" ;
      foaf:mbox  <mailto:alice@work.example>
}
false

16.4 DESCRIBE(参考)

DESCRIBE形式は、リソースに関するRDFデータを含む単一の結果RDFグラフを 返します。このデータはSPARQLクエリによって規定されるものではありません。そこでは クエリ・クライアントがデータソース内のRDF構造を知っている必要がありますが、 代わりにSPARQLクエリ処理系によって決定されます。クエリ・パターンは結果セットを 作成するために使用されます。DESCRIBE形式は、解で識別された各リソースを、 IRIで直接名付けられた任意のリソースとともに取り、対象RDFデータセットを含む 利用可能な任意の情報から来る「記述」を取ることで、単一のRDFグラフを組み立てます。 その記述はクエリサービスによって決定されます。構文DESCRIBE *は、 クエリ内のすべての変数を記述する省略形です。

16.4.1 明示的なIRI

DESCRIBE節自体は、リソースを識別するためにIRIを取ることができます。 最も単純なDESCRIBEクエリは、DESCRIBE 節内の単なるIRIです。

DESCRIBE <http://example.org/>

16.4.2 リソースの識別

記述されるリソースは、結果セット内のクエリ変数への束縛から取ることもできます。 これにより、データセット内でIRIによって識別されているか空白ノードによって 識別されているかに関係なく、リソースを記述できます。

PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
DESCRIBE ?x
WHERE    { ?x foaf:mbox <mailto:alice@org> }

プロパティfoaf:mboxは、FOAF語彙において逆関数プロパティとして 定義されています。そのように扱われる場合、このクエリは高々1人に関する情報を返します。 しかし、クエリ・パターンに複数の解がある場合、それぞれのRDFデータはすべての RDFグラフ記述の和集合です。

PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
DESCRIBE ?x
WHERE    { ?x foaf:name "Alice" }

複数のIRIまたは変数を与えることができます。

PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
DESCRIBE ?x ?y <http://example.org/>
WHERE    {?x foaf:knows ?y}

16.4.3 リソースの記述

返されるRDFは、情報公開者によって決定されます。それは、記述されるリソースに 関連するとサービスが判断する情報である場合があります。他のリソースに関する情報を 含む場合もあります。たとえば、本に関するRDFデータが著者に関する詳細も含むことがあります。

次のような単純なクエリは、

PREFIX ent:  <http://org.example.com/employees#>
DESCRIBE ?x WHERE { ?x ent:employeeId "1234" }

従業員の記述と、潜在的に有用ないくつかの他の詳細を返す場合があります。

PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
PREFIX vcard:  <http://www.w3.org/2001/vcard-rdf/3.0>
PREFIX exOrg:  <http://org.example.com/employees#>
PREFIX rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl:    <http://www.w3.org/2002/07/owl#>

_:a     exOrg:employeeId    "1234" ;
        foaf:mbox_sha1sum   "bee135d3af1e418104bc42904596fe148e90f033" ;
        vcard:N
          [ vcard:Family       "Smith" ;
            vcard:Given        "John"  ] .
foaf:mbox_sha1sum  rdf:type  owl:InverseFunctionalProperty .

これは、 vCard語彙 vcard:Nのための 空白ノード閉包を含みます。 返す情報を決定する他の可能な仕組みには、Concise Bounded Descriptions [CBD]が含まれます。

FOAFのような語彙では、リソースは典型的には空白ノードであるため、 foaf:mbox_sha1sumのようなInverseFunctionalPropertyと、 記録されている名前やその他の詳細のような情報を用いて、ノードを識別するのに十分な 情報を返すことが適切です。この例では、WHERE節への一致が 返されましたが、これは必須ではありません。

17. 式および値のテスト

SPARQLのFILTERsは、与えられた 制約に従って、グラフ・パターン照合の解を制限します。 具体的には、FILTERsは、式に代入されたときに実効ブール値 falseになるか、エラーを生成する任意の解を除去します。 実効ブール値は 実効ブール値節で定義され、 エラーは評価エラーで定義されます。

RDF リテラルは、 リテラルの値を決定するデータ型を持ちます。

PREFIX a:          <http://www.w3.org/2000/10/annotation-ns#>
PREFIX dc:         <http://purl.org/dc/elements/1.1/>

_:a   a:annotates   <http://www.w3.org/TR/rdf-sparql-query/> .
_:a   dc:date       "2004-12-31T19:00:00-05:00" .

_:b   a:annotates   <http://www.w3.org/TR/rdf-sparql-query/> .
_:b   dc:date       "2004-12-31T19:01:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> .

最初のdc:dateトリプルの目的語は、 データ型xsd:stringを持つリテラルです。 2番目はデータ型xsd:dateTimeを持ちます。 それらは異なる値を持つ異なる RDF用語です。

SPARQL式は文法に従って構築され、 関数(IRIで名前付けされる)および演算子関数(SPARQL文法内のキーワードと記号によって 呼び出される)へのアクセスを提供します。SPARQL演算子は、リテラルの値を比較するために 使用できます。

PREFIX a:      <http://www.w3.org/2000/10/annotation-ns#>
PREFIX dc:     <http://purl.org/dc/elements/1.1/>
PREFIX xsd:    <http://www.w3.org/2001/XMLSchema#>

SELECT ?annot
WHERE { ?annot  a:annotates  <http://www.w3.org/TR/rdf-sparql-query/> .
        ?annot  dc:date      ?date .
        FILTER ( ?date > "2005-01-01T00:00:00Z"^^xsd:dateTime ) 
}

SPARQL演算子は第17.3節に一覧されており、 文法内のそれぞれの生成規則と関連付けられています。

さらに、SPARQLは、第17.5節に一覧されている XPathキャスト関数の部分集合を含む、任意の関数を呼び出す能力を提供します。 これらの関数は、SPARQLクエリ内で名前(IRI)によって呼び出されます。例:

... FILTER ( xsd:dateTime(?date) < xsd:dateTime("2005-01-01T00:00:00Z") ) ...

表記上の規約: XPath演算子には接頭辞 op:が付けられます。XPath演算子には名前空間はありません。 op:はラベル付けの規約です。

SPARQLでは、XMLおよびXML Schemaに依存する XPath and XQuery Functions and Operators 3.1 [XPATH-FUNCTIONS-31]の定義は、 Extensible Markup Language (XML) 1.1 (Second Edition) [XML11]およびW3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes [XMLSCHEMA11-2]を 使用しなければなりません

XML 1.0と1.1、およびXML Schema 1.0と1.1の使用は、 XPath and XQuery Functions and Operators 3.1において 実装定義です。 これは特に、Extensible Markup Language (XML) 1.1 (Second Edition)でより一般的になっている Charの定義に影響します。

17.1 オペランドのデータ型

SPARQL関数および演算子は、RDF用語およびSPARQL変数に対して作用します。 これらの関数および演算子の部分集合は、XPath and XQuery Functions and Operators 3.1 [XPATH-FUNCTIONS-31]から取られ、 XML Schemaの 型付き 値の引数および返り値型を持ちます。これらの関数および演算子に引数として渡される RDF literalsは、lexical form文字列値と、 データ型IRIに対応する 原子データ型を持つ XML Schema型付き値へ対応付けられます。返される型付き値は、同じ方法で RDF literalsへ対応付けられます。

SPARQLには、RDF用語の特定の部分集合に作用する追加の演算子があります。 型を参照する場合、次の用語は、対応するW3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes [XMLSCHEMA11-2]の データ型 IRIを持つliteralを示します。

次の用語は、SPARQL値テストで使用される追加の型を識別します。

次の型はnumeric型から派生し、 numeric引数を取る関数および演算子への有効な引数です。

SPARQL言語拡張は、追加の型をXML Schemaデータ型から派生するものとして 扱ってもよいです。

17.2 式評価

SPARQL式は、 解マッピングに関して、 かつアクティブグラフを持つ RDFデータセットの文脈で評価されます。 そのような評価の結果は、 RDF 用語または エラーのいずれかです。

SPARQLは、 XPath and XQuery Functions and Operatorsによって定義される関数および演算子の部分集合を提供します。 次の規則は、XPath/XQueryとSPARQLのデータモデルおよび実行モデルの違いに対応します。

true(T)、false (F)、およびerror(E)に対する logical-andおよびlogical-orの真理値表は次のとおりです。

A B A || B A && B
T T T T
T F T F
F T T F
F F F F
T E T E
E T T E
F E E F
E F E F
E E E E

17.2.1 呼び出し

SPARQLは、引数リストに対して関数を呼び出すための構文を定義します。 特に明記されていない限り、これらは次のように呼び出されます。

  • 引数式が評価され、引数値が生成されます。引数評価の順序は定義されません。
  • 数値引数は、その関数または演算子に期待される型に合うよう必要に応じて昇格されます。
  • 関数または演算子は、引数値に対して呼び出されます。

これらの手順のいずれかが失敗した場合、呼び出しはエラーを生成します。 エラーの効果は17.2 式評価節で定義されます。

また、各形式で指定されるように、関数とは異なる評価規則を持つ 「関数形式」もあります。

17.2.2 評価エラー

式の評価は、 関数への引数が誤ったデータ型のリテラルである場合や、 引数が誤った種類の RDF用語である場合などに、 エラーを 導くことがあります。

式の評価がエラーを発生させる場合、その エラーを持つ式を含むすべての関数、演算子、および式の評価も エラーを発生させます。 一部の関数形式は、 その定義で説明されるようにエラーを処理します。

17.2.3 実効ブール値 (EBV)

実効ブール値は、 論理関数 logical-andlogical-or、 およびlogical-notへの引数を計算するため、ならびに FILTER式の結果を評価するために使用されます。

xsd:boolean  EBV (RDF term term)
  • 引数がxsd:booleanデータ型IRIを持つ リテラルであり、 有効な字句形式を持つ場合、EBV関数はその引数を返します。
  • 引数がnumeric型から派生するデータ型を持つ リテラルであり、 かつその引数が有効な字句形式を持つ場合、 オペランドの値がNaNであるか数値的に0に等しいなら、 EBV関数はリテラル"false"^^xsd:booleanを返します。 そうでなければ、EBV関数はリテラル"true"^^xsd:booleanを返します。
  • 引数が データ型IRI xsd:stringを持つ リテラルであり、その値が空文字列に等しい場合、 EBV関数はリテラル"false"^^xsd:booleanを返します。 そうでなければ、EBV関数はリテラル"true"^^xsd:booleanを返します。
  • 引数が、 データ型IRIに対して無効な字句形式を持つ リテラルである場合、 エラーを発生させます。
  • 引数が、xsd:booleanでも numericデータ型でも xsd:stringでもない データ型IRIを持つ リテラルである場合、 エラーを発生させます。
  • 引数が リテラルでない場合、 エラーを発生させます。
EBV値
EBV("true"^^xsd:boolean) true
EBV("") false
EBV("1"^^xsd:boolean) true
EBV(-2e10) true
EBV(-0) false
EBV(<http://example/>) error
EBV("2025-08-18"^^xsd:date) error

trueのEBVは、データ型IRIxsd:booleanと字句値"true"を 持つ リテラルとして表されます。 falseのEBVは、データ型IRIxsd:booleanと字句値"false"を持つ リテラルとして表されます。

17.3 演算子マッピング

SPARQL文法は、制約を構築するために使用される演算子の集合 (たとえば、&&*isIRI)を 識別します。次の表は、これらの各文法生成規則を、適切なオペランドおよび XPath and XQuery Functions and Operators 3.1 [XPATH-FUNCTIONS-31]または 第17.4節で指定されるSPARQL演算子のいずれかによって定義される 演算子関数と関連付けます。与えられたパラメータ集合に対する演算子定義を選択するときは、 最も具体的なパラメータを持つ定義が適用されます。たとえば、 xsd:integer = xsd:signedIntを評価する場合、 2つのRDF用語を持つ定義ではなく、 2つのnumericパラメータを持つ=の定義が適用されます。 表は、最上位の実行可能な候補が最も具体的になるよう配置されています。 適切なオペランドなしで呼び出された演算子は、 エラーになります。

SPARQLは、数値演算子への引数について、XPathの数値型昇格およびサブタイプ代入の仕組みに 従います。numericオペランド (xsd:integerxsd:decimalxsd:floatxsd:double、および numeric型から派生した型)のための XPath演算子マッピング規則は、 SPARQL演算子にも適用されます(数値型 昇格およびサブタイプ代入の定義については、 XML Path Language (XPath) 3.1 [XPATH-31]を参照)。 一部の演算子は、入れ子になった関数式、たとえば fn:not(op:numeric-equal(A, B))と関連付けられます。XPath定義に従い、 fn:notおよびop:numeric-equalは、その引数がエラーである場合に エラーを生成することに注意してください。

fn:compareの照合順序は、 XPathによって定義され、 http://www.w3.org/2005/xpath-functions/collation/codepointによって識別されます。 この照合順序は、コードポイント値に基づく文字列比較を可能にします。コードポイント文字列の 等価性は、RDF用語の等価性でテストできます。

SPARQL単項演算子
演算子 Type(A) 関数 結果型
XQuery単項演算子
! A xsd:boolean (EBV) logical-not(A) xsd:boolean
+ A numeric op:numeric-unary-plus(A) numeric
- A numeric op:numeric-unary-minus(A) numeric
SPARQL二項演算子
演算子 Type(A) Type(B) 関数 結果型
論理結合子
A || B xsd:boolean (EBV) xsd:boolean (EBV) logical-or(A, B) xsd:boolean
A && B xsd:boolean (EBV) xsd:boolean (EBV) logical-and(A, B) xsd:boolean
XPathテスト
A = B numeric numeric op:numeric-equal(A, B) xsd:boolean
A = B xsd:string xsd:string op:numeric-equal(fn:compare(STR(A), STR(B)), 0) xsd:boolean
A = B xsd:boolean xsd:boolean op:boolean-equal(A, B) xsd:boolean
A = B xsd:dateTime xsd:dateTime op:dateTime-equal(A, B) xsd:boolean
A != B numeric numeric fn:not(op:numeric-equal(A, B)) xsd:boolean
A != B xsd:string xsd:string fn:not(op:numeric-equal(fn:compare(STR(A), STR(B)), 0)) xsd:boolean
A != B xsd:boolean xsd:boolean fn:not(op:boolean-equal(A, B)) xsd:boolean
A != B xsd:dateTime xsd:dateTime fn:not(op:dateTime-equal(A, B)) xsd:boolean
A < B numeric numeric op:numeric-less-than(A, B) xsd:boolean
A < B xsd:string xsd:string op:numeric-equal(fn:compare(STR(A), STR(B)), -1) xsd:boolean
A < B xsd:boolean xsd:boolean op:boolean-less-than(A, B) xsd:boolean
A < B xsd:dateTime xsd:dateTime op:dateTime-less-than(A, B) xsd:boolean
A > B numeric numeric op:numeric-greater-than(A, B) xsd:boolean
A > B xsd:string xsd:string op:numeric-equal(fn:compare(STR(A), STR(B)), 1) xsd:boolean
A > B xsd:boolean xsd:boolean op:boolean-greater-than(A, B) xsd:boolean
A > B xsd:dateTime xsd:dateTime op:dateTime-greater-than(A, B) xsd:boolean
A <= B numeric numeric logical-or(op:numeric-less-than(A, B), op:numeric-equal(A, B)) xsd:boolean
A <= B xsd:string xsd:string fn:not(op:numeric-equal(fn:compare(STR(A), STR(B)), 1)) xsd:boolean
A <= B xsd:boolean xsd:boolean fn:not(op:boolean-greater-than(A, B)) xsd:boolean
A <= B xsd:dateTime xsd:dateTime fn:not(op:dateTime-greater-than(A, B)) xsd:boolean
A >= B numeric numeric logical-or(op:numeric-greater-than(A, B), op:numeric-equal(A, B)) xsd:boolean
A >= B xsd:string xsd:string fn:not(op:numeric-equal(fn:compare(STR(A), STR(B)), -1)) xsd:boolean
A >= B xsd:boolean xsd:boolean fn:not(op:boolean-less-than(A, B)) xsd:boolean
A >= B xsd:dateTime xsd:dateTime fn:not(op:dateTime-less-than(A, B)) xsd:boolean
XPath算術
A * B numeric numeric op:numeric-multiply(A, B) numeric
A / B numeric numeric op:numeric-divide(A, B) numeric。ただし両方のオペランドが xsd:integerの場合はxsd:decimal
A + B numeric numeric op:numeric-add(A, B) numeric
A - B numeric numeric op:numeric-subtract(A, B) numeric
SPARQLテスト
A = B IRI IRI sameTerm(A, B) xsd:boolean
A = B 空白ノード 空白ノード sameTerm(A, B) xsd:boolean
A = B トリプル用語 トリプル用語 ( A.subject = B.subject ) &&
( A.predicate = B.predicate ) &&
( A.object = B.object )
xsd:boolean
A != B IRI IRI fn:not(sameTerm(A, B)) xsd:boolean
A != B 空白ノード 空白ノード fn:not(sameTerm(A, B) xsd:boolean
A != B トリプル用語 トリプル用語 ( A.subject != B.subject ) ||
( A.predicate != B.predicate ) ||
( A.object != B.object )
xsd:boolean
A = B RDF term RDF term sameValue(A, B) xsd:boolean
A != B RDF term RDF term fn:not(sameValue(A, B)) xsd:boolean

"(EBV)"で示されたxsd:boolean関数引数は、 その引数の実効ブール値を評価することによって xsd:booleanへ強制変換されます。

トリプル用語に適用される 演算子=および!=は、 各構成要素に演算子を適用します。

17.3.1 演算子の拡張性

SPARQL言語拡張は、演算子と演算子関数との間に追加の関連付けを提供できます。 これは、上の表に行を追加することに相当します。追加の演算子は、 エラー以外の任意の結果を置き換える結果を 生成してはなりません。 この規則の帰結として、SPARQLのFILTERは、 拡張されていない実装と同じ中間束縛を、FILTER適用後に 少なくとも生成します。

'<'演算子の追加マッピングは、特にORDER BY節で使用される場合に、オペランドの相対順序を制御することが期待されます。

17.4 関数定義

この節では、SPARQLクエリ言語によって導入される演算子および関数を定義します。 例は、適切な文法構成によって呼び出された演算子の挙動を示します。

17.4.1 関数形式

17.4.1.1 BOUND
xsd:boolean  BOUND (variable var)

varが値に束縛されている場合はtrueを返します。 そうでない場合はfalseを返します。値NaNまたはINFを持つ変数は束縛されていると見なされます。

データ:

PREFIX foaf:        <http://xmlns.com/foaf/0.1/>
PREFIX dc:          <http://purl.org/dc/elements/1.1/>
PREFIX xsd:          <http://www.w3.org/2001/XMLSchema#>

_:a  foaf:givenName  "Alice".

_:b  foaf:givenName  "Bob" .
_:b  dc:date         "2005-04-04T04:04:04Z"^^xsd:dateTime .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc:   <http://purl.org/dc/elements/1.1/>
PREFIX xsd:   <http://www.w3.org/2001/XMLSchema#>
SELECT ?givenName
WHERE {
   ?x foaf:givenName  ?givenName .
   OPTIONAL { ?x dc:date ?date } .
   FILTER ( bound(?date) )
}

クエリ結果:

givenName
"Bob"

変数を導入する OPTIONALグラフ・パターンを指定し、 その変数が束縛されていないかどうかをテストすることで、 グラフ・パターンが表現されていないかどうかをテストできます。 これは論理プログラミングでは失敗による否定と呼ばれます。

このクエリは、nameを持つが、表現された date持たない人物に一致します。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc:   <http://purl.org/dc/elements/1.1/>
SELECT ?name
WHERE { 
    ?x foaf:givenName  ?name .
    OPTIONAL { ?x dc:date ?date } .
    FILTER (!bound(?date))
 }

クエリ結果:

name
"Alice"

Bobのdc:dateは既知であったため、"Bob"は このクエリの解ではありませんでした。

17.4.1.2 IF
rdfTerm  IF (expression1, expression2, expression3)

IF関数形式は、最初の引数を評価し、それを 実効ブール値として解釈して、EBVがtrueであれば expression2の値を返し、そうでなければ expression3の値を返します。expression2expression3のうち一方だけが評価されます。最初の引数の評価が エラーを発生させる場合、 IF式の評価についてエラーが発生します。

例: あるクエリ解において、?x2に束縛され、 ?z0に束縛され、 ?yが束縛されていないとします。

IF(?x = 2, "yes", "no") "yes"を返す
IF(bound(?y), "yes", "no") "no"を返す
IF(?x=2, "yes", 1/?z) "yes"を返し、式1/?zは評価されない
IF(?x=1, "yes", 1/?z) エラーを発生させる
IF("2" > 1, "yes", "no") エラーを発生させる
17.4.1.3 COALESCE
rdfTerm COALESCE(expression, ....)

COALESCE関数形式は、エラーなしで評価される最初の式の RDF用語値を返します。 SPARQLでは、未束縛変数を評価するとエラーが発生します。

どの式もエラーなしで評価されない場合、エラーが発生します。

式が0個の場合、エラーが発生します。

例: あるクエリ解において、?x = 2であり、?yが束縛されていないとします。

COALESCE(?x, 1/0) xの値である2を返す
COALESCE(1/0, ?x) 2を返す
COALESCE(5, ?x) 5を返す
COALESCE(?y, 3) 3を返す
COALESCE(?y) yが束縛されていないため、エラーを発生させる。
COALESCE() 引数が0個であるため、エラーを発生させる。
17.4.1.4 NOT EXISTSおよびEXISTS

グラフ・パターンを取るフィルター演算子EXISTSがあります。 EXISTSは、そのパターンが解マッピングとともに データセットに一致するかどうかに応じて、trueまたは falseを返します。 変数の追加の束縛は発生しません。NOT EXISTS形式は fn:not(EXISTS {...})に変換されます。

xsd:boolean  NOT EXISTS { pattern }

patternが一致する場合はfalseを返します。 そうでない場合はtrueを返します。

NOT EXISTS { pattern }fn:not(EXISTS { pattern })と等価です。

xsd:boolean EXISTS { pattern }

patternが一致する場合はtrueを返します。 そうでない場合はfalseを返します。

形式的には、EXISTS { pattern }形式である すべてのexprについて、 データセットDアクティブグラフGの文脈で、 解マッピングμに関して expr評価した結果は次のとおりです。

  • eval(D(G), A, μ)が空でない場合は"true"^^xsd:boolean
  • eval(D(G), A, μ)が空である場合は"false"^^xsd:boolean

ここでAは、18.3 代数構文への変換に従って { pattern }を変換することで得られる 代数クエリ式です。

文法ExistsFunc生成規則に従い、 { pattern }GroupGraphPattern 生成規則に一致します。 任意のGroupGraphPatternの変換を扱う 18.3 代数構文への変換の具体的な小節は、 18.3.2.6 グラフ・パターンの変換です。

17.4.1.5 logical-or
xsd:boolean logical-or (xsd:boolean left, xsd:boolean right)

この関数は式内で直接使用することはできません。 この関数の目的は、"||"演算子の意味論を定義することです。

この関数は、leftrightの論理ORを返します。 logical-orは、それぞれの引数の 実効ブール値に対して作用することに注意してください。

注: ||演算子によるエラーの扱いについては、 17.2 式評価節を参照してください。

17.4.1.6 logical-and
xsd:boolean logical-and (xsd:boolean left, xsd:boolean right)

この関数は式内で直接使用することはできません。 この関数の目的は、"&&" 演算子の意味論を定義することです。

この関数は、leftrightの論理ANDを返します。 logical-andは、それぞれの引数の 実効ブール値に対して作用することに注意してください。

注: &&演算子によるエラーの扱いについては、 17.2 式評価節を参照してください。

17.4.1.7 logical-not
xsd:boolean logical-not (xsd:boolean arg)

この関数は式内で直接使用することはできません。この 関数の目的は、"!"演算子の意味論を定義することです。

この関数は、argの論理NOTを返します。 logical-notは、その引数の 実効ブール値に対して作用することに注意してください。

17.4.1.8 IN
boolean  rdfTerm IN (expression, ...)

IN演算子は、左辺のRDF用語が右辺の式の値のリスト内に 見つかるかどうかをテストします。テストは"="演算子で行われ、 これは演算子マッピングによって決定される同じ値であるかを テストします。

右辺の用語が0個のリストは合法であり、falseに評価されます。

比較内のエラーは、テスト対象のRDF用語が用語のリスト内の他の場所で 見つからない場合、IN式にエラーを発生させます。

INrdfTermを生成する式とともに使用される場合、 その式はIN式を評価する前に1回だけ評価されます。

IN演算子は、次のSPARQL式と等価です。

(rdfTerm = value of expression1) || (rdfTerm = value of expression2) || ...

例:

2 IN (1, 2, 3) true
2 IN () false
2 IN (<http://example/iri>, "str", 2.0) true
2 IN (1/0, 2) true
2 IN (2, 1/0) true
2 IN (3, 1/0) エラーを発生させる
17.4.1.9 NOT IN
boolean  rdfTerm NOT IN (expression, ...)

NOT IN演算子は、左辺のRDF用語が右辺の式のリストの値内に 見つからないかどうかをテストします。テストは"!="演算子で行われ、 これは演算子マッピングによって決定されるように、 2つの値が同じ値でないことをテストします。

右辺の用語が0個のリストは合法であり、trueに評価されます。

NOT INrdfTermを生成する式とともに使用される場合、 その式はNOT IN式を評価する前に1回だけ評価されます。

比較内のエラーは、テスト対象のRDF用語が用語のリスト内の他の場所で 見つからない場合、NOT IN式にエラーを発生させます。

NOT IN演算子は、次のSPARQL式と等価です。

(rdfTerm != value of expression1) && (rdfTerm != value of expression2) && ...

NOT IN (...)!(IN (...))と等価です。

例:

2 NOT IN (1, 2, 3) false
2 NOT IN () true
2 NOT IN (<http://example/iri>, "str", 2.0) false
2 NOT IN (1/0, 2) false
2 NOT IN (2, 1/0) false
2 NOT IN (3, 1/0) エラーを発生させる

17.4.2 RDF用語に対する関数

17.4.2.1 sameTerm
xsd:boolean  sameTerm (RDF term term1, RDF term term2)

RDF 1.2 Concepts and Abstract Data Model [RDF12-CONCEPTS]で 定義されるように、term1term2が同じRDF用語であれば TRUEを返します。そうでなければFALSEを返します。

次のいずれかがtrueである場合、term1term2同じRDF用語です。

sameTerm(<http://example/>, <http://example/>) true
sameTerm(<http://example/>, <https://example/>) false
sameTerm("abc", "abc") true
sameTerm("abc"@en, "abc") false
sameTerm("abc"@en, "abc"@EN) true
sameTerm("abc"@en--rtl, "abc"@en) false
sameTerm(2, 2.0) false
sameTerm(2, "2"^^xsd:integer) true
sameTerm(2, "02"^^xsd:integer) false
17.4.2.2 sameValue

この関数は、SPARQL 1.1のRDFterm-equalを置き換えます。

xsd:boolean sameValue (RDF term term1, RDF term term2)

この関数は式内で直接使用することはできません。この関数の目的は、 17.3 演算子 マッピングの演算子マッピング表で扱われる具体的な場合に該当しない 2つのRDF用語に"="演算子が適用される場合の意味論を定義することです。

この関数の結果は、次の手順を進めることで決定されます。

  1. term1term2等しいRDF用語である場合、 TRUEを返します。
  2. term1またはterm2IRIまたは 空白ノードである場合、 FALSEを返します。
  3. term1term2のうち正確に一方だけが トリプル用語である場合、 FALSEを返します。
  4. term1term2の両方が トリプル用語である場合、 関数sameValueを各構成要素に対ごとに適用します。 各構成要素の対がTRUEを返す場合はTRUEを返し、 いずれかの構成要素の対がエラーを生成する場合は エラーを生成し、 そうでなければFALSEを返します。
  5. term1term2の両方が リテラルであり、 これらのリテラルの一方または両方が 不正型であることが分かっている場合、 エラーを生成します。
  6. "NaN"^^xsd:doubleおよび"NaN"^^xsd:floatは、 同じ値を表すものと見なされます。 term1term2が xsd:doubleまたはxsd:floatのいずれかでともに"NaN"である場合、 TRUEを返します。
  7. term1term2の両方が リテラルであり、 SPARQL処理系がそれらの値が等しいと判定できる場合、 TRUEを返します。
  8. term1term2の両方が リテラルであり、 SPARQL処理系がそれらの値が等しくないと判定できる場合、 FALSEを返します。
  9. そうでなければ、エラーを生成します。

2つの引数がリテラルである場合、関数sameValueは、 SPARQL処理系がこれらのリテラルの値が等しい、または等しくないと判定できる場合に、 trueまたはfalseを返します。 SPARQL処理系が確信できない場合は、errorを返します。

リテラルは、そのデータ型がSPARQL処理系によって扱われ、 その字句形式がそのデータ型の 字句空間内にない場合、 不正型です。

xsd:doubleおよびxsd:floatについて、+0-0および0は 同じ値です。

"="に対する演算子マッピングは、 op:numeric-equal 関数であり、これはNaNを含む引数を比較すると falseを返すよう定義されています。 しかし、sameTerm("NaN"^^xsd:double, "NaN"^^xsd:double)はtrueです。 関数sameValueは、 引数が値空間の同じ要素であるため、 sameValue("NaN"^^xsd:double, "NaN"^^xsd:double)を trueと定義します。 同様に、関数sameValuesameValue("NaN"^^xsd:float, "NaN"^^xsd:float)を trueと定義します。

sameValueは、"NaN"^^xsd:double"NaN"^^xsd:floatの値を同じ値として扱います。 sameValue("NaN"^^xsd:double, "NaN"^^xsd:float)および sameValue("NaN"^^xsd:float, "NaN"^^xsd:double)はいずれもtrueです。

例:

sameValue 結果
sameValue(1e10, "NaN"^^xsd:double) false
sameValue("NaN"^^xsd:double, "NaN"^^xsd:double) true
sameValue("NaN"^^xsd:double, "NaN"^^xsd:float) true
sameValue( <<(:s :p 123)>> , <<(:s :p 123.0)>> ) true

拡張された実装は、リテラルの追加データ型をサポートしてもよいです。 認識されないデータ型を持つリテラル (かつ同一でない字句形式およびデータ型IRI)について等価性をテストするクエリを 処理する実装は、比較されたリテラルの値が等価であるかどうかを判定できないことを示す エラーを返します。たとえば、拡張されていない実装は、 "iiii"^^my:romanNumeral = "iv"^^my:romanNumeralをテストするとエラーを生成します。

17.4.2.3 isIRI
xsd:boolean  isIRI (RDF term term)
xsd:boolean  isURI (RDF term term)

termIRIである場合はtrueを返します。 そうでない場合はfalseを返します。 isURIisIRI演算子の別表記です。

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>

_:a  foaf:name       "Alice".
_:a  foaf:mbox       <mailto:alice@work.example> .

_:b  foaf:name       "Bob" .
_:b  foaf:mbox       "bob@work.example" .

このクエリは、nameと、IRIであるmboxを 持つ人物に一致します。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE {
    ?x foaf:name  ?name ;
       foaf:mbox  ?mbox .
    FILTER isIRI(?mbox) 
}

クエリ結果:

name mbox
"Alice" <mailto:alice@work.example>
17.4.2.4 isBLANK
xsd:boolean  isBLANK (RDF term term)

term空白 ノードである場合はtrueを返します。 そうでない場合はfalseを返します。

PREFIX a:          <http://www.w3.org/2000/10/annotation-ns#>
PREFIX dc:         <http://purl.org/dc/elements/1.1/>
PREFIX foaf:       <http://xmlns.com/foaf/0.1/>

_:a   a:annotates   <http://www.w3.org/TR/rdf-sparql-query/> .
_:a   dc:creator    "Alice B. Toeclips" .

_:b   a:annotates   <http://www.w3.org/TR/rdf-sparql-query/> .
_:b   dc:creator    _:c .
_:c   foaf:given    "Bob".
_:c   foaf:family   "Smith".

このクエリは、FOAF語彙からの述語を用いて名前を表現する dc:creatorを持つ人物に一致します。

PREFIX a:      <http://www.w3.org/2000/10/annotation-ns#>
PREFIX dc:     <http://purl.org/dc/elements/1.1/>
PREFIX foaf:   <http://xmlns.com/foaf/0.1/>

SELECT ?given ?family
WHERE { 
    ?annot  a:annotates  <http://www.w3.org/TR/rdf-sparql-query/> .
    ?annot  dc:creator   ?c .
    OPTIONAL { ?c  foaf:given   ?given ; foaf:family  ?family } .
    FILTER isBLANK(?c)
}

クエリ結果:

given family
"Bob" "Smith"

この例では、dc:creator述語の目的語が2つありましたが、 そのうち1つ(_:c)だけが空白ノードでした。

17.4.2.5 isLITERAL
xsd:boolean  isLITERAL (RDF term term)

termリテラルである場合は trueを返します。 そうでない場合はfalseを返します。

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>
                
_:a  foaf:name       "Alice".
_:a  foaf:mbox       <mailto:alice@work.example> .

_:b  foaf:name       "Bob" .
_:b  foaf:mbox       "bob@work.example" .

このクエリは、17.4.2.1のものと似ていますが、 nameと、リテラルであるmboxを持つ人物に 一致します。これは誤ったデータを探すために使用できます (foaf:mboxは目的語としてIRIだけを持つべきです)。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE {
    ?x foaf:name  ?name ;
       foaf:mbox  ?mbox .
    FILTER isLiteral(?mbox)
}

クエリ結果:

name mbox
"Bob" "bob@work.example"
17.4.2.6 isNUMERIC
xsd:boolean  isNUMERIC (RDF term term)

termが数値である場合はtrueを返します。 そうでない場合はfalseを返します。termは、適切な データ型(オペランドのデータ型節を参照)を持ち、 有効な字句形式を持つ場合に数値であり、数値引数を取る関数および演算子への 有効な引数になります。

例:

isNUMERIC(12) true
isNUMERIC("12") false
isNUMERIC("12"^^xsd:nonNegativeInteger) true
isNUMERIC("1200"^^xsd:byte) false
isNUMERIC(<http://example/>) false
17.4.2.7 STR
xsd:string  STR (literal literal)
xsd:string  STR (IRI rsrc)

literalリテラル)の 字句形式を返します。 rsrcIRI)のコードポイント表現を返します。 これは、たとえばホスト名など、IRIの一部を調べるのに有用です。

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>

_:a  foaf:name       "Alice".
_:a  foaf:mbox       <mailto:alice@work.example> .

_:b  foaf:name       "Bob" .
_:b  foaf:mbox       <mailto:bob@home.example> .

このクエリは、foafプロフィールでwork.exampleアドレスを使用している 人物の集合を選択します。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE {
    ?x foaf:name  ?name ;
      foaf:mbox  ?mbox .
    FILTER regex(str(?mbox), "@work\\.example$")
}

クエリ結果:

name mbox
"Alice" <mailto:alice@work.example>
17.4.2.8 LANG
xsd:string  LANG (literal ltrl)

ltrl言語タグを持つ場合、その言語タグを返します。 ltrl言語タグを持たない場合、空文字列を返します。 RDFデータモデルには空の 言語タグを持つリテラルが含まれないことに 注意してください。

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>

_:a  foaf:name       "Robert"@en.
_:a  foaf:name       "Roberto"@es.
_:a  foaf:mbox       <mailto:bob@work.example> .

このクエリは、スペイン語のfoaf:namefoaf:mboxを見つけます。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE {
    ?x foaf:name  ?name ;
       foaf:mbox  ?mbox .
    FILTER ( lang(?name) = "es" )
}

クエリ結果:

name mbox
"Roberto"@es <mailto:bob@work.example>

関数例:

結果
LANG("abc"@en) "en"
LANG("abc"@en--ltr) "en"
LANG("abc") ""
LANG(1) ""
LANG(<http://example/>) error
17.4.2.9 LANGDIR
xsd:string  LANGDIR (literal ltrl)

ltrl基底方向を持つ場合、その基底方向を返します。 ltrl基底方向を持たない場合、空文字列を返します。 RDFデータモデルには空の 基底方向を持つリテラルが含まれないことに 注意してください。

結果
LANGDIR("abc"@en--ltr) "ltr"
LANGDIR("abc"@en) ""
LANGDIR("abc") ""
LANGDIR(1) ""
LANGDIR(<http://example/>) error
17.4.2.10 hasLANG
xsd:string  hasLANG (RDF term term)

RDF用語引数が 言語タグを持つリテラルである場合、 trueを返します。 そうでなければ、この関数はfalseを返します。

引数がリテラルである場合、この関数は、そのリテラルのデータ型が rdf:langStringまたはrdf:dirLangStringのいずれかであるかを テストすることと等価です。

結果
hasLANG("abc"@en) true
hasLANG("abc@"en--ltr) true
hasLANG("تصميم المواقع"@ar--rtl) true
hasLANG(1) false
hasLANG(<http://example/>) false
17.4.2.11 hasLANGDIR
xsd:string  hasLANGDIR (RDF term term)

RDF用語引数が 基底方向を持つリテラルである場合、 trueを返します。 そうでなければ、この関数はfalseを返します。

引数がリテラルである場合、この関数は、そのリテラルのデータ型が rdf:dirLangStringであるかをテストすることと等価です。

結果
hasLANGDIR("abc"@en) false
hasLANGDIR("abc@"en--ltr) true
hasLANGDIR("تصميم المواقع"@ar--rtl) true
hasLANGDIR(1) false
hasLANGDIR(<http://example/>) false
17.4.2.12 DATATYPE
iri  DATATYPE (literal literal)

与えられたリテラルの データ型IRIを返します。

言語タグを持ち、 基底方向持たないリテラルの データ型IRIrdf:langStringです。

言語タグ基底方向を持つリテラルの データ型IRIrdf:dirLangStringです。

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>
PREFIX eg:         <http://biometrics.example/ns#>
PREFIX xsd:        <http://www.w3.org/2001/XMLSchema#>

_:a  foaf:name       "Alice".
_:a  eg:shoeSize     "9.5"^^xsd:float .

_:b  foaf:name       "Bob".
_:b  eg:shoeSize     "42"^^xsd:integer .

このクエリは、shoeSizeが整数であるすべての人の foaf:namefoaf:shoeSizeを見つけます。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX xsd:  <http://www.w3.org/2001/XMLSchema#>
PREFIX eg:   <http://biometrics.example/ns#>
SELECT ?name ?shoeSize
WHERE { 
    ?x foaf:name  ?name ;
       eg:shoeSize  ?shoeSize .
    FILTER ( datatype(?shoeSize) = xsd:integer )
}

クエリ結果:

name shoeSize
"Bob" 42
17.4.2.13 IRI
iri  IRI(xsd:string)
iri  IRI(iri)
iri  URI(xsd:string)
iri  URI(iri)

IRI関数は、文字列引数を解決することによってIRIを構築します ([RFC3986]および [RFC3987]、または RFC 3986もしくはRFC 3987を置き換える任意の後続RFCを参照)。IRIはクエリの 基底IRIに対して解決され、絶対IRIにならなければなりません。

URI関数はIRIの同義語です。

関数にIRIが渡された場合、そのIRIを変更せずに返します。

データ型xsd:stringを持つリテラルまたはIRI以外の任意のRDF用語を渡すと エラーになります。

実装はIRIを正規化してもよいです。

例:

IRI("http://example/") <http://example/>
IRI(<http://example/>) <http://example/>
17.4.2.14 BNODE
blank node  BNODE()
blank node  BNODE(xsd:string)

BNODE関数は、問い合わせ対象のデータセット内のすべての空白ノードとは 異なり、かつ他のクエリ解に対するこのコンストラクター呼び出しによって作成される すべての空白ノードとも異なる空白ノードを構築します。引数なし形式が使用される場合、 すべての呼び出しは異なる空白ノードを生成します。xsd:stringリテラルを 持つ形式が使用される場合、異なるxsd:stringリテラルに対するすべての呼び出しは 異なる空白ノードを生成し、1つの解マッピングについての 式内で同じxsd:stringリテラルを持つ呼び出しには同じ空白ノードを生成します。

この機能は、SPARQL CONSTRUCTテンプレートにおける 空白ノードの扱いと互換性があります。

17.4.2.15 STRDT
literal  STRDT(xsd:string lexicalForm, IRI datatypeIRI)

STRDT関数は、引数で指定された 字句形式および データ型IRIを持つリテラルを構築します。

結果
STRDT("123", xsd:integer) "123"^^<http://www.w3.org/2001/XMLSchema#integer>
STRDT("iiii", <http://example/romanNumeral>) "iiii"^^<http://example/romanNumeral>
STRDTは、datatypeIRI引数として rdf:langStringまたはrdf:dirLangStringを指定して 呼び出すべきではありません。これらのIRIをデータ型IRIとして持つリテラルを 作成するには、関数STRLANGまたはSTRLANGDIRを 使用するべきです。
17.4.2.16 STRLANG
literal  STRLANG(xsd:string lexicalForm, xsd:string langTag)

STRLANG関数は、引数で指定された 字句形式および 言語タグを持ち、 データ型IRIがrdf:langStringであるリテラルを構築します。

引数langTagは空文字列であってはならず、 有効な言語タグであることが 望ましいです。

結果
STRLANG("chat", "fr") "chat"@fr
STRLANG("abc", "") error
STRLANG(123, "en") error
17.4.2.17 STRLANGDIR
literal  STRLANGDIR(xsd:string lexicalForm, xsd:string langTag, xsd:string baseDirection)

STRLANGDIR関数は、引数で指定された 字句形式言語タグおよび 基底方向を持ち、 データ型IRIがrdf:dirLangStringであるリテラルを構築します。

引数langTagは空文字列であってはなりませんし、 有効な言語タグであることが 望ましいです。 引数baseDirection"ltr"または "rtl"のいずれかでなければなりません

結果
STRLANGDIR("abc", "en", "ltr") "abc"@en--ltr
STRLANGDIR("abc", "en", "LTR") error
STRLANGDIR("قطة", "ar", "rtl") "قطة"@ar--rlt
STRLANGDIR("abc", "en", "") error
STRLANGDIR("abc", "", "ltr") error
STRLANGDIR(123, "", "ltr") error
STRLANGDIR(<x:uri>, "en", "ltr") error
17.4.2.18 UUID
iri  UUID()

A Universally Unique IDentifier (UUID) URN Namespaceからの新しいIRIを返します。UUID()の各呼び出しは 異なるUUIDを返します。それは「nil」UUID(すべて0)であってはなりません。UUIDの variantおよびversionは実装依存です。

UUID() <urn:uuid:b9302fb5-642e-4d3b-af19-29a8f6d894c9>
17.4.2.19 STRUUID
xsd:string  STRUUID()

UUIDのスキーム固有部分である文字列を返します。すなわち、UUIDを生成し、 データ型xsd:stringを持つリテラルへ変換し、 先頭のurn:uuid:を取り除いた結果を、データ型 xsd:stringを持つリテラルとして返します。

STRUUID() "73cd4307-8a99-4691-a608-b5bda64fb6c1"

17.4.3 文字列に対する関数

特定の関数(例: REGEXSTRLENCONTAINS)は、 文字列リテラルを引数として取ります。 文字列リテラルは次のいずれかです。

  • データ型xsd:stringを持つリテラル
  • データ型rdf:langStringを持ち、 言語タグを持つリテラル
  • データ型rdf:dirLangStringを持ち、 言語タグ基底方向の両方を持つリテラル

その他のRDF用語を使用すると、その関数呼び出しはエラーを発生させます。

"abc"は、 "abc"^^xsd:stringの構文上の省略形である 単純リテラルです。

関数SUBSTRSTRBEFORESTRAFTER、および REPLACEは、その最初の引数と同じ種類の 文字列リテラルを返します。

関数CONCATは、引数の文字列リテラル形式に応じた 文字列 リテラルを返します。

関数STRSTARTSSTRENDSCONTAINSSTRBEFORE、 およびSTRAFTERは 2つの引数を取ります。これらの引数は 引数互換でなければなりません。 そうでない場合、関数の呼び出しはエラーを発生させます。

2つの文字列リテラル引数は、次の場合に 引数 互換です。

  • 引数がデータ型xsd:stringを持つリテラルである
  • 引数がデータ型rdf:langStringを持つリテラルであり、 同じ言語タグを持つ
  • 引数がデータ型rdf:dirLangStringを持つリテラルであり、 同じ 言語タグと、同じ 基底方向を持つ
  • 最初の引数がデータ型rdf:langStringを持つリテラルであり、 2番目の引数がデータ型xsd:stringを持つリテラルである
  • 最初の引数がデータ型rdf:dirLangStringを持つリテラルであり、 2番目の引数がデータ型xsd:stringを持つ
Argument1 Argument2 互換?
"abc" "b" yes
"abc"@en "b" yes
"abc"@en "b"@en yes
"abc"@fr "b"@ja no
"abc" "b"@ja no
"abc" "b"@en--ltr no
"abc"@en--ltr "b"@en--ltr yes
"abc"@en--ltr "b"@en no
"abc"@en--ltr "z" yes
17.4.3.1 STRLEN
xsd:integer  STRLEN(string literal str)

strlen関数は、XPathの fn:string-length 関数に対応し、リテラルの 字句形式の文字数に等しい xsd:integerを返します。

strlen("chat") 4
strlen("chat"@en) 4
strlen("chat"@en--ltr) 4
strlen("chat"^^xsd:string) 4
17.4.3.2 SUBSTR
string literal  SUBSTR(string literal source, xsd:integer startingLoc)
string literal  SUBSTR(string literal source, xsd:integer startingLoc, xsd:integer length)

substr関数は、XPathの fn:substring関数に対応し、 source入力パラメータと同じ種類(データ型xsd:stringを持つ リテラル、同じ言語タグを持つリテラル、同じ言語タグと基底方向を持つリテラル)の リテラルを返しますが、 ソースの字句形式の部分文字列から導かれる 字句形式を持ちます。

引数startingLocおよびlengthは、 xsd:integerの派生型であってもよいです。

文字列内の最初の文字のインデックスは1です。

substr("foobar", 4) "bar"
substr("foobar"@en, 4) "bar"@en
substr("foobar"^^xsd:string, 4) "bar"^^xsd:string
substr("foobar", 4, 1) "b"
substr("foobar"@en, 4, 1) "b"@en
substr("foobar"^^xsd:string, 4, 1) "b"^^xsd:string
17.4.3.3 UCASE
string literal  UCASE(string literal str)

UCASE関数は、XPathの fn:upper-case 関数に対応します。引数の字句形式を大文字にした字句形式を持つ 文字列リテラルを返します。

ucase("foo") "FOO"
ucase("Foo"@en) "FOO"@en
ucase("foo"@en--ltr) "FOO"@en--ltr
ucase("foo"^^xsd:string) "FOO"^^xsd:string
17.4.3.4 LCASE
string literal  LCASE(string literal str)

LCASE関数は、XPathの fn:lower-case関数に対応します。 引数の字句形式を小文字にした字句形式を持つ文字列リテラルを返します。

lcase("BAR") "bar"
lcase("Bar"@en) "bar"@en
lcase("BAR"@en--ltr) "bar"@en--ltr
lcase("BAR"^^xsd:string) "bar"^^xsd:string
17.4.3.5 STRSTARTS
xsd:boolean  STRSTARTS(string literal arg1, string literal arg2)

STRSTARTS関数は、XPathの fn:starts-with関数に対応します。 引数は引数互換で なければならず、そうでない場合はエラーが発生します。

そのような入力対について、この関数は arg1の字句形式がarg2の字句形式で始まる場合はtrueを返し、 そうでない場合はfalseを返します。

strStarts("foobar", "foo") true
strStarts("foobar", "abc") false
strStarts("foobar"@en, "foo"@en) true
strStarts("foobar"^^xsd:string, "foo"^^xsd:string) true
strStarts("foobar"^^xsd:string, "foo") true
strStarts("foobar", "foo"^^xsd:string) true
strStarts("foobar"@en, "foo") true
strStarts("foobar"@en, "foo"^^xsd:string) true
strStarts("foobar", "foo"@en) error
17.4.3.6 STRENDS
xsd:boolean  STRENDS(string literal arg1, string literal arg2)

STRENDS関数は、XPathの fn:ends-with関数に対応します。 引数は引数互換で なければならず、そうでない場合はエラーが発生します。

そのような入力対について、この関数は arg1の字句形式がarg2の字句形式で終わる場合はtrueを返し、 そうでない場合はfalseを返します。

strEnds("foobar", "bar") true
strEnds("foobar", "abc") false
strEnds("foobar"@en, "bar"@en) true
strEnds("foobar"^^xsd:string, "bar"^^xsd:string) true
strEnds("foobar"^^xsd:string, "bar") true
strEnds("foobar", "bar"^^xsd:string) true
strEnds("foobar"@en, "bar") true
strEnds("foobar"@en, "bar"^^xsd:string) true
strEnds("foobar"@en, "bar"@en) error
17.4.3.7 CONTAINS
xsd:boolean  CONTAINS(string literal arg1, string literal arg2)

CONTAINS関数は、XPathの fn:containsに対応します。 引数は引数互換で なければならず、そうでない場合はエラーが発生します。

contains("foobar", "bar") true
contains("foobar"@en, "foo"@en) true
contains("foobar"^^xsd:string, "bar"^^xsd:string) true
contains("foobar"^^xsd:string, "foo") true
contains("foobar", "bar"^^xsd:string) true
contains("foobar"@en, "foo") true
contains("foobar"@en, "bar"^^xsd:string) true
contains("foobar", "bar"@en) error
17.4.3.8 STRBEFORE
literal  STRBEFORE(string literal arg1, string literal arg2)

STRBEFORE関数は、XPathの fn:substring-before関数に対応します。 引数は引数互換で なければならず、そうでない場合はエラーが発生します。

互換な引数について、2番目の引数の字句部分が最初の引数の字句部分の 部分文字列として現れる場合、この関数は最初の引数arg1と同じ種類 (データ型xsd:stringを持つリテラル、同じ言語タグを持つリテラル)の リテラルを返します。結果の字句形式は、arg1の字句形式のうち、 arg2の字句形式の最初の出現に先行する部分文字列です。 arg2の字句形式が空文字列である場合、これは一致と見なされ、 結果の字句形式は空文字列になります。

そのような出現がない場合、データ型xsd:stringを持つ空リテラルが 返されます。

strBefore("abc","b") "a"
strBefore("abc"@en,"bc") "a"@en
strBefore("abc"@en,"b"@cy) error
strBefore("abc"^^xsd:string,"") ""^^xsd:string
strBefore("abc","xyz") ""
strBefore("abc"@en, "z"@en) ""
strBefore("abc"@en, "z") ""
strBefore("abc"@en, ""@en) ""@en
strBefore("abc"@en, "") ""@en
17.4.3.9 STRAFTER
literal  STRAFTER(string literal arg1, string literal arg2)

STRAFTER関数は、XPathの fn:substring-after関数に対応します。 引数は引数互換で なければならず、そうでない場合はエラーが発生します。

互換な引数について、2番目の引数の字句部分が最初の引数の字句部分の 部分文字列として現れる場合、この関数は最初の引数arg1と同じ種類 (データ型xsd:stringを持つリテラル、同じ言語タグを持つリテラル)の リテラルを返します。結果の字句形式は、arg1の字句形式のうち、 arg2の字句形式の最初の出現に続く部分文字列です。 arg2の字句形式が空文字列である場合、これは一致と見なされ、 結果の字句形式はarg1の字句形式になります。

そのような出現がない場合、データ型xsd:stringを持つ空リテラルが 返されます。

strAfter("abc","b") `"c"
strAfter("abc"@en,"ab") "c"@en
strAfter("abc"@en,"b"@cy) error
strAfter("abc"^^xsd:string,"") "abc"^^xsd:string
strAfter("abc","xyz") ""
strAfter("abc"@en, "z"@en) ""
strAfter("abc"@en, "z") ""
strAfter("abc"@en, ""@en) "abc"@en
strAfter("abc"@en, "") "abc"@en
17.4.3.10 CONCAT
string literal  CONCAT(string literal, ..., string literal)

CONCAT関数は0個以上の引数を取ります。 引数は文字列リテラルでなければならず、 そうでない場合はエラーが発生します。

引数が0個与えられた場合、結果はデータ型xsd:stringの空文字列です。

引数が1個与えられた場合、結果はその引数値です。

引数が2個以上与えられた場合、この関数は、 結果の文字列リテラル字句形式が、 fn:concat関数を用いて関数の引数の 字句形式を連結することで得られるような 文字列リテラルを返します。

  • すべての入力リテラルが同じ 言語タグと同じ 基底方向を持つリテラルである場合、 返される文字列リテラルは、 共通の言語タグと基底方向を持つデータ型rdf:dirLangStringの リテラルです。
  • すべての入力リテラルが同じ 言語タグを持つリテラルであり、 どの引数も 基底方向を持たない場合、 返される文字列リテラルは、 共通の言語タグを持つデータ型rdf:langStringのリテラルです。
  • そうでなければ、結果はデータ型xsd:stringを持つ 文字列リテラルです。
concat("foo", "bar") "foobar"
concat("foo"@en, "bar"@en) "foobar"@en
concat("foo", "bar") "foobar"
concat("foo"@en, "bar") "foobar"
concat("foo"@en, "bar"@es) "foobar"
concat("abc") "abc"
concat("abc"@en) "abc"@en
concat() ""
17.4.3.11 langMATCHES
xsd:boolean  langMatches (xsd:string language-tag, xsd:string language-range)

引数language-tag言語タグ)が、 [RFC4647]第2.1節 Matching of Language Tagsに従う引数language-range基本言語範囲)に [RFC4647]第3.3.1節で定義される 基本フィルタリング方式に従って一致する場合、trueを返します。 そうでなければ、この関数はfalseを返します。

language-taglanguage-range、またはその両方が空 (したがって、それぞれ有効な言語タグまたは言語範囲ではない)場合、 この関数はfalseを返します。

"*"のlanguage-rangeは、任意の空でないlanguage-tag文字列に一致します。

PREFIX dc:       <http://purl.org/dc/elements/1.1/>

_:a  dc:title         "That Seventies Show"@en .
_:a  dc:title         "Cette Série des Années Soixante-dix"@fr .
_:a  dc:title         "Cette Série des Années Septante"@fr-BE .
_:b  dc:title         "Il Buono, il Bruto, il Cattivo" .

このクエリは、langMatcheslangを使用して、英語で "That Seventies Show"として知られる番組のフランス語タイトルを見つけます。

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE {
    ?x dc:title  "That Seventies Show"@en ;
       dc:title  ?title .
    FILTER langMatches( lang(?title), "FR" )
}

クエリ結果:

title
"Cette Série des Années Soixante-dix"@fr
"Cette Série des Années Septante"@fr-BE

イディオムlangMatches( lang( ?v ), "*" )は、言語タグのない リテラルには一致しません。なぜならlang( ?v )は空文字列を返すからです。したがって、

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE {
    ?x dc:title  ?title .
    FILTER langMatches( lang(?title), "*" )
}

は、言語タグを持つすべてのタイトルを報告します。

title
"That Seventies Show"@en
"Cette Série des Années Soixante-dix"@fr
"Cette Série des Années Septante"@fr-BE
17.4.3.12 REGEX
xsd:boolean  REGEX (string literal text, xsd:string pattern)
xsd:boolean  REGEX (string literal text, xsd:string pattern, xsd:string flags)

XPathのfn:matches関数を呼び出し、 textを正規表現patternに対して照合します。 正規表現言語は、XQuery 1.0 and XPath 2.0 Functions and Operatorsの 7.6.1 Regular Expression Syntax節 [XPATH-FUNCTIONS-31]で 定義されます。

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>

_:a  foaf:name       "Alice".
_:b  foaf:name       "Bob" .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { 
    ?x foaf:name  ?name
    FILTER regex(?name, "^ali", "i")
}

クエリ結果:

name
"Alice"
17.4.3.13 REPLACE
string literal  REPLACE (string literal arg, xsd:string pattern, xsd:string replacement )
string literal  REPLACE (string literal arg, xsd:string pattern, xsd:string replacement,  xsd:string flags)

REPLACE関数は、XPathの fn:replace関数に対応します。 正規表現patternの重ならない各出現を置換文字列で置き換えます。 正規表現照合は修飾子フラグを含む場合があります。REGEXを 参照してください。

replace("abcd", "b", "Z") "aZcd"
replace("abab", "B", "Z","i") "aZaZ"
replace("abab", "B.", "Z","i") "aZb"
17.4.3.14 ENCODE_FOR_URI
xsd:string  ENCODE_FOR_URI(string literal ltrl)

ENCODE_FOR_URI関数は、XPathの fn:encode-for-uri関数に対応します。 入力の字句形式から、 fn:encode-for-uri関数に従って 予約文字を変換して得られる字句形式を持つ、データ型xsd:stringの リテラルを返します。

encode_for_uri("Los Angeles") "Los%20Angeles"
encode_for_uri("Los Angeles"@en) "Los%20Angeles"
encode_for_uri("Los Angeles"^^xsd:string) "Los%20Angeles"

17.4.4 数値に対する関数

17.4.4.1 ABS
numeric  ABS (numeric term)

argの絶対値を返します。argが数値でない場合、 エラーが発生します。

この関数は、XDM由来のデータ型を持つ用語について、 fn:absと同じです。

ABS(1) 1
ABS(-1.5) 1.5
17.4.4.2 ROUND
numeric  ROUND (numeric term)

引数に最も近い、小数部を持たない数を返します。そのような数が2つある場合は、 正の無限大に最も近い方が返されます。argが数値でない場合、 エラーが発生します。

この関数は、XDM由来の データ型を持つ用語について、fn:roundと同じです。

ROUND(2.4999) 2.0
ROUND(2.5) 3.0
ROUND(-2.5) -2.0
17.4.4.3 CEIL
numeric  CEIL (numeric term)

argの値より小さくない、小数部を持たない最小の (負の無限大に最も近い)数を返します。argが数値でない場合、 エラーが発生します。

この関数は、XDM由来のデータ型を持つ用語について、 fn:ceilingと同じです。

CEIL(10.5) 11.0
CEIL(-10.5) -10.0
17.4.4.4 FLOOR
numeric  FLOOR (numeric term)

argの値より大きくない、小数部を持たない最大の (正の無限大に最も近い)数を返します。argが数値でない場合、 エラーが発生します。

この関数は、XDM由来のデータ型を持つ用語について、 fn:floorと同じです。

FLOOR(10.5) 10.0
FLOOR(-10.5) -11.0
17.4.4.5 RAND
xsd:double  RAND ( )

0(含む)から1.0e0(含まない)までの疑似乱数を返します。 この関数が呼び出されるたびに、異なる数を生成できます。 数はおおよそ等しい確率で生成されるべきです。

rand() "0.31221030831984886"^^xsd:double

17.4.5 日付および時刻に 対する関数

17.4.5.1 NOW
xsd:dateTime  NOW ()

現在のクエリ実行に対するXSD dateTime値を返します。 1回のクエリ実行内でのこの関数のすべての呼び出しは、同じ値を返さなければなりません。 返される正確な瞬間は指定されません。

NOW() "2011-01-10T14:45:13.815-05:00"^^xsd:dateTime
17.4.5.2 YEAR
xsd:integer  YEAR (xsd:dateTime arg)

argの年部分を整数として返します。

この関数はfn:year-from-dateTimeに対応します。

YEAR("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) 2011
17.4.5.3 MONTH
xsd:integer  MONTH (xsd:dateTime arg)

argの月部分を整数として返します。

この関数はfn:month-from-dateTimeに対応します。

MONTH("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) 1
17.4.5.4 DAY
xsd:integer  DAY (xsd:dateTime arg)

argの日部分を整数として返します。

この関数はfn:day-from-dateTimeに対応します。

day("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) 10
17.4.5.5 HOURS
xsd:integer  HOURS (xsd:dateTime arg)

argの時部分を整数として返します。値はXSD dateTimeの 字句形式で与えられたものです。

この関数はfn:hours-from-dateTimeに対応します。

HOURS("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) 14
17.4.5.6 MINUTES
xsd:integer  MINUTES (xsd:dateTime arg)

argの字句形式の分部分を返します。値はXSD dateTimeの 字句形式で与えられたものです。

この関数はfn:minutes-from-dateTimeに対応します。

MINUTES("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) 45
17.4.5.7 SECONDS
xsd:decimal  SECONDS (xsd:dateTime arg)

argの字句形式の秒部分を返します。

この関数はfn:seconds-from-dateTimeに対応します。

SECONDS("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) 13.815
17.4.5.8 TIMEZONE
xsd:dayTimeDuration  TIMEZONE (xsd:dateTime arg)

argのタイムゾーン部分をxsd:dayTimeDurationとして返します。 タイムゾーンがない場合はエラーを発生させます。

この関数は、タイムゾーンを持たないリテラルの扱いを除き、 fn:timezone-from-dateTimeに 対応します。

TIMEZONE("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) "-PT5H"^^xsd:dayTimeDuration
TIMEZONE("2011-01-10T14:45:13.815Z"^^xsd:dateTime) "PT0S"^^xsd:dayTimeDuration
TIMEZONE("2011-01-10T14:45:13.815"^^xsd:dateTime) error
17.4.5.9 TZ
xsd:string  TZ (xsd:dateTime arg)

argのタイムゾーン部分を、データ型xsd:stringを持つ リテラルとして返します。タイムゾーンがない場合は空文字列を返します。

TZ("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) "-05:00"
TZ("2011-01-10T14:45:13.815Z"^^xsd:dateTime) "Z"
TZ("2011-01-10T14:45:13.815"^^xsd:dateTime) ""

17.4.6 トリプル用語に対する関数

17.4.6.1 TRIPLE
triple term  TRIPLE (RDF term subj, RDF term pred, RDF term obj)
<<( subj pred obj )>>

3タプル(subjpredobj)が RDFトリプル (すなわち、subjIRIまたは 空白ノードであり、 predIRIであり、 objIRIトリプル用語空白ノード、または リテラルである) 場合、この関数はこれら3つの要素を持つトリプル用語を返します。 そうでなければ、この関数はエラーを発生させます。

省略記法として、TRIPLE関数は <<(および)>>を用いる トリプル用語式の形式でも書くことができます。 この省略形には構文上の制限があります。

  • トリプル用語式の3つの要素は、それぞれ 変数または直接書かれた RDF用語だけにでき、任意の式にはできません。
  • 主語および述語位置の構文は、 IRIまたは 変数に制限されます。

関数形式TRIPLEは、任意の式とともに使用できます。

VERSION "1.2"
PREFIX : <http://example/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?s ?date {
    ?s ?p ?o .
    BIND( <<( ?s ?p ?o )>> AS ?tt )
    :myreifier rdf:reifies ?tt .
    :myreifier :tripleAdded ?date .
}
VERSION "1.2"
PREFIX : <http://example/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?s ?date {
    ?s ?p ?o .
    BIND( TRIPLE(?s, ?p, ?o) AS ?tt )
    :myreifier rdf:reifies ?tt .
    :myreifier :tripleAdded ?date .
}
17.4.6.2 SUBJECT
RDF term  SUBJECT (triple term triple-term)

引数が トリプル用語である場合、 この関数はそのトリプル用語の 主語を返します。 引数が トリプル用語でない場合、 エラーが発生します。

17.4.6.3 PREDICATE
RDF term  PREDICATE (triple term triple-term)

引数が トリプル用語である場合、 この関数はそのトリプル用語の 述語を返します。 引数が トリプル用語でない場合、 エラーが発生します。

17.4.6.4 OBJECT
RDF term  OBJECT (triple term triple-term)

引数が トリプル用語である場合、 この関数はそのトリプル用語の 目的語を返します。 引数が トリプル用語でない場合、 エラーが発生します。

17.4.6.5 isTRIPLE
xsd:boolean  isTRIPLE (RDF term term)

引数がトリプル用語である場合、 この関数はtrueを返します。 引数がその他の種類の RDF用語である場合、 この関数はfalseを返します。

17.4.7 ハッシュ関数

17.4.7.1 MD5
xsd:string  MD5 (xsd:string arg)

xsd:stringの字句形式に対して計算されたMD5チェックサムを、 16進数字文字列として返します。16進数字は小文字であることが 望ましいです。

MD5("abc") "900150983cd24fb0d6963f7d28e17f72"
17.4.7.2 SHA1
xsd:string  SHA1 (xsd:string arg)

xsd:stringの字句形式に対して計算されたSHA1チェックサムを、 16進数字文字列として返します。16進数字は小文字であることが 望ましいです。

SHA1("abc") "a9993e364706816aba3e25717850c26c9cd0d89d"
17.4.7.3 SHA256
xsd:string  SHA256 (xsd:string arg)

xsd:stringの字句形式に対して計算されたSHA256チェックサムを、 16進数字文字列として返します。16進数字は小文字であることが 望ましいです。

SHA256("abc") "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
17.4.7.4 SHA384
xsd:string  SHA384 (xsd:string arg)

xsd:stringの字句形式に対して計算されたSHA384チェックサムを、 16進数字文字列として返します。16進数字は小文字であることが 望ましいです。

SHA384("abc") "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7"
17.4.7.5 SHA512
xsd:string  SHA512 (xsd:string arg)

xsd:stringの字句形式に対して計算されたSHA512チェックサムを、 16進数字文字列として返します。16進数字は小文字であることが 望ましいです。

SHA512("abc") "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"

17.5 XPathコンストラクター関数

SPARQLは、 XPath and XQuery Functions and Operators 3.1 [XPATH-FUNCTIONS-31]の 19.1 Casting from primitive types to primitive types節で定義されるXPathコンストラクター関数の部分集合を インポートします。 SPARQLコンストラクターには、SPARQLオペランド・データ型のための すべてのXPathコンストラクターに加え、RDFデータモデルによって課される 追加のデータ型が含まれます。 SPARQLにおけるキャストは、ソース型のオペランドに対してターゲット型の コンストラクター関数を呼び出すことによって行われます。

XPathは、あるXML Schemaデータ型から別のXML Schemaデータ型へのキャストだけを定義します。 残りのキャストは次のように定義されます。

下の表は、常に許可される(Y)、決して許可されない (N)、および字句値に依存する (M)キャスト操作を要約しています。 たとえば、xsd:string(最初の行)からxsd:float (2番目の列)へのキャスト操作は、字句値に依存します(M)。

bool = xsd:boolean
dbl = xsd:double
flt = xsd:float
dec = xsd:decimal
int = xsd:integer
dT = xsd:dateTime
str = xsd:string
IRI = IRI

From \ To str flt dbl dec int dT bool
str Y M M M M M M
flt Y Y Y M M N Y
dbl Y Y Y M M N Y
dec Y Y Y Y Y N Y
int Y Y Y Y Y N Y
dT Y N N N N Y N
bool Y Y Y Y Y N Y
IRI Y N N N N N N

17.6 拡張可能な値テスト

一部の条件下でエラーを返すよう指定されている任意の関数または演算子は、 有効な拡張ポイントであることに注意してください。すなわち、実装はこれらのエラーの場合に 非エラー値を返すことができ、それでもこの勧告に適合します。

PrimaryExpression文法規則は、IRIで名前付けされた 拡張関数の呼び出しであり得ます。拡張関数は、いくつかのRDF用語を引数として取り、 RDF用語を返します。これらの関数の意味論は、その関数を識別するIRIによって識別されます。

拡張関数を使用するSPARQLクエリは、相互運用性が制限される可能性があります。

例として、func:evenという関数を考えます。

xsd:boolean   func:even (numeric value)

この関数は、FILTER内で次のように呼び出されます。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX func: <http://example.org/functions#>
SELECT ?name ?id
WHERE { 
    ?x foaf:name  ?name ;
       func:empId   ?id .
    FILTER (func:even(?id))
}

2番目の例として、2点間の距離を計算する関数aGeo:distanceを考えます。 ここではGrenobleの近くの場所を見つけるために使用されます。

xsd:double   aGeo:distance (numeric x1, numeric y1, numeric x2, numeric y2)
PREFIX aGeo: <http://example.org/geo#>

SELECT ?neighbor
WHERE {
    ?a aGeo:placeName "Grenoble" .
    ?a aGeo:locationX ?axLoc .
    ?a aGeo:locationY ?ayLoc .

    ?b aGeo:placeName ?neighbor .
    ?b aGeo:locationX ?bxLoc .
    ?b aGeo:locationY ?byLoc .

    FILTER ( aGeo:distance(?axLoc, ?ayLoc, ?bxLoc, ?byLoc) < 10 ) .
}

拡張関数は、コアSPARQL仕様でサポートされていない何らかのアプリケーション・データ型を テストするために使用されることがあります。また、たとえば別の日付形式から XSD dateTime RDF用語へ変換するような、データ型形式間の変換である場合もあります。

18. SPARQLの定義

この節では、クエリ文字列とRDFデータセットが与えられたときの、グラフ・パターンおよび解 修飾子の評価に関する正しい振る舞いを定義します。これは、SPARQL実装がここで定義される 処理を使用しなければならないことを意味するものではありません。

SPARQLクエリを実行した結果は、一連の手順によって定義されます。まず文字列としての SPARQLクエリから始まり、その文字列を抽象構文形式へ変換し、次にその 抽象構文を、SPARQL代数の演算子から構成されるSPARQL抽象クエリへ変換します。この 抽象クエリは、その後RDFデータセット上で評価されます。

18.1 初期定義

18.1.1 RDFデータセット

RDFデータセットの概念は、[RDF12-CONCEPTS]で定義されています。

以下の定義のために、各RDFデータセットを集合として捉えます。

{ G, (<u1>, G1), (<u2>, G2), ... (<un>, Gn) } ここでGおよび各Giはグラフであり、各<ui>はIRIまたは空白 ノードです。各 <ui>は互いに異なります。

Gはデフォルトグラフと呼ばれます。(<ui>, Gi)は名前付き グラフと呼ばれます。

定義: アクティブグラフ

アクティブグラフとは、基本グラフ・パターン照合に使用される、データセット内の グラフです。

18.1.2 クエリ変数

定義: クエリ変数

すべてのRDF用語の集合と互いに素である、可算無限集合 Vを仮定します。 この集合Vの各メンバーはクエリ変数です。

18.1.3 トリプル・パターン

定義: トリプル・パターン

トリプル・パターンは、次のように帰納的に定義される 3タプルです。 すなわち、

  • sRDF用語変数、 またはトリプル・パターンであり、
  • pIRI または変数であり、かつ
  • oRDF用語変数、 またはトリプル・パターンである場合、

(s, p, o)はトリプル・パターンです。

トリプル・パターンは循環を許しません (すなわち、トリプル・パターンはそれ自身の内部に含まれてはなりません)。

このトリプル・パターンの定義にはリテラル主語が含まれます。 これはRDF-coreによって指摘されています

「[RDF core Working Group]は、リテラルが主語であってはならない理由を認識しておらず、 より制限の少ない憲章を持つ将来のWGが、文の主語としてリテラルを許可するように 構文を拡張する可能性があることを指摘しました。」

RDFグラフはリテラル主語を含まないため、主語としてリテラルを持つ任意のSPARQL トリプル・パターンは、どのRDFグラフにも一致しません。

主語位置に別のトリプル・パターンを持つトリプル・パターンは、 どのRDFグラフにも一致しません。なぜなら、RDFトリプルは、その主語位置に トリプル用語を 持つことができないからです。

18.1.4 基本グラフ・パターン

定義: 基本グラフ・パターン

基本グラフ・パターンは、 トリプル・パターンの集合です。

空のグラフ・パターンは、空集合である基本グラフ・パターンです。

18.1.5 プロパティ・パス・パターン

定義: プロパティ・パス

プロパティ・パスとは、系列STに含まれるトリプルtiの列であり、n = length(ST)-1として、i=0からnまでについて、tiの目的語が ti+1の主語と同じ用語であるものです。

t0の主語をパスの始点と呼びます。

tnの目的語をパスの終点と呼びます。

各tiがGのトリプルである場合、プロパティ・パスはグラフG内のパスです。

プロパティ・パスは、データセット内の複数のグラフにまたがりません。

定義: プロパティ・パス式

プロパティ・パス式とは、上で記述したプロパティ・パス形式を使用する式です。

定義: プロパティ・パス・パターン

プロパティ・パス・パターンは、次の条件を満たす3タプル(s, p, o)です。

プロパティ・パス・パターンは、述語位置にプロパティ・パス式を含めるように トリプル・パターンを一般化したものです。

18.1.6 解マッピング

解マッピングとは、変数の集合からRDF用語の集合へのマッピングです。明らかな場合には 「解」という用語を使用します。

定義: 解マッピング

解マッピングμは部分関数 μ : VTであり、ここで Vはすべての変数の集合であり、 TはすべてのRDF用語の集合です。

μの定義域はdom(μ)で表され、 μが定義されているVの部分集合です。

定義: 解列

解列とは、順序付けられていない可能性のある解のリストです。

μによって与えられる変数の用語を使用した式exprの値をexpr(μ)と書きます。 評価はエラーになることがあります。

18.1.7 解列 修飾子

定義: 解列修飾子

解列修飾子は次のいずれかです。

  • Order By修飾子: 解を順序付ける
  • Projection修飾子: 特定の変数を選択する
  • Distinct修飾子: 列内の解が 一意であることを保証する
  • Reduced修飾子: 非distinctな解が 削除されることを許可する
  • Offset修飾子: 解の全体列において解がどこから始まるかを 制御する
  • Limit修飾子: 解の数を制限する

18.1.8 SPARQLクエリ

定義: SPARQLクエリ

SPARQL抽象クエリはタプル(E, DS, QF)であり、 ここで:

定義: クエリレベル

クエリレベルとは、グラフ・パターン、グループ化と集約の集合、および 解修飾子の集合です。

クエリは「クエリレベル」の木であり、各サブクエリは その木の1つのクエリレベルを形成します。

18.2 代数構文

SPARQLクエリの評価意味論を定義するために、 SPARQLクエリ文字列の抽象構文木 (SPARQL文法によって定義されるもの)は、 まずSPARQL代数に似た構文へ変換されます。 この節では、この代数構文で形成できる式を定義し、 SPARQLクエリ文字列をこの代数構文へ変換する方法は 第 18.3 代数構文への変換で定義されます。

代数クエリ式は、 次のように再帰的に定義されます。

前の定義で使用される 代数プロパティ・パス式の概念は、 次のように再帰的に定義されます。

18.3 代数構文への 変換

この節では、SPARQLクエリ文字列内のグラフ・パターンおよび解修飾子を 代数 クエリ式へ変換する処理を定義します。記述される処理は、 入れ子になったSELECT構文を用いるサブクエリによって形成されるクエリの入れ子の 1レベルを変換し、サブクエリに再帰的に適用されます。各レベルは、グラフ・パターン照合および フィルタリングからなり、その後に解修飾子が適用されます。

SPARQLクエリ文字列は構文解析され、第 4. SPARQL 構文で与えられるIRIおよびトリプル・パターンの省略形が適用されます。 この時点で、抽象構文木は次の要素で構成されます。

パターン 修飾子 クエリ形式 その他
RDF用語 DISTINCT SELECT VALUES
プロパティ・パス式 REDUCED CONSTRUCT SERVICE
プロパティ・パス・パターン 投影 DESCRIBE  
グループ ORDER BY ASK  
OPTIONAL LIMIT    
UNION OFFSET    
GRAPH Select式    
BIND      
GROUP BY      
HAVING      
MINUS      
FILTER      

18.3.1 変数スコープ

ある変数が、クエリの代数式の評価における その時点で、解マッピングの定義域に含まれ得る方法が存在する場合、その変数は スコープ内であると定義します。 以下の定義は、クエリの抽象構文木からこれを判定する方法を提供します。

投影を持つサブクエリは変数を隠すことがあることに注意してください。 FILTER内またはMINUS内で変数を使用しても、 それらの形式の外でその変数がスコープ内になるわけではありません。

PP1、およびP2をグラフ・パターンとし、EE1,..., Enを式とします。変数vは次の場合にスコープ内です。

構文形式 スコープ内の変数
基本グラフ・パターン(BGP) vがBGP内に出現する
Path vがパス内に出現する
GroupGraphPattern { P1 P2 ... } vは、P1、P2、...の1つ以上でスコープ内であればスコープ内である
GRAPH X { P } Xが変数vである、またはvがP内でスコープ内である
{ P1 } UNION { P2 } vはP1内でスコープ内、またはP2内でスコープ内である
OPTIONAL {P} vはP内でスコープ内である
SERVICE X {P} Xが変数vである、またはvがP内でスコープ内である
BIND (expr AS v) vはスコープ内である
SELECT .. v .. { P } vはスコープ内である
SELECT ... (expr AS v) vはスコープ内である
GROUP BY ... v vはスコープ内である
GROUP BY ... (expr AS v) vはスコープ内である
SELECT * { P } vP内でスコープ内である
VALUES v { values } vはスコープ内である
VALUES varlist { values } vvarlist内にある場合、vはスコープ内である

変数vは、(expr AS v)形式の時点で スコープ内であってはなりません。(expr AS v)のスコープは SELECT式内で直ちに適用されます。

BIND (expr AS v)では、使用されるグループ・グラフ・パターン内の 先行要素から変数vがスコープ内でないことを要求します。

SELECTでは、変数vSELECT節のグラフ・パターン内で スコープ内であってはならず、また、その節内のより前の別のselect式で使用されていてもなりません。

18.3.2 グラフ・パターンの変換

この節では、SPARQLグラフ・パターンを 代数クエリ式へ変換する処理について説明します。 この処理は、クエリのWHERE節を形成するグループ・グラフ・パターン (波括弧("{ }")区切りの単位)に適用され、 グループ・グラフ・パターン内の各構文要素に再帰的に適用されます。 変換の結果は 代数クエリ式です。

要約すると、手順は次のように適用されます。

ここで説明するグラフ・パターン変換アルゴリズムを、次のように書きます。

translate(graph pattern)

作業グループは、SPARQL 1.0では、簡略化ステップが適用される時点によって、 optional内の二重に入れ子になったfilterとpatternを含むクエリについて あいまいな変換が生じることを指摘しています。
OPTIONAL { { ... FILTER ( ... ?x ... ) } }..

これは2つの非規範的テストケースによって示されます。

グラフ・パターンのすべての変換後に簡略化ステップを適用することが 推奨される読みです。

18.3.2.1 構文形式の展開

第 4. SPARQL構文で与えられるIRIおよびトリプル・パターンの省略形を展開します。

18.3.2.2 FILTER要素の収集

FILTER式は、それが現れるグループ・グラフ・パターン全体に適用されます。 フィルタリングを実行する代数演算子は、各グループ要素の変換後にグループへ追加されます。 ここではフィルターをまとめて収集し、グループから削除した後、 変換済みグループ・グラフ・パターン全体へ 適用します。

Let FS := empty set
For each form FILTER(expr) in the group graph pattern
    FS := FS ∪ {expr}
    End

フィルター式の集合FS後で 使用されます。

18.3.2.3 プロパティ・パス式の変換

次の表は、SPARQLクエリ文字列内の プロパティ・パス式代数プロパティ・パス式へ変換する方法を示します。 これはプロパティ・パス式のすべての要素へ 再帰的に適用されます。

この手順の次の手順では、 特定の形式をトリプル・パターンへ変換し、それらは後で基本グラフ・パターンへ 隣接性によって変換されます(介在するグループ・パターン区切り {および})や その他の構文形式なしに)。全体として、IRIだけからなるSPARQL構文のプロパティ・パスは トリプル・パターンになり、それらは基本グラフ・パターンへ集約されます。

注:

  • 否定プロパティ集合(NPS)におけるIRI形式および^IRI形式の順序は関係ありません。
構文形式(path) 代数形式(path)
iri Link(iri)
^path Inv(path)
!(:iri1|...|:irin) NPS({:iri1 ... :irin})
!(^:iri1|...|^:irin) Inv( NPS({:iri1 ... :irin}) )
!(:iri1|...|:irii|^:irii+1|...|^:irim)  Alt( NPS({:iri1 ...:irii}),
    Inv(NPS({:irii+1, ..., :irim})) )
path1 / path2 Seq(path1, path2)
path1 | path2 Alt(path1, path2)
path* ZeroOrMorePath(path)
path+ OneOrMorePath(path)
path? ZeroOrOnePath(path)
18.3.2.4 プロパティ・パス・パターンの変換

前の手順ではプロパティ・パス式を変換しました。 この手順ではプロパティ・パス・パターンを変換します。 これは主語端点、プロパティ・パス式、および目的語端点から構成されます。 この手順は、プロパティ・パス・パターンのプロパティ・パス式がすでに 代数プロパティ・パス式の形式で 与えられていることを仮定します。この手順の結果は、トリプル・パターン、および 代数クエリ式 Path(...)の形式になることがあります。

注:

  • xおよびyRDF用語または変数です。
  • varは新鮮な変数です。
  • ppeppe1、およびppe2代数プロパティ・パス式です。
  • これらはプロパティ・パス・パターンにだけ適用され、プロパティ・パス 式の内部には適用されません。
  • 表の前の方の変換は、最後の変換より優先して適用されます。
  • 最後の変換は、残りの任意のプロパティ・パス式を、共通形式 Path(...)を使用するように単にラップします。
代数形式(path) 変換
x Link(iri) y x iri y
x Inv(iri) y y iri x
x Seq(ppe1, ppe2) y x ppe1 var . var ppe2 y
x ppe y Path(x, ppe, y)
Issue 226: プロパティ・パス・パターンの変換が 不完全 spec:bug
この表の変換規則は再帰的に適用されることを意図していると思われますが、 この節はそれについて何も述べていません。特に、 "x Seq(ppe1, ppe2) y" の場合、結果の変換に含まれるppe1およびppe2は 依然として任意の代数プロパティ・パス式であり得るため、 2つの結果のプロパティ・パス・パターンのそれぞれについて 変換を再度適用すべきです (すなわち、"x ppe1 var"および"var ppe2 y"について)。

パス変換処理全体の例(?_Vは新鮮な 変数):

?s :p/:q ?o
?s :p ?_V .
?_V :q ?o
?s :p* ?o
Path(?s, ZeroOrMorePath(Link(:p)), ?o)
:list rdf:rest*/rdf:first ?member
Path(:list, ZeroOrMorePath(Link(rdf:rest)), ?_V) .
?_V rdf:first ?member
18.3.2.5 基本グラフ・パターンの変換

プロパティ・パスを変換した後、隣接するトリプル・パターンはまとめて収集され、 基本グラフ・パターンBGP(triples)を形成します。

18.3.2.6 グラフ・ パターンの変換

次に、残りの各グラフ・パターン形式を変換し、変換処理を再帰的に適用します。

形式がGroupOrUnionGraphPatternである場合

Let A := undefined
          
For each element G in the GroupOrUnionGraphPattern
    If A is undefined
        A := Translate(G)
    Else
        A := Union(A, Translate(G))
    End

The result is A

形式がGraphGraphPatternである場合

If the form is GRAPH IRI GroupGraphPattern
    The result is Graph(IRI, Translate(GroupGraphPattern))
If the form is GRAPH Var GroupGraphPattern
    The result is Graph(Var, Translate(GroupGraphPattern))

形式がGroupGraphPatternである場合:

Let G := ContextSolution

For each element E in the sequence of elements in the GroupGraphPattern

    If E is of the form OPTIONAL{P} 
        Let A := Translate(P)
        If A is of the form Filter(F, A2)
            G := LeftJoin(G, A2, F)
        Else 
            G := LeftJoin(G, A, true)
            End
        End

    If E is of the form MINUS{P}
        G := Minus(G, Translate(P))
        End

    If E is of the form BIND(expr AS var)
        G := Extend(G, var, expr)
        End

    If E is any other form 
        Let A := Translate(E)
        G := Join(G, A)
        End

   End
   
The result is G.

形式がInlineDataである場合

The result is a multiset data of solution mappings.
dataは、変数のリスト(または単一変数)内の対応する位置の変数から解マッピングを 形成することによって構成されます。ただし、DataBlockValueUNDEFという語である場合、その束縛は省略されます。

形式がSubSelectである場合

The result is ToMultiset(Translate(SubSelect))
18.3.2.7 グループのフィルター

グループが変換された後、フィルター式が追加され、グループの残り全体に適用されます。

If FS is not empty
    Let G := output of preceding step
    Let X := Conjunction of expressions in FS
    G := Filter(X, G)
End
18.3.2.8 簡略化ステップ

1つのグラフ・パターンからなる一部のグループは、Join(Z, A)になります。ここでZは空の基本 グラフ パターン(空集合)です。これらはAに置き換えられます。空の グラフ・パターンZはjoinの単位元です。

Replace Join(Z, A) by A
Replace Join(A, Z) by A

18.3.3 マッピングされた グラフ・パターンの例

書き換え例の2番目の形式は、最初の形式から簡略化ステップにより空のグループjoinを削除したものです。 Zは空の基本グラフ・パターンです。

例: 単一のトリプル・パターンからなる基本グラフ・パターンを持つグループ:

{ ?s ?p ?o }
Join(Z, BGP(?s ?p ?o) )
BGP(?s ?p ?o)

例: 2つのトリプル・パターンからなる基本グラフ・パターンを持つグループ:

{ ?s :p1 ?v1 ; :p2 ?v2 }
BGP( ?s :p1 ?v1 . ?s :p2 ?v2 )
Issue 246: グラフ・パターン変換の例が 一貫していない spec:editorial
上の例には、簡略化ステップ前の結果式の版が含まれていません。 以下のいくつかの他の例にも同じことが当てはまります。例はこの点で一貫しているべきです。

例: 2つの基本グラフ・パターンのunionからなるグループ:

{ { ?s :p1 ?v1 } UNION {?s :p2 ?v2 } }
Union(Join(Z, BGP(?s :p1 ?v1)),
      Join(Z, BGP(?s :p2 ?v2)) )
Union( BGP(?s :p1 ?v1) , BGP(?s :p2 ?v2) )

例: unionと基本グラフ・パターンのunionからなるグループ:

{ { ?s :p1 ?v1 } UNION {?s :p2 ?v2 } UNION {?s :p3 ?v3 } }
Union(
    Union( Join(Z, BGP(?s :p1 ?v1)),
           Join(Z, BGP(?s :p2 ?v2))) ,
    Join(Z, BGP(?s :p3 ?v3)) )
Union(
    Union( BGP(?s :p1 ?v1) ,
           BGP(?s :p2 ?v2),
    BGP(?s :p3 ?v3))

例: 基本グラフ・パターンとoptionalグラフ・パターンからなるグループ:

{ ?s :p1 ?v1 OPTIONAL {?s :p2 ?v2 } }
LeftJoin(
    Join(Z, BGP(?s :p1 ?v1)),
    Join(Z, BGP(?s :p2 ?v2)),
    true)
LeftJoin(BGP(?s :p1 ?v1), BGP(?s :p2 ?v2), true)

例: 基本グラフ・パターンと2つのoptionalグラフ・パターンからなるグループ:

{ ?s :p1 ?v1 OPTIONAL {?s :p2 ?v2 } OPTIONAL { ?s :p3 ?v3 } }
LeftJoin(
    LeftJoin(
        BGP(?s :p1 ?v1),
        BGP(?s :p2 ?v2),
        true) ,
    BGP(?s :p3 ?v3),
    true)

例: 基本グラフ・パターンと、フィルターを持つoptionalグラフ・パターンからなるグループ:

{ ?s :p1 ?v1 OPTIONAL {?s :p2 ?v2 FILTER(?v1<3) } }
LeftJoin(
     Join(Z, BGP(?s :p1 ?v1)),
     Join(Z, BGP(?s :p2 ?v2)),
     (?v1<3) )
LeftJoin(
    BGP(?s :p1 ?v1) ,
    BGP(?s :p2 ?v2) ,
   (?v1<3) )

例: unionグラフ・パターンとoptionalグラフ・パターンからなるグループ:

{ {?s :p1 ?v1} UNION {?s :p2 ?v2} OPTIONAL {?s :p3 ?v3} }
LeftJoin(
  Union(BGP(?s :p1 ?v1),
        BGP(?s :p2 ?v2)) ,
  BGP(?s :p3 ?v3) ,
  true )

例: 基本グラフ・パターン、フィルター、およびoptionalグラフ・ パターンからなるグループ:

{ ?s :p1 ?v1 FILTER (?v1 < 3 ) OPTIONAL {?s :p2 ?v2} }
Filter( ?v1 < 3 ,
  LeftJoin( BGP(?s :p1 ?v1), BGP(?s :p2 ?v2), true) ,
  )

例: BINDを含むパターン:

{ ?s :p ?v . BIND (2*?v AS ?v2) ?s :p1 ?v2 }
Join(
   Extend( BGP(?s :p ?v), ?v2, 2*?v) ,
   BGP(?s :p1 ?v2) )

例: BINDを含み、 簡略化ステップを伴うパターン:

Issue 246: グラフ・パターン変換の例が 一貫していない spec:editorial
次の例では、結果式の最初の版(簡略化ステップ前のもの)で空のBGPを表すために {}を使用していますが、上の前の例では代わりにZを使用しています。 例はこの点で一貫しているべきです。
{ ?s :p ?v . {} BIND (2*?v AS ?v2) }
Extend(
   Join(
     Join( {}, BGP(?s :p ?v)),
     {}),
   ?v2, 2*?v
)
Extend(
   BGP(?s :p ?v) ,
   ?v2, 2*?v
)

例: MINUSを含むパターン:

{ ?s :p ?v . MINUS {?s :p1 ?v2 } }
Minus(
   BGP(?s :p ?v) ,
   BGP(?s :p1 ?v2)
)

例: サブクエリを含むパターン:

{ ?s :p ?o . {SELECT DISTINCT ?o {?o ?p ?z} } }
Join(
   BGP(?s :p ?o) ,
   ToMultiset(
     Distinct(
       Project( ToList(BGP(?o ?p ?z)), {?o} )
     )
   )
)

18.3.4 グループ、集約、HAVING、最終VALUES節および SELECT式の変換

この手順では、クエリレベル上の節を次の順序で処理します。

  • グループ化
  • 集約
  • HAVING
  • VALUES
  • Select式
18.3.4.1 グループ化と 集約

手順: GROUP BY

GROUP BYキーワードが使用される場合、または HAVING節やORDER BY節、あるいは 投影内で集約を使用することにより暗黙的なグループ化がある場合、グループ化はGroup関数によって実行されます。 この場合、グループ化の前に、ToList関数を適用することで 解集合が解列へ変換されます。 次に、Group関数は、 この解列を、同じ全体濃度を持つ1つ以上の解のグループへ分割します。 暗黙的なグループ化の場合、すべての解を単一のグループへグループ化するために固定 定数(1)が使用されます。

手順: 集約

集約手順は、クエリレベル上の変換として適用され、クエリレベル内の aggregate式をAggregation()代数 式へ置き換えます。

任意のaggregateを使用するクエリレベルに対する変換を 以下に示します。

Issue 247: グループ化と集約の変換アルゴリズムにおける 軽微な問題 spec:editorial
以下のアルゴリズムにはいくつかの軽微な問題があります。
Let A := the empty sequence
Let Q := the query level being evaluated
Let P := algebraic query expression produced for the GroupGraphPattern of the query level
Let E := [], a list of pairs of the form (variable, expression)

If Q contains GROUP BY exprlist
   Let Grp := Group(exprlist, ToList(P))
Else If Q contains an aggregate in SELECT, HAVING, ORDER BY
   Let Grp := Group((1), ToList(P))
Else
   skip the rest of the Aggregates step
   End

Global i := 1   # Initially 1 for each query processed

For each (X AS Var) in SELECT, each HAVING(X), and each ORDER BY X in Q
  For each unaggregated variable V in X
      Replace V with SAMPLE(V)
      End
  For each aggregate R(args ; scalarvals) now in X
      # note: scalarvals may be omitted; if so, it is equivalent to the empty function
      Ai := Aggregation(args, R, scalarvals, Grp)
      Replace R(...) with aggi in Q
      i := i + 1
      End
  End

For each variable V appearing outside of an aggregate
   Ai := Aggregation(V, Sample, {}, Grp)
   E := E append (V, aggi)
   i := i + 1
   End

A := Ai, ..., Ai-1
P := AggregateJoin(A)

リストEは、 第 18.3.4.4 SELECT式でSELECT式を変換するときに使用されます。

18.3.4.2 HAVING

HAVING式はFILTER()と同じ規則を用いて評価されます。 HAVING節が評価される論理上の位置のため、 SELECT節によって投影される式は HAVING節からは見えないことに注意してください。

Let Q := the query level being evaluated
Let P := the algebraic query expression produced for the query level so far

For each HAVING(E) in Q
    P := Filter(E, P)
    End
18.3.4.3 VALUES

クエリに末尾のVALUES節がある場合:

Let P := the algebraic query expression produced for the query level so far
P := Join(P, ToMultiset(data))
  where data is a solution sequence derived from the VALUES clause

データの変換はインライン データの場合と同じです。

18.3.4.4 SELECT式

手順: Select式

考慮すべき抽象構文には2つの形式があります。

SELECT selItem ... { pattern }
SELECT * { pattern }
Let X := algebraic query expression from earlier steps
Let VS := set of all variables visible in the pattern,
           so restricted by sub-SELECT projected variables and GROUP BY variables.
           Not visible: only in filter, exists/not exists, masked by a subselect, 
                        non-projected GROUP variables, only in the right hand side of MINUS

Let PV := {}, a set of variable names
Let E := a list of pairs of the form (variable, expression), populated in Section 18.3.4.1 Grouping and Aggregation
  
If "SELECT *"
    PV := VS

If  "SELECT selItem ..."
    For each selItem
        If selItem is a variable
            PV := PV ∪ { variable }
        End
        If selItem is (expr AS var)
            var must not appear in VS nor in PV; if it does then generate a syntax error and stop
            PV := PV ∪ { var }
            E := E append (var, expr) 
        End
    End

For each pair (var, expr) in E
    X := Extend(X, var, expr)
    End
  
Result is X  
The set PV is used later for projection (see Section 18.3.5.2 Projection).

構文エラーは、ASの名前付きターゲットとして変数(例: ... AS ?x)を使用したとき、その変数がSELECTのWHERE節内で使用されている場合、または このSELECT式内でASのターゲットとしてすでに使用されている場合に発生します。

18.3.5 解 修飾子の変換

解修飾子は、パターン照合後のSPARQLクエリの処理に適用されます。

解修飾子は解マッピングの列に対して作用するため、 この時点までに生成されたクエリ結果は、まず解マッピングのマルチセットから そのような列へ変換されます。この列には暗黙の順序はなく、 重複が隣接している必要もありませんが、この列は、それに含まれる要素と その多重度という点では、マルチセットと同一です。この マルチセットから列への変換を適用するため、解修飾子を 代数クエリ式へ 変換するアルゴリズムは次の手順から開始します。ここでAは、 前の節のアルゴリズムによって生成された 代数クエリ式です。

Let M := ToList(A)

次に、解修飾子は次の順序で適用されます。

  • Order by
  • Projection
  • Distinct
  • Reduced
  • Offset
  • Limit
18.3.5.1 ORDER BY

クエリ文字列にORDER BY節がある場合

M := OrderBy(M, list of order comparators)

18.3.5.2 投影

投影変数の集合PVは、 SELECT式の処理で計算されています。

M := Project(M, PV)

18.3.5.3 DISTINCT

クエリがDISTINCTを含む場合、

M := Distinct(M)

18.3.5.4 REDUCED

クエリがREDUCEDを含む場合、

M := Reduced(M)

18.3.5.5 OFFSETおよびLIMIT

クエリが"OFFSET offset"と"LIMIT limit"を含む場合

M := Slice(M, offset, limit)

クエリが"OFFSET offset"を含むが、"LIMIT limit"を含まない場合

M := Slice(M, offset)

クエリが"LIMIT limit"を含むが、"OFFSET offset"を含まない場合

M := Slice(M, 0, limit)

18.3.5.6 最終 代数クエリ式
全体の代数クエリ式はMです。

18.4 基本グラフ・パターン

グラフ・パターンを照合するとき、可能な解は マルチセットバッグとも呼ばれるものを形成します。マルチセットとは、 各要素が複数回現れ得る、順序付けられていない要素の集まりです。それは 要素の集合と、これら各要素の多重度(すなわち、その要素がマルチセットに含まれる回数) を与える関数によって記述されます。

解マッピングをμと書きます。

dom(μ0)が空集合であるようなマッピングを μ0と書きます。

空マッピングμ0だけからなり、多重度が1であるマルチセットを Ω0と書きます。これはjoinの単位元です。

解マッピングで変数xをRDF用語tへ写すものを μ(x) : { (x, t) }と書きます。

定義: 互換マッピング

2つの解マッピングμ1およびμ2は、dom(μ1)と dom(μ2)の両方に含まれるすべての変数vについて、μ1(v) = μ2(v)である場合に互換です。

ここで、μ1(v) = μ2(v)とは、μ1(v)とμ2(v)が 同じRDF用語であることを意味します。

μ1とμ2が互換である場合、μ1 ∪ μ2も マッピングです。μ1 ∪ μ2をmerge(μ1, μ2)と書きます。

定義: 多重度

解マッピングのマルチセット Ωと解 マッピング μが与えられたとき、 multiplicity(μ | Ω) と書いて、μΩ内に現れる回数を表します。

同様に、解列 Ψと解 マッピング μが与えられたとき、 multiplicity(μ | Ψ) と書いて、μΨ内に現れる回数を表します。

18.4.1 SPARQL基本 グラフ・パターン照合

基本グラフ・パターンは、クエリのその部分に対するアクティブグラフと照合されます。 基本グラフ・パターンは、変数と空白ノードの両方を用語で置き換えることによって インスタンス化でき、インスタンスには2つの概念があります。空白ノードは、 空白ノードからRDF用語への RDFインスタンス・マッピング σを使用して 置き換えられます。 変数は、クエリ変数からRDF用語への解マッピングによって置き換えられます。

定義: パターン・インスタンス・マッピング

パターン・インスタンス・マッピングPは、RDFインスタンス・マッピング σと解マッピングμの組み合わせです。P(x) = μ(σ(x))

BGP 'x'について、P(x)は、x内の空白ノードbのうちσが 定義されているものをσ(b)で置き換え、x内のすべての変数vのうちμが定義されているものを μ(v)で置き換えた結果を表します。

任意のパターン・インスタンス・マッピングは、それぞれクエリ変数および空白ノードへ 制限することにより、一意の解マッピングおよび一意のRDFインスタンス・マッピングを定義します。

定義: 基本グラフ・パターン照合

BGPを基本グラフ・パターン、GをRDFグラフとします。

P(BGP)がGの部分グラフであり、μがBGP内のクエリ変数に対するPの制限であるような パターン・インスタンス・マッピングPが存在する場合、μはGからのBGPに対する です。

multiplicity( μ | Ω ) = P = μ(σ)がパターン・インスタンス・マッピングであり、P(BGP)がGの部分グラフであるような、 異なるRDFインスタンス・マッピングσの数。

基本グラフ・パターンが空集合である場合、解はΩ0です。

18.4.2 空白ノードの扱い

この定義により、解マッピングは、基本グラフ・パターンBGP内の変数を G内の空白ノードへ束縛できます。SPARQLは、結果形式文書 (SPARQL Query Results XML Format (Second Edition)SPARQL 1.1 Query Results JSON Formatおよび SPARQL 1.1 Query Results CSV and TSV Formats)内の空白ノード識別子を文書にスコープ付けられるものとして扱うため、 それらをデータセットのアクティブグラフ内のノードを識別するものとして理解することはできません。 DSがクエリのデータセットである場合、したがってパターン解はDS自体のアクティブグラフからではなく、 スコーピンググラフと呼ばれるRDFグラフから得られるものとして理解されます。このグラフは DSのアクティブグラフですが、その空白ノードが、DSにもBGPにも存在しない新しい空白ノードで 一様に置き換えられています。これはRDFグラフを マージする場合に行われることに似ています。 同じスコーピンググラフが単一のクエリに対するすべての解に使用されます。 スコーピンググラフは純粋に理論的な構成物です。実際には、その効果は空白ノード識別子に対する 文書スコープ規約によって単に得られます。

RDF空白ノードは多くのパターンについて無限に多くの冗長な解を許すため、 パターン解は無限個になり得ます(空白ノードを異なる空白ノードで置き換えることで得られます)。 したがって、基本グラフ・パターンに対する解を何らかの方法で区切る必要があります。 SPARQLは、部分グラフ一致基準を用いて基本グラフ・パターンの解を決定します。 基本グラフ・パターンからアクティブグラフの部分集合への異なるパターン・インスタンス・マッピングごとに 1つの解があります。

これは冗長性の除去よりも計算の容易さに最適化されています。 データセットのアクティブグラフが leanであっても クエリ結果に冗長性が含まれることを許し、 論理的に等価なデータセットが異なるクエリ結果を生じることも許します。

18.5 プロパティ・パス・パターン

この節では、プロパティ・パス パターンの評価を定義します。プロパティ・パス・パターンは、主語端点 (RDF用語または変数)、 プロパティ・パス式、および目的語端点から構成されます。

プロパティ・パス式の変換は、 すべてのプロパティ・パス式代数プロパティ・パス式へ変換します。 たとえば、プロパティ・パス式(:p/:q)*は、 sequenceプロパティ・パスを含むZeroOrMorePath式であり、 代数プロパティ・パス式 ZeroOrMorePath( Seq(Link(:p), Link(:q)) )へ変換されます。

その後、プロパティ・パス・パターンの変換は、 これらの代数プロパティ・パス式の一部を他のSPARQLグラフ・パターンへ変換します。 たとえば、長さ1のプロパティ・パスをトリプル・パターンへ変換し、それらはさらに 基本グラフ・パターンへ結合されます。 その結果、次の演算子を持つ代数プロパティ・パス式が残ります。 AltZeroOrOnePathZeroOrMorePathOneOrMorePath、 およびNPS、 ならびにこれらの演算子内に含まれる代数プロパティ・パス 式です。

これらの残りの代数プロパティ・パス式を持つプロパティ・パス・パターンは、 代数構文内で、端点 XおよびYに対する Path(X, ppe, X)の形式で 存在します。

表記

プロパティ・パス・パターンの評価を表すために、すべての 代数クエリ式 のうち Path(X, ppe, Y)の形式であるものについて、 次のように書きます。

ppeval(X, ppe, Y)

これは解マッピングのマルチセットを生成し、各解マッピングは使用される変数の束縛を持ちます (XおよびYはどちらも 変数であり得ます)。一部の演算子は解マッピングの集合だけを生成します。

表記 xが次である場合
x:term RDF用語
x:var 変数
Issue 349: プロパティ・パス・パターンの評価において 問い合わせ対象グラフが明示されていない
ppevalのシグネチャは次のように拡張されるべきです。 ppeval(X, ppe, Y, G)。 ここでGはRDFグラフです。

すべての評価は、クエリ全体の評価におけるその時点の アクティブグラフとの照合によって行われます。 明確さのため、各定義にアクティブグラフを明示的に含めることは省略します。

定義: 述語プロパティ・パスの評価

iriをIRIとします。

ppeval(X, Link(iri), Y) = evaluation of basic graph pattern {X iri Y}

XYがどちらも変数である場合、これは次と同じです。

ppeval(X:var, Link(iri), Y:var) =
    { (X, xn:term) (Y, yn:term) | triple (xn, iri, yn) is in the active graph }

Xが変数でYがRDF用語である場合:

ppeval(X:var, Link(iri), Y:term) =
    { (X, xn:term) | triple (xn, iri, Y) is in the active graph }

XがRDF用語でYが変数である場合:

ppeval(X:term, Link(iri), Y:var) =
    { (Y, yn:term) | triple (X, iri, yn) is in the active graph }

XYがどちらもRDF用語である場合:

ppeval(X:term, Link(iri), Y:term)
    = { μ0 } if triple (X, iri, Y) is in the active graph
    = { { } } = Ω0 

ppeval(X:term, Link(iri), Y:term) =
     { } if triple (X, iri, Y) is not in the active graph

非形式的には、述語プロパティ・パスを評価することは、クエリ評価のその時点で SELECT * { X iri Y }という サブクエリを実行することと同じです。

定義: 逆プロパティ・パスの評価

ppe代数プロパティ・パス 式とすると、次のようになります。

ppeval(X, Inv(ppe), Y) = ppeval(Y, ppe, X)

定義: sequenceプロパティ・パスの評価

ppe1およびppe2代数プロパティ・パス式とします。 Vを新鮮な変数とします。

ppeval(X, Seq(ppe1, ppe2), Y) = ToMultiSet( Project(ToList(A), PV) )

ここでA = Join( ppeval(X, ppe1, V), ppeval(V, ppe2, Y) ) であり、PV = { projVar ∈ {X,Y} | projVarは 変数 }です。

非形式的には、これは次と同じです。

SELECT * { X P1 _:a . _:a P2 Y }

ここでP1プロパティ・パス式であり、 変換によって 代数プロパティ・パス式 ppe1になり、 P2ppe2へ変換できます。 この観察は、単純含意の下では空白ノード_:aが変数のように振る舞うが、 SELECT *の結果には現れないという事実に基づきます。

定義: 代替プロパティ・パスの評価

ppe1およびppe2代数プロパティ・パス式とします。

ppeval(X, Alt(ppe1, ppe2), Y) =
    Union( ppeval(X, ppe1, Y), ppeval(X, ppe2, Y) )

非形式的には、これは次と同じです。

SELECT * { { X P1 Y } UNION { X P2 Y } }

ここでP1プロパティ・パス式であり、 変換によって 代数プロパティ・パス式 ppe1になり、 P2ppe2へ変換できます。

定義: グラフのノード集合

グラフGのノード集合nodes(G)は次のとおりです。

nodes(G) = { n | nGの表明されたトリプルの主語または目的語として使用されるRDF用語 }

定義: ZeroOrOnePathの評価

ppe代数プロパティ・パス 式とします。 Gアクティブグラフとします。

ppeval(X:term, ZeroOrOnePath(ppe), Y:var) = 
    { (Y, yn) | yn = X or {(Y, yn)} in ppeval(X, ppe, Y) }
ppeval(X:var, ZeroOrOnePath(ppe), Y:term) =
    { (X, xn) | xn = Y or {(X, xn)} in ppeval(X, ppe, Y) }
ppeval(X:term, ZeroOrOnePath(ppe), Y:term) = 
    { {} } if X = Y or ppeval(X,ppe,X) is not empty
    { } otherwise
ppeval(X:var, ZeroOrOnePath(ppe), Y:var) = 
    { (X, xn) (Y, yn) | 
        either (yn in nodes(G) and xn = yn)
        or {(X, xn), (Y, yn)} in ppeval(X, ppe, Y) }

ZeroOrMorePathおよび OneOrMorePathの定義で使用される補助関数 ALPを定義します。 ここで与えられるアルゴリズムは機能を規定するためのものであることに注意してください。 実装者は、クエリ全体について同じ結果を生成する任意の方法で評価を実装できます。 ZeroOrMorePathおよび OneOrMorePath形式は、 パスによって接続された異なるノードに基づいて一致を返します。

照合アルゴリズムは、すべてのパスを辿り、そのパス上ですでに訪問されたグラフノード (主語または目的語)を検出することに基づきます。

非形式的には、このアルゴリズムは、各ステップで与えられた 代数プロパティ・パス式 ppeを1回適用することで結果のマルチセットを拡張しようとし、 この特定のパスについて訪問したノードを記録します。検討中のパスについて ノードがすでに訪問されている場合、それは別のステップの候補にはなりません。

定義: 関数ALP

Let ppe be an algebraic property path expression.
Let reachableTerms(x:term, ppe) be the set of RDF terms
 reached by repeated matches of ppe,
 when starting at RDF term x.

  ALP(x:term, ppe) =
      Let V = empty set of terms
      ALP_recurse(x:term, ppe, V)
      return is V

  ALP_recurse(x:term, ppe, V:set of RDF terms) =
      if ( x in V ) return 
      add x to V
      X = reachableTerms(x, ppe)
      For n:term in X
          ALP_recurse(n, ppe, V)
          End

定義: ZeroOrMorePathの評価

ppe代数プロパティ・パス 式とします。 Gアクティブグラフとします。

ppeval(X:term, ZeroOrMorePath(ppe), vy:var) =
    { { (vy, n) } | n in ALP(X, ppe) }

ppeval(vx:var, ZeroOrMorePath(ppe), vy:var) =
    { { (vx, t), (vy, n) } |  
      t in nodes(G), (vy, n) in ppeval(t, ZeroOrMorePath(ppe), vy) }

ppeval(vx:var, ZeroOrMorePath(ppe), y:term) = 
    ppeval(y:term, ZeroOrMorePath(Inv(ppe)), vx:var)

ppeval(x:term, ZeroOrMorePath(ppe), y:term) = 
    { { } } if { (vy:var,y) } in ppeval(x, ZeroOrMorePath(ppe), vy)
    { } otherwise

定義: OneOrMorePathの評価

ppe代数プロパティ・パス 式とします。 Gアクティブグラフとします。

# For OneOrMorePath, we take one step of the path then start
# recording nodes for results.

ppeval(x:term, OneOrMorePath(ppe), vy:var) = { { (vy, t) } | t in V }
    where V is the set of RDF terms that is returned by the
    following algorithm.

    Let X = reachableTerms(x, ppe)
    Let V = the empty multiset
    For n in X
        ALP_recurse(n, ppe, V)
    End
    result is V

ppeval(vx:var, OneOrMorePath(ppe), vy:var) =
     { { (vx, t), (vy, n) } |
         t in nodes(G), (vy, n) in ppeval(t, OneOrMorePath(ppe), vy) }

ppeval(vx:var, OneOrMorePath(ppe), y:term) =
    ppeval(y:term, OneOrMorePath(Inv(ppe)), vx)

ppeval(x:term, OneOrMorePath(ppe), y:term) =
    { { } } if { (vy:var, y) } in ppeval(x, OneOrMorePath(ppe), vy)
    { } otherwise

定義: NegatedPropertySetの評価

Write μ' as the extension of a solution mapping:
μ'(μ, x) = μ(x)   if x is a variable
μ'(μ, t) = t      if t is an RDF term
Let x and y be variables or RDF terms, S a set of IRIs,
and G the active graph.

   ppeval(x, NPS(S), y) =
       { μ | ∃ triple(μ'(μ, x), p, μ'(μ, y)) in G, such that the IRI of pS }

18.6 SPARQL代数

SPARQL抽象クエリに残る各記号について、評価用の演算子を定義します。 同じ名前のSPARQL代数演算子は、「評価 意味論」の節で説明されるように、SPARQL抽象クエリノードを評価するために使用されます。 基本グラフ・パターンおよびプロパティ・パス・パターンの評価は、上で説明されています。

定義: Filter

Ωを解マッピングのマルチセット、 exprDデータセットGアクティブグラフとします。 次のように定義します。

Filter(expr, Ω, D, G) = { μ in Ω | expr(μ, D, G) がRDF用語tであり、 EBV(t) が "true"^^xsd:boolean である }

multiplicity( μ | Filter(expr, Ω, D, G) ) = multiplicity( μ | Ω )

ここで、すべての解マッピングμについて、 expr(μ, D, G) は、 アクティブグラフGを持つデータセットDの文脈において、 μに関して式expr評価した結果です。

定義: Join

Ω1およびΩ2を解マッピングのマルチセットとします。 次のように定義します。

Join(Ω1, Ω2) = { merge(μ1, μ2) | μ1 in Ω1 and μ2 in Ω2, and μ1 and μ2 are compatible }

multiplicity( μ | Join(Ω1, Ω2) ) =
    各 merge(μ1, μ2) について、 μ1 in Ω1 and μ2 in Ω2 such that μ = merge(μ1, μ2) であり、
        (μ1, μ2) にわたって合計した、 multiplicity( μ1 | Ω1 ) * multiplicity( μ2 | Ω2 )

Join内の解マッピングμは、結合されるマルチセット内の異なる解マッピング μ1およびμ2から生じることがあります。 μの多重度は、すべての可能性からの多重度の合計です。

定義: Diff

Ω1およびΩ2を解マッピングのマルチセット、 exprDデータセットGアクティブグラフとします。 次のように定義します。

Diff(Ω1, Ω2, expr, D, G) = { μ in Ω1 | Ω2内のすべての μ'について、次の条件のいずれかが成り立つ:

  • μμ'互換ではない、
  • μμ'互換であり、 expr(merge(μ, μ'), D, G) がエラーである、または
  • μμ'互換であり、 expr(merge(μ, μ'), D, G) がRDF 用語tであって、 EBV(t) が "true"^^xsd:boolean ではない。

}

multiplicity( μ | Diff(Ω1, Ω2, expr, D, G) ) = multiplicity( μ | Ω1 )

ここで、すべての解マッピングμについて、 expr(μ, D, G) は、 アクティブグラフGを持つデータセットDの文脈において、 μに関して式expr評価した結果です。

Diffは、LeftJoinの定義のために内部的に使用されます。

定義: LeftJoin

Ω1およびΩ2を解マッピングのマルチセット、 exprDデータセットGアクティブグラフとします。 次のように定義します。

LeftJoin(Ω1, Ω2, expr, D, G) = Filter(expr, Join(Ω1, Ω2), D, G) ∪ Diff(Ω1, Ω2, expr, D, G)

multiplicity( μ | LeftJoin(Ω1, Ω2, expr, D, G) ) = multiplicity( μ | Filter(expr, Join(Ω1, Ω2), D, G) ) + multiplicity( μ | Diff(Ω1, Ω2, expr, D, G) )

定義: Union

Ω1およびΩ2を解マッピングのマルチセットとします。 次のように定義します。

Union(Ω1, Ω2) = { μ | μ in Ω1 or μ in Ω2 }

multiplicity( μ | Union(Ω1, Ω2) ) = multiplicity( μ | Ω1 ) + multiplicity( μ | Ω2 )

定義: Minus

Ω1およびΩ2を解マッピングのマルチセットとします。 次のように定義します。

Minus(Ω1, Ω2) = { μ | μ in Ω1 . ∀ μ' in Ω2, either μ and μ' are not compatible or dom(μ) and dom(μ') are disjoint }

multiplicity( μ | Minus(Ω1, Ω2) ) = multiplicity( μ | Ω1 )

dom(μ)およびdom(μ')に対する追加の制限は、そうしないと、 Ω1の解マッピングと共通の変数を持たない解マッピングが Ω2内に存在する場合、 Minus(Ω1, Ω2)が、 Ω2の残りに関係なく空になってしまうために追加されています。 空の解マッピングは他のすべての解マッピングと互換であるため、そうしなければ任意の パターンPについてP MINUS {}は空になってしまいます。

定義: Extend

μを解マッピング、Ωを解マッピングのマルチセット、 varを変数、 exprDデータセットGアクティブグラフとします。 次のように定義します。

Extend(Ω, var, expr, D, G) = { Extend(μ', var, expr, D, G) | μ' in Ω },

multiplicity( μ | Extend(Ω, var, expr, D, G) ) = multiplicity( μ' | Ω ) if there exists a solution mapping μ' in Ω such that μ = Extend(μ', var, expr, D, G),

multiplicity( μ | Extend(Ω, var, expr, D, G) ) = 0 if no such solution mapping μ' exists in Ω,

ここで、すべての解マッピングμ'について、

Extend(μ', var, expr, D, G) = μ' ∪ { (var, expr(μ', D, G)) } if var not in dom(μ') and expr(μ', D, G) is an RDF term,

Extend(μ', var, expr, D, G) = μ' if var not in dom(μ') and expr(μ', D, G) is an エラー,

Extend(μ', var, expr, D, G) is undefined if var in dom(μ'), and

expr(μ', D, G) は、 アクティブグラフGを持つデータセットDの文脈において、 μ'に関して式expr評価した結果です。

Cxに関する条件であるような要素の列を [ x | C ] と書きます。

定義: ToList

Ωを解マッピングのマルチセットとします。次のように定義します。

ToList(Ω) = 任意の順序で並べた、 Ω内のマッピングμの列であり、 multiplicity( μ | Ω ) 回だけ μが出現するもの

multiplicity( μ | ToList(Ω) ) = multiplicity( μ | Ω )

定義: OrderBy

Ψを解マッピングの列とします。次のように定義します。

OrderBy(Ψ, condition) = [ μ | μ in Ψ and the sequence satisfies the ordering condition]

multiplicity( μ | OrderBy(Ψ, condition) ) = multiplicity( μ | Ψ )

定義: Project

Ψを解マッピングの列、PVを変数の集合とします。

マッピングμについて、Proj(μ, PV)を、 PV内の変数に対するμの制限と書きます。

Project(Ψ, PV) = [ Proj(μ, PV) | μ in Ψ ]

multiplicity( μ | Project(Ψ, PV) ) = sum( multiplicity( μ' | Ψ ) | μ' in Ψ such that μ' = Proj(μ, PV) )

Project(Ψ, PV)の順序は、 OrderByによって与えられた順序を保持しなければなりません。

定義: Distinct

Ψを解マッピングの列とします。次のように定義します。

Distinct(Ψ) = [ μ | μ in Ψ ]

multiplicity( μ | Distinct(Ψ) ) = 1 for every μDistinct(Ψ)

multiplicity( μ | Distinct(Ψ) ) = 0 for every μDistinct(Ψ)

Distinct(Ψ)の順序は、 OrderByによって与えられた順序を保持しなければなりません。

定義: Reduced

Ψを解マッピングの列とします。次のように定義します。

Reduced(Ψ) = [ μ | μ in Ψ ]

multiplicity( μ | Reduced(Ψ) ) は、 すべてのμReduced(Ψ)について、 1から multiplicity( μ | Ψ ) までの間です。

multiplicity( μ | Reduced(Ψ) ) = 0 for every μReduced(Ψ)

Reduced(Ψ)の順序は、 OrderByによって与えられた順序を保持しなければなりません。

Reduced解列修飾子は、定義された多重度を保証しません。

定義: Slice

Ψを解マッピングの列、offsetおよびlimitを 非負整数とします。次のように定義します。

Slice(Ψ, offset) = Ψ0   if offsetCard(Ψ)

Slice(Ψ, offset) = subseq(Ψ, offset+1, Card(Ψ))   if 0 ≤ offset < Card(Ψ)

Slice(Ψ, offset, limit) = Ψ0   if offsetCard(Ψ) or limit = 0

Slice(Ψ, offset, limit) = subseq(Ψ, offset+1, Card(Ψ))   if 0 ≤ offset < Card(Ψ) and limitCard(Ψ)−offset

Slice(Ψ, offset, limit) = subseq(Ψ, offset+1, offset+limit)   if 0 ≤ offset < Card(Ψ) and 0 < limit < Card(Ψ)−offset

ここで、Ψ0は解マッピングの空列であり、 任意の2つの整数iおよびjについて、 subseq(Ψ, i, j) は、 Ψi番目の要素から始まり、 Ψj番目の要素で終わる Ψの部分列です。

この定義は、列が1始まりであり、部分列が両端を含むもの (すなわち、j番目の要素で終わるとは、 部分列がΨj番目の要素を最後の要素として含むことを意味します) と仮定していることに注意してください。

定義: ToMultiSet

Ψを解列とします。次のように定義します。

ToMultiSet(Ψ) = { μ | μ in Ψ }

multiplicity( μ | ToMultiSet(Ψ) ) = multiplicity( μ | Ψ )

18.6.1 集約代数

Groupは、解の何らかの属性に基づいて、 解列を複数の解へグループ化する関数です。

定義: Group

Groupは、式のリストを 解列Ψに対して評価し、キーから解列への部分関数を生成します。

Group(exprlist, Ψ) = { ListEval(exprlist, μ) → [ μ' | μ' in Ψ such that ListEval(exprlist, μ') and ListEval(exprlist, μ) are the same ] | μ in Ψ },

ここで、ListEval関数によって生成される2つのリスト LおよびL'は、同じ数の要素を持ち、 2つのリスト内の各位置 kについて、次の2つの条件のいずれかが真である場合に限り、 同じと見なされます。

  • Lk番目の位置にある要素がRDF用語であり、 L'k番目の位置にある要素もRDF用語であり、 これら2つのRDF用語が同じ用語である。
  • Lk番目の位置にある要素がエラーであり、 L'k番目の位置にある要素もエラーである。

定義: ListEval

ListEval((expr1, ..., exprn), μ) はリスト (e1, ..., en) を返します。ここで、 ei = expri(μ) または エラーです。

ListEvalは、リスト要素の評価から生じるエラーを保持します。

ListEvalの結果にはエラーが含まれることがあり、 エラーがグループ化に使用されることもありますが、 エラー値を含む解は、グループおよび任意の集約関数の評価の最後に削除されることに注意してください。

ListEval((unbound), μ)の結果はリスト(error)であることにも注意してください。 束縛されていない式の評価はエラーであるためです。

Aggregationは、集約 式の出力としてスカラー値を計算する関数です。これはSELECT節、HAVING評価処理、および必要な場合にはORDER BYで使用されます。Aggregationは、 集合関数を用いて、解のグループにわたる集約値を計算します。

定義: Aggregation

exprlistを式のリストまたは*funcを集合関数、 scalarvalsをクエリ内の集約から渡される部分関数(空の定義域を持つ可能性がある)、 そして { key1Ψ1, ..., keymΨm } を、 グループ化ステップによって生成されるキーから解列への部分関数とします。

Aggregationは、与えられた集合に集合関数 funcを適用し、各キーについて単一の値と、そのキーに対応する解のグループを生成します。

Aggregation(exprlist, func, scalarvals, { key1Ψ1, ..., keymΨm } )
   = { (key, F(Ψ)) | keyΨ in { key1Ψ1, ..., keymΨm } }

ここで
  M(Ψ) = [ ListEval(exprlist, μ) | μ in Ψ ]
  F(Ψ) = func(M(Ψ), scalarvals)、 非DISTINCTの場合
  F(Ψ) = func(Dedup(M(Ψ)), scalarvals)、 DISTINCTの場合

Dedup(M(Ψ))は、列M(Ψ)の順序を保持した重複のない版です。 すなわち、Dedup(M(Ψ))は、次の4つの性質を持つリストの列です (この列内の各リストは、ListEval関数によって生成されるため、 RDF用語およびエラーを含むことがあります)。

  1. M(Ψ)内のすべてのリスト Lについて、 Dedup(M(Ψ))内にリスト L'が存在し、 LL'は同じです。 ここで、M(Ψ)からの2つのリストLおよびL'が 同じと見なされる方法は、 Group演算子の定義で指定されたとおりです。
  2. Dedup(M(Ψ))内のすべてのリスト Lについて、 M(Ψ)内にリスト L'が存在し、 LL'は同じです。
  3. Dedup(M(Ψ))には重複がありません。すなわち、任意の2つの自然数 iおよびjについて、ijであるならば、 Dedup(M(Ψ))内のi番目の位置にあるリストは、 Dedup(M(Ψ))内のj番目の位置にあるリストと同じリストではありません。
  4. Dedup(M(Ψ))内の任意の2つのリストL1および L2について、M(Ψ)内でのそれらの最初の出現の相対順序は Dedup(M(Ψ))内で保持されます。すなわち、 i1 < i2であれば、 j1 < j2です。ここで、
    • i1は、 L1がM(Ψ)内の i1番目の位置にあるような最小の自然数であり、
    • i2は、 L2がM(Ψ)内の i2番目の位置にあるような最小の自然数であり、
    • j1は、 Dedup(M(Ψ))内におけるL1の位置であり、
    • j2は、 Dedup(M(Ψ))内におけるL2の位置です。

特別な場合: COUNTが式*とともに使用される場合、 F(Ψ)はグループ解列の濃度、すなわち F(Ψ) = Card(Ψ)、 またはDISTINCTキーワードが存在する場合は F(Ψ) = Card(Distinct(Ψ))です。

scalarvalsは、グループ化の仕組みを迂回して、基礎となる集合関数へ値を渡すために使用されます。 たとえば、集約式GROUP_CONCAT(?x ; separator="|")は、 { "separator" → "|" } というscalarvals引数を持ちます。

すべての集約は、引数リストの最初のトークンとしてDISTINCTキーワードを持つことができます。 このキーワードが存在する場合、funcへの第1引数はDedup(M(Ψ))です。

次の値を持つ解列Ψが与えられたとします。

?x ?y ?z
μ1 1 2 3
μ2 1 3 4
μ3 2 5 6

そしてクエリ式 SELECT (ex:agg(?y, ?z) AS ?agg) WHERE { ?x ?y ?z } GROUP BY ?x があるとします。

G = Group((?x), Ψ) = { (1) → [μ1, μ2], (2) → [μ3] } を生成します。

したがって、Aggregation((?y, ?z), ex:agg, {}, G) =
{ ((1), eg:agg([(2, 3), (3, 4)], {})), ((2), eg:agg([(5, 6)], {})) } です。

定義: AggregateJoin

S1, ..., Snを集合のリストとし、 各集合SiAggregationによって生成される キーから(集約された)値へのマップを含むものとします。

K = { key | key in dom(Sj) for some 1 ≤ jn } をキーの集合とすると、
AggregateJoin(S1, ..., Sn) = { agg1val1, ..., aggnvaln | key in K and keyvali in Si for each 1 ≤ in }

18.6.1.1 集合関数

SPARQL集約の基礎となる集合関数はすべて共通のシグネチャを持ちます。 SetFunc(S)、または SetFunc(S, scalarvals) です。 ここでSはリストの列であり、scalarvalsは、 SPARQL文法内の集約用の ( ... ; key=value ) 構文を介して間接的に集合関数へ渡される 1つ以上のスカラー値です。SPARQL Query 1.1の組み込み集約でサポートされる この仕組みの唯一の使用は、GROUP_CONCAT(?x ; separator=", ")のような GROUP_CONCATです。

「集合関数」という名前はいくらか歴史的なものであることに注意してください。 集合関数への引数は実際には列です。この名前は、マルチセットに対して動作するSQLの 集合関数との共通性のために保持されています。

この文書で定義される集合関数は、 CountSumMinMaxAvgGroupConcat、および Sample です。これらは集約COUNTSUMMINMAXAVGGROUP_CONCAT、およびSAMPLEに対応します。定義は 以下の節にあります。システムは、関数およびキャストと同じ表記を用いて、 ローカル拡張によりこの集合を拡張することを選択できます。なお、; separator が使用されない限り、 集約が使用されるクエリでエラーがあるかどうかを判定する前に、パーサーは何らかのIRIが 関数、キャスト、または集約のいずれを指すかを知る必要があります。

以下の節における集合関数の定義は、 FlattenおよびCardという 2つの関数に基づいており、これらは次のように定義されます。

Flattenは、リストの列を単一のリストへ折りたたむために 使用される関数です。たとえば、[(1, 2), (3, 4)] は (1, 2, 3, 4) になります。

定義: Flatten

Sをリストの列とします。すなわち、S = [L1, L2, ..., Lm] であり、すべてのi ∈ {1, ..., m}について、 Liはリストです。

Flatten(S)は、 ( x | L in S and x in L ) というリストです。

Cardは、列または要素のリスト (文脈に応じて、解マッピングまたは他の型の要素であり得ます)の 濃度を返す関数です。

定義: Card

列またはリストLが与えられたとき、Card(L)は Lの濃度です。

18.6.1.2 Count

Countは、与えられた式が集約グループ内で 束縛され、エラーでない値を持つ回数を数えるSPARQL集合関数です。

定義: Count

xsd:integer Count(sequence S)

Count(S) = Card(L'),

ここでL'は、リストL = Flatten(S)から すべてのエラー要素を削除したものです。

18.6.1.3 Sum

Sumは、集約グループ内の値を合計して得られる 数値を返すSPARQL集合関数です。型昇格は、推移的に適用されるop:numeric-add関数に従って行われます (下の定義を参照)。そのため、?xが1(integer)、2.0e0(float)、3.0(decimal)の値を持つ 集約グループにおけるSUM(?x)の値は、6.0(float)になります。

定義: Sum

numeric Sum(sequence S)

Sum(S) = SumList(L),

ここでL = Flatten(S)であり、 SumList(L)は次のように再帰的に定義されます。

L1Lの最初の要素であり、 L2..nは最初の要素を除いたLであることに注意してください。

このように、Sum( [(1), (2), (3)] ) = SumList( (1, 2, 3) ) = op:numeric-add(1, op:numeric-add(2, op:numeric-add(3, 0))) です。

18.6.1.4 Avg
Avg集合関数は、 グループにわたる式の平均値を計算します。これはSumおよびCountに基づいて定義されます。

定義: Avg

numeric Avg(sequence S)

Count(S) = 0 の場合、 Avg(S) = "0"^^xsd:integerです。

Count(S) > 0 の場合、 Avg(S) = Sum(S) / Count(S)です。

たとえば、Avg([(1), (2), (3)]) = Sum([(1), (2), (3)])/Count([(1), (2), (3)]) = 6/3 = 2 です。

18.6.1.5 Min

Minは、グループから最小値を返す SPARQL集合関数です。

これは、任意の型の式に対する順序付けを可能にするため、SPARQL ORDER BYの順序定義を使用します。

定義: Min

RDFterm Min(sequence S)

Min(S) = MinList(L),

ここでLは、 Flatten(S)によって得られた値のリストを ORDER BY ASC節に従って順序付けしたものであり、 MinList(L)は次のように定義されます。

  • Card(L) = 0 の場合、 MinList(L) = error。
  • Card(L) > 0 の場合、 MinList(L) = L1。 ここでL1Lの最初の要素です。
18.6.1.6 Max

Maxは、グループから最大値を返す SPARQL集合関数です。

これは、任意の型の式に対する順序付けを可能にするため、SPARQL ORDER BYの順序定義を使用します。

定義: Max

RDFterm Max(sequence S)

Max(S) = MaxList(L),

ここでLは、 Flatten(S)によって得られた値のリストを ORDER BY DESC節に従って順序付けしたものであり、 MaxList(L)は次のように定義されます。

  • Card(L) = 0 の場合、 MaxList(L) = error。
  • Card(L) > 0 の場合、 MaxList(L) = L1。 ここでL1Lの最初の要素です。
18.6.1.7 GroupConcat

GroupConcatは、グループ内の式の値にわたって 文字列連結を実行する集合関数です。文字列の順序は指定されません。 連結で使用される区切り文字は、スカラー引数SEPARATORによって与えられます。

定義: GroupConcat

xsd:string GroupConcat(sequence S, function scalarvals)

scalarvals引数がGROUP_CONCATから省略されている場合、 scalarvalsは空関数とみなされます。

sepを、次のように定義される文字列とします。

  • scalarvalsが引数"separator"に対して定義されている場合、 sep = scalarvals("separator")。
  • scalarvalsが引数"separator"に対して未定義である場合、 sepは"space"文字(すなわち、UnicodeコードポイントU+0020)です。

GroupConcat(S, scalarvals) = GCList(L, sep),

ここでL = Flatten(S)であり、 GCList(L, sep)は 次のように再帰的に定義されます。

  • Card(L) = 0 の場合、 GCList(L, sep) = ""。
  • Card(L) = 1 の場合、 GCList(L, sep) = CONCAT("", L1)。
  • Card(L) > 1 の場合、 GCList(L, sep) = CONCAT(L1, sep, GCList(L2..n, sep))。

L1Lの最初の要素であり、 L2..nは最初の要素を除いたLであることに注意してください。

たとえば、GroupConcat([("a"), ("b"), ("c")], {"separator" → "."}) = GCList( ("a", "b", "c"), "." ) = "a.b.c" です。

18.6.1.8 Sample

Sampleは、渡された列から任意の値を返す 集合関数です。

定義: Sample

RDFterm Sample(sequence S)

Card(S) = 0 の場合、 Sample(S) = error です。

Card(S) > 0 の場合、 Sample(S) = vです。ここで vFlatten(S)内にあります。

たとえば、Sample([("a"), ("b"), ("c")])が与えられた場合、 "a"、"b"、および"c"はすべて有効な戻り値です。 Sample関数は、与えられた入力について決定的であることを 要求されないことに注意してください。唯一の制限は、出力値が入力列に存在していなければならないことです。

18.6.2 評価意味論

eval(D(G), AQE, μctx)を、 アクティブグラフGを持つデータセットDに関して、 解マッピングμctxとの相関における 代数クエリ式AQEの評価として定義します。

アクティブグラフは初期状態ではDのデフォルトグラフであり、 μctxは初期状態では空の解マッピングμ0です。

μctxμ0と異なり得る場合は、 17.4.1.4 NOT EXISTS and EXISTSで定義されるように、 EXISTS { pattern }またはNOT EXISTS { pattern }形式の を評価するときです。

以下の定義で使用される追加の記号は次のとおりです。

Issue 225: 解マッピングのマルチセットおよび列に対して eval関数が未定義 spec:bug
この節の定義は、AQEが解マッピングの列またはマルチセットである場合を 扱っていません。

定義: 基本グラフ・ パターンの評価

eval( D(G), BGP, μctx ) = 解マッピングのマルチセット

基本グラフ・パターンの節を参照してください。

定義: プロパティ・パス・ パターンの評価

eval( D(G), Path(X, path, Y), μctx ) = 解マッピングのマルチセット

プロパティ・パス・パターンの節を参照してください。

定義: ContextSolutionの評価

eval( D(G), ContextSolution, μctx ) = μctxだけを含み、多重度が1であるマルチセット

定義: Filterの評価

eval( D(G), Filter(F, A), μctx ) = Filter( F, eval(D(G), A, μctx), D, G )

定義: Joinの評価

eval( D(G), Join(A1, A2), μctx ) = Join( eval(D(G), A1, μctx), eval(D(G), A2, μctx) )

定義: LeftJoinの評価

eval( D(G), LeftJoin(A1, A2, F), μctx ) = LeftJoin( eval(D(G), A1, μctx), eval(D(G), A2, μctx), F, D, G )

定義: Minusの評価

eval( D(G), Minus(A1, A2), μctx ) = Minus( eval(D(G), A1, μctx), eval(D(G), A2, μctx) )

定義: Unionの評価

eval( D(G), Union(A1, A2), μctx ) = Union( eval(D(G), A1, μctx), eval(D(G), A2, μctx) )

定義: Graphの評価

IRIまたは 変数であるすべてのxについて、 eval( D(G), Graph(x, A), μctx ) は次のように定義されます。

  • xD内の グラフ名であるIRIの場合、
    eval( D(G), Graph(x, A), μctx ) = eval( D(Gx), A, μctx ),
    ここでGxは、D内で名前xを持つ 名前付きグラフのRDFグラフです。
  • xが、D内の グラフ名ではないIRIの場合、
    eval( D(G), Graph(x, A), μctx ) は空のマルチセットです。
  • xが変数の場合、
    eval( D(G), Graph(x, A), μctx ) = Ω,
    ここでΩは、次のアルゴリズムによって生成される解マッピングのマルチセットです。
    Ω := the empty multiset
    for each graph name gn in D (recall that a graph name may be an IRI or a blank node)
        G' := the RDF graph of the named graph with name gn in D
        Ω' := eval( D(G'), A, μctx )
        Ω := Union( Ω, Join(Ω', μ) ), where μ = {xgn}
    the result is Ω
定義: Groupの評価

eval( D(G), Group(exprlist, A), μctx ) = Group( exprlist, eval(D(G), A, μctx) )

定義: Aggregationの評価

eval( D(G), Aggregation(exprlist, func, scalarvals, Grp), μctx ) = Aggregation( exprlist, func, scalarvals, eval(D(G), Grp, μctx) )

定義: AggregateJoinの評価

eval( D(G), AggregateJoin(A1, ..., An), μctx ) = AggregateJoin( eval(D(G), A1, μctx), ..., eval(D(G), An, μctx) )

eval(D(G), Ai, μctx)がエラーである場合、それは無視されることに注意してください。

定義: Extendの評価

eval( D(G), Extend(A, var, expr), μctx ) = Extend( eval(D(G), A, μctx), var, expr, D, G )

定義: ToListの評価

eval( D(G), ToList(A), μctx ) = ToList( eval(D(G), A, μctx) )

定義: Distinctの評価

eval( D(G), Distinct(A), μctx ) = Distinct( eval(D(G), A, μctx) )

定義: Reducedの評価

eval( D(G), Reduced(A), μctx ) = Reduced( eval(D(G), A, μctx) )

定義: Projectの評価

eval( D(G), Project(A, vars), μctx ) = Project( eval(D(G), A, μctx), vars )

定義: OrderByの評価

eval( D(G), OrderBy(A, condition), μctx ) = OrderBy( eval(D(G), A, μctx), condition )

定義: ToMultiSetの評価

eval( D(G), ToMultiset(A), μctx ) = ToMultiSet( eval(D(G), A, μctx) )

定義: Sliceの評価

eval( D(G), Slice(A, offset), μctx ) = Slice( eval(D(G), A, μctx), offset )

eval( D(G), Slice(A, offset, limit), μctx ) = Slice( eval(D(G), A, μctx), offset, limit )

18.6.3 SPARQL 基本グラフ照合の拡張

SPARQL全体の設計は、基本グラフ・パターンの照合条件を書き換えることにより、 単純含意よりも複雑な形式の含意を仮定するクエリに使用できます。 そのような条件を、すべての含意形式に適用され、不要または不適切な冗長性を最適に除去する 単一の一般形式で述べることは未解決の研究課題であるため、この文書では、 そのような任意の解が満たすべき必要条件だけを示します。これらは、各特定の場合について 完全な定義へ拡張される必要があります。

基本グラフ・パターンは、RDFグラフがRDFトリプルに対して持つのと同じ関係を、 トリプル・パターンに対して持っており、多くの同じ用語を適用できます。特に、 2つの基本グラフ・パターンは、トリプル・パターンの用語間に全単射Mが存在し、 それが空白ノードを空白ノードへ写し、変数、リテラルおよびIRIをそれ自身へ写し、 かつトリプル( s, p, o )が最初のパターンに含まれる場合に限り、 トリプル( M(s), M(p), M(o) )が2番目に含まれるなら、 等価であると言われます。この定義は、等価なパターン間で変数名を保持することにより、 RDFグラフ等価性の定義を基本グラフ・パターンへ拡張します。

含意体制は次を指定します。

  1. その体制において整形式と呼ばれるRDFグラフの部分集合
  2. 整形式グラフの部分集合と整形式グラフとの間の含意関係。

さまざまな含意体制を問い合わせるための詳細な定義は、 SPARQL 1.1 Entailment Regimesにあります。

一部の含意体制は、一部のRDFグラフを矛盾しているものとして分類できます。 たとえば、次のRDFグラフ:

_:x rdf:type xsd:string .
_:x rdf:type xsd:decimal .

は、DがXSDデータ型を含む場合、D-矛盾です。矛盾したグラフに対するクエリの効果は、 この仕様では扱われず、特定のSPARQL拡張によって指定されなければなりません。

含意体制Eは、基本グラフ・パターン評価に関する条件を提供しなければなりません。 それにより、任意の基本グラフ・パターンBGP、任意のRDFグラフG、およびその条件を満たす任意の評価について、 得られる解のマルチセットはRDFグラフ等価性まで一意に決定されます。 Eを用いてG上でBGPを評価して得られる解のマルチセットをEval-E(G, BGP)と表します。
含意体制は、さらに次の条件を満たさなければなりません。

  1. 任意のE-一貫なアクティブグラフAGについて、含意体制EはAGとE-等価な スコーピンググラフSGを一意に指定する。
  2. Eに対する整形式グラフの集合が指定され、任意の基本グラフ・パターンBGP、 スコーピンググラフSG、およびEval-E(SG, BGP)内の解マッピングμについて、 グラフμ(BGP)がEに対して整形式である。
  3. 任意の基本グラフ・パターンBGPおよびスコーピンググラフSGについて、 Eval-E(SG, BGP)内のμ1, ..., μnと、BGPとすべて等価であるが互いにもSGとも空白ノードを共有しない 基本グラフ・パターンBGP1, ..., BGPnがある場合、

    SG E-entails (SG union μ1(BGP1) union ... union μn(BGPn))

    これらの条件は、RDFが無制限の冗長性を許すため、可能な解の集合を完全には決定しません。 したがって、さらに次の条件が成り立たなければなりません。

  4. 含意体制は、その体制に応じて、自明な無限解マルチセットを防ぐための条件を提供すべきです。
18.6.3.1 注記

(a) SGはしばしばAGとグラフ等価になりますが、これをE-等価性に制限することで、 たとえば意味的冗長性の除去など、いくつかの形式の正規化を、問い合わせの前にソース文書へ 適用できるようになります。

(b) 条件3の構成は、解マッピングによって導入される任意の空白ノードが、 SG内で空白ノードが出現する方法と内部的に一貫した方法で使用されることを保証します。 これにより、回答集合内の複数の回答に空白ノード識別子が現れるのは、そのように識別される 空白ノードがSG内で実際に同一である場合に限られることが保証されます。 拡張が空白ノードへの束縛を許さない場合、この条件は次の条件へ簡略化できます。

SG E-entails μ(BGP) for each solution mapping μ.

(c) これらの条件は、SGがAGまたはBGPと空白ノードを共有しないというSPARQL要件を 課すものではありません。特に、SGが実際にはAGであることを許します。 これにより、空白ノード識別子が、クエリとソース文書の間、または複数のクエリにわたって その意味を保持するクエリプロトコルが可能になります。ただし、そのようなプロトコルは 現在のSPARQLプロトコル仕様ではサポートされていません。

(d) 条件1から3は回答に関する必要条件にすぎないため、条件4は、合法な回答の集合を さまざまな方法で制限できる場合を許します。

(e) これらの条件はいずれも、BGP内の空白ノードに対するインスタンス・マッピングを 明示的に参照していません。一部の含意体制では、空白ノードの存在解釈を単一の インスタンス・マッピングの存在によって完全に捉えることはできません。これらの条件は、 そのような体制がクエリ・パターン内の空白ノードに「完全に存在的」な読みを与えることを許します。

Eが単純含意である場合、SGに関するSPARQL条件が、AGとグラフ等価であるがAGまたはBGPと 空白ノードを共有しないというものであることを前提に、SPARQLがこれらの条件を満たすことを 示すのは簡単です(これは第1条件を満たします)。自明でない唯一の条件は(3)です。

各解マッピングμiについて、基本グラフ・パターン照合の定義により、 Pi(BGPi)がSGの部分グラフとなるようなRDFインスタンス・マッピング σiが存在します。ここでPiは、μiとσiから構成される パターン・インスタンス・マッピングです。BGPiとSGは共通の空白ノードを持たないため、 σiおよびμiの値域はBGPi由来の空白ノードを含みません。 したがって、Piの解マッピングμiとRDFインスタンス・マッピングσiは 可換であり、 Pi(BGPi) = σii(BGPi)) です。したがって、

P1(BGP1) union ... union Pn(BGPn)
= σ11(BGP1)) union ... union σnn(BGPn))
= [ σ1 + ... + σn]( μ1(BGP1) union ... union μn(BGPn) )

σiのRDFインスタンス・マッピングの定義域はすべて互いに排他的であるためです。 また、それらはSGからも排他的であるため、

SG union [ σ1 + ... + σn]( μ1(BGP1) union ... union μn(BGPn) )
= [ σ1 + ... + σn](SG union μ1(BGP1) union ... union μn(BGPn) )

すなわち、

SG union μ1(BGP1) union ... union μn(BGPn)

はSGの部分グラフであるインスタンスを持つため、 RDF補間補題 [RDF12-SEMANTICS] により、 SGによって単純に含意されます。

19. SPARQL文法

SPARQL文法は、SPARQL QueryとSPARQL 1.1 Updateの両方を対象とします。

19.1 SPARQL文字列

SPARQL 文字列は、 この節で与えられる文法に適合する RDF 文字列です。

RDF文字列は、 Unicodeスカラー値である Unicodeコードポイント の列です。 Unicodeスカラー値には、 サロゲートコードポイントは含まれません。

SPARQLクエリ文字列は、 SPARQL文字列であり、 QueryUnit生成規則から始まる文法に適合するものです。

SPARQL 更新文字列は、 SPARQL文字列であり、 UpdateUnit生成規則から始まる文法に適合するものです。

Unicodeの将来の版との互換性のため、この文字列内の文字には、 この公開日の時点で未割り当てのUnicodeコードポイントを含めることができます (Unicode Identifiers and Syntax [UAX31] 第4節 Pattern Syntaxを参照)。 除外文字クラスを持つ生成規則 (たとえば[^<>'{}|^`])では、文字は #x0 - #x10FFFFの範囲から除外されます。

19.2 エスケープシーケンス

SPARQL文書で使用されるエスケープには3つの形式があります。

エスケープシーケンスは、次の場所で使用できます。

数値
エスケープ
文字列
エスケープ
予約文字
エスケープ
IRIRDF用語 として、または PREFIX、 もしくはBASE宣言内で使用されるもの はい いいえ いいえ
ローカル名 いいえ いいえ はい
文字列 はい はい いいえ

エスケープシーケンスは、関連する文法生成規則に一致するUnicodeコードポイント列を取り、 その後、次の手順を適用することで処理されます。

  1. Unicodeコードポイント列は、最初に一致するエスケープシーケンスを探すため、 左から右へ走査されます。
  2. エスケープシーケンスが見つかった場合、そのエスケープシーケンスに対応するコードポイントが エスケープシーケンスに置換されます。
  3. Unicodeコードポイント列の走査は、置換されたエスケープシーケンスの直後の コードポイントから継続します。
処理されたエスケープシーケンスの例
入力コードポイント 出力コードポイント コードポイント数
abc\u005Cdef abc\def 7
abc\u005Ctuv abc\tuv 7
\u005CA \A 2
\\u005C \u005C 6
\u005C\u005C \\ 2
\\\u005C \\ 2
\\\\ \\ 2
\u005Cn \n 2

%-encodedシーケンスは IRIの文字範囲 内にあり、ローカル名では明示的に許可されています。 これらは%の後に2つの16進文字が続くものとして現れ、 その同じ3文字の列を表します。これらのシーケンスは処理中に デコードされません。 Turtleで<http://a.example/%66oo-bar>と書かれた用語は、 IRI http://a.example/%66oo-barを指し、 IRI http://a.example/foo-barを指すものではありません。 接頭辞PREFIX ex: <http://a.example/>を伴う ex:%66oo-barと書かれた用語も、 IRI http://a.example/%66oo-barを指します。

19.3 空白

空白(生成規則WS)は、そうでなければ1つの終端記号として (誤って)認識される2つの終端記号を分離するために使用されます。以下の大文字の規則名は、 空白が重要な場所を示します。これらは、SPARQLパーサーを構築するための終端記号の 可能な選択肢を形成します。空白は文字列内では重要です。それ以外では、 空白はトークン間で無視されます。

たとえば:

?a<?b&&?c>?d

は、変数'?a'、IRI '<?b&&?c>'、および変数'?d'というトークン列であり、 2つの式を'<'(小なり)および'>'(大なり)で 接続する演算子'&&'を含む式ではありません。

19.4 コメント

SPARQLクエリ内のコメントは、IRIまたは文字列の外側にある'#'の形式を取り、 行末(文字0x0Dまたは0x0Aで示される)まで、 またはコメントマーカーの後に行末がない場合はファイル末尾まで続きます。 コメントは空白として扱われます。

19.5 IRI参照

IRIREF生成規則および (接頭辞展開後の)PrefixedName生成規則に一致するテキストは、 エスケープ処理後、RFC 3987「ABNF for IRI References and IRIs」 [RFC3987] 第2.2節におけるIRI参照の汎用構文に適合しなければなりません。 たとえば、 IRIREF <abc#def>は SPARQLクエリ文字列内に現れてもよいですが、IRIREF <abc##def>は現れてはなりません。

BASEキーワードで宣言される基底IRIは、絶対IRIでなければなりません。 PREFIXキーワードで宣言される接頭辞は、同じクエリ内で再宣言してはなりません。 BASEおよびPREFIXの説明については、 第4.1.1節 IRI用語の構文を参照してください。

19.6 空白ノードおよび 空白ノード識別子

空白ノードは、次の中では使用できません。

SPARQL更新 リクエスト内では。

空白ノード識別子 は、それが現れるSPARQL文字列にスコープ付けられます。 リクエスト文字列内で同じ空白ノード識別子が異なる場所で使われた場合、 同じ空白ノードを参照します。新しい空白ノードは各リクエストごとに生成されます。 空白ノードは、リクエストをまたいで識別子により参照することはできません。

同じ空白ノード識別子は、次の中では使用できません。

同じ空白ノード識別子は、SPARQL 1.1 Updateリクエスト内の 異なるQuadPattern節に現れることができる点に注意してください。

19.7 文法

文法で使用されるEBNF表記は、 Extensible Markup Language (XML) 1.1 [XML11] 第6節表記で定義されています。

文法には2つの入口点があります。

  1. SPARQLクエリ言語用のQueryUnit
  2. SPARQL更新言語用のUpdateUnit

SPARQL文法は、大文字名の規則を終端記号として使用する場合、LL(1)です。

注記:

  1. キーワードは大文字小文字を区別せずに照合されます。ただし、キーワード'a'は例外であり、 Turtleと同様に、rdf:typeのIRI (完全にはhttp://www.w3.org/1999/02/22-rdf-syntax-ns#type)の代わりに使用されます。
  2. エスケープシーケンスは大文字小文字を区別します。
  3. 入力をトークン化し文法規則を選択するときは、最長一致が選択されます。
  4. 符号付き数値では、符号と数値の間に空白は許されません。 AdditiveExpression文法規則は、 式の後に符号付き数値が続く2つの場合を扱うことで、これを許容します。 これらは、必要に応じて符号なし数値の加算または減算を生成します。
  5. トークンINSERT DATADELETE DATAおよび DELETE WHEREは、 単語間に任意の量の空白を許します。 明確さのため、文法では単一空白版が使用されます。
  6. QuadDataおよび QuadPattern規則は、どちらも Quads規則を使用します。 INSERT DATAおよび DELETE DATAで使用される QuadData規則は、 quadパターン内の変数を許してはなりません。
  7. 空白ノード構文は、 DELETE WHEREDELETE用のDeleteClause、 およびDELETE DATAでは許されません。
  8. 空白ノード識別子の使用を制限する規則は、 19.6 空白ノードおよび空白ノード 識別子で与えられています。
  9. VALUES節の変数リスト内の変数の数は、 DataBlock内の関連値リストそれぞれに含まれる RDF用語 の数と対応していなければなりません。
  10. VALUES節の変数リスト内の変数は、 そのリスト内で一意でなければなりません。
  11. SELECT節内のASによって導入される変数は、 すでにスコープ内にあってはなりません。
  12. BIND節で割り当てられる変数は、 GroupGraphPattern内で直前にある TriplesBlock内で すでに使用中であってはなりません。
  13. 集約関数は、 集約用の組み込みキーワードのいずれか、 または構文上は関数呼び出しであるカスタム集約にできます。 集約関数は、 SELECTHAVING およびORDER BY節でのみ使用できます。
  14. 集約関数の式引数には、集約関数を含めることはできません。
  15. カスタム集約関数だけが、関数呼び出し内で DISTINCTキーワードを使用できます。
  16. reifierまたは アノテーション構文は、 プロパティ位置が単純パス(IRI、キーワードa、または変数)である場合に限り、 トリプルの後で許可され、他のパス式では許可されません。
  17. SELECT節内での*の使用は、 GROUP BY節を含む クエリ、または 集約HAVINGもしくは ORDER BY節のいずれかに現れる場合には許可されません。
[1]   QueryUnit   ::=   Query
[2]   Query   ::=   Prologue
( SelectQuery | ConstructQuery | DescribeQuery | AskQuery )
ValuesClause
[3]   UpdateUnit   ::=   Update
[4]   Prologue   ::=   ( BaseDecl | PrefixDecl | VersionDecl )*
[5]   BaseDecl   ::=   'BASE' IRIREF
[6]   PrefixDecl   ::=   'PREFIX' PNAME_NS IRIREF
[7]   VersionDecl   ::=   'VERSION' VersionSpecifier
[8]   VersionSpecifier   ::=   STRING_LITERAL1 | STRING_LITERAL2
[9]   SelectQuery   ::=   SelectClause DatasetClause* WhereClause SolutionModifier
[10]   SubSelect   ::=   SelectClause WhereClause SolutionModifier ValuesClause
[11]   SelectClause   ::=   'SELECT' ( 'DISTINCT' | 'REDUCED' )? ( ( Var | ( '(' Expression 'AS' Var ')' ) )+ | '*' )
[12]   ConstructQuery   ::=   'CONSTRUCT' ( ConstructTemplate DatasetClause* WhereClause SolutionModifier | DatasetClause* 'WHERE' ConstructTemplate SolutionModifier )
[13]   DescribeQuery   ::=   'DESCRIBE' ( VarOrIri+ | '*' ) DatasetClause* WhereClause? SolutionModifier
[14]   AskQuery   ::=   'ASK' DatasetClause* WhereClause SolutionModifier
[15]   DatasetClause   ::=   'FROM' ( DefaultGraphClause | NamedGraphClause )
[16]   DefaultGraphClause   ::=   SourceSelector
[17]   NamedGraphClause   ::=   'NAMED' SourceSelector
[18]   SourceSelector   ::=   iri
[19]   WhereClause   ::=   'WHERE'? GroupGraphPattern
[20]   SolutionModifier   ::=   GroupClause? HavingClause? OrderClause? LimitOffsetClauses?
[21]   GroupClause   ::=   'GROUP' 'BY' GroupCondition+
[22]   GroupCondition   ::=   BuiltInCall | FunctionCall | '(' Expression ( 'AS' Var )? ')' | Var
[23]   HavingClause   ::=   'HAVING' HavingCondition+
[24]   HavingCondition   ::=   Constraint
[25]   OrderClause   ::=   'ORDER' 'BY' OrderCondition+
[26]   OrderCondition   ::=   ( ( 'ASC' | 'DESC' ) BrackettedExpression )
| ( Constraint | Var )
[27]   LimitOffsetClauses   ::=   LimitClause OffsetClause? | OffsetClause LimitClause?
[28]   LimitClause   ::=   'LIMIT' INTEGER
[29]   OffsetClause   ::=   'OFFSET' INTEGER
[30]   ValuesClause   ::=   ( 'VALUES' DataBlock )?
[31]   Update   ::=   Prologue ( Update1 ( ';' Update )? )?
[32]   Update1   ::=   Load | Clear | Drop | Add | Move | Copy | Create | DeleteWhere | Modify | InsertData | DeleteData
[33]   Load   ::=   'LOAD' 'SILENT'? iri ( 'INTO' GraphRef )?
[34]   Clear   ::=   'CLEAR' 'SILENT'? GraphRefAll
[35]   Drop   ::=   'DROP' 'SILENT'? GraphRefAll
[36]   Create   ::=   'CREATE' 'SILENT'? GraphRef
[37]   Add   ::=   'ADD' 'SILENT'? GraphOrDefault 'TO' GraphOrDefault
[38]   Move   ::=   'MOVE' 'SILENT'? GraphOrDefault 'TO' GraphOrDefault
[39]   Copy   ::=   'COPY' 'SILENT'? GraphOrDefault 'TO' GraphOrDefault
[40]   InsertData   ::=   'INSERT DATA' QuadData
[41]   DeleteData   ::=   'DELETE DATA' QuadData
[42]   DeleteWhere   ::=   'DELETE WHERE' QuadPattern
[43]   Modify   ::=   ( 'WITH' iri )? ( DeleteClause InsertClause? | InsertClause ) UsingClause* 'WHERE' GroupGraphPattern
[44]   DeleteClause   ::=   'DELETE' QuadPattern
[45]   InsertClause   ::=   'INSERT' QuadPattern
[46]   UsingClause   ::=   'USING' ( iri | 'NAMED' iri )
[47]   GraphOrDefault   ::=   'DEFAULT' | 'GRAPH'? iri
[48]   GraphRef   ::=   'GRAPH' iri
[49]   GraphRefAll   ::=   GraphRef | 'DEFAULT' | 'NAMED' | 'ALL'
[50]   QuadPattern   ::=   '{' Quads '}'
[51]   QuadData   ::=   '{' Quads '}'
[52]   Quads   ::=   TriplesTemplate? ( QuadsNotTriples '.'? TriplesTemplate? )*
[53]   QuadsNotTriples   ::=   'GRAPH' VarOrIri '{' TriplesTemplate? '}'
[54]   TriplesTemplate   ::=   TriplesSameSubject ( '.' TriplesTemplate? )?
[55]   GroupGraphPattern   ::=   '{' ( SubSelect | GroupGraphPatternSub ) '}'
[56]   GroupGraphPatternSub   ::=   TriplesBlock? ( GraphPatternNotTriples '.'? TriplesBlock? )*
[57]   TriplesBlock   ::=   TriplesSameSubjectPath ( '.' TriplesBlock? )?
[58]   ReifiedTripleBlock   ::=   ReifiedTriple PropertyList
[59]   ReifiedTripleBlockPath   ::=   ReifiedTriple PropertyListPath
[60]   GraphPatternNotTriples   ::=   GroupOrUnionGraphPattern | OptionalGraphPattern | MinusGraphPattern | GraphGraphPattern | ServiceGraphPattern | Filter | Bind | InlineData
[61]   OptionalGraphPattern   ::=   'OPTIONAL' GroupGraphPattern
[62]   GraphGraphPattern   ::=   'GRAPH' VarOrIri GroupGraphPattern
[63]   ServiceGraphPattern   ::=   'SERVICE' 'SILENT'? VarOrIri GroupGraphPattern
[64]   Bind   ::=   'BIND' '(' Expression 'AS' Var ')'
[65]   InlineData   ::=   'VALUES' DataBlock
[66]   DataBlock   ::=   InlineDataOneVar | InlineDataFull
[67]   InlineDataOneVar   ::=   Var '{' DataBlockValue* '}'
[68]   InlineDataFull   ::=   ( NIL | '(' Var* ')' ) '{' ( '(' DataBlockValue* ')' | NIL )* '}'
[69]   DataBlockValue   ::=   iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF' | TripleTermData
[70]   Reifier   ::=   '~' VarOrReifierId?
[71]   VarOrReifierId   ::=   Var | iri | BlankNode
[72]   MinusGraphPattern   ::=   'MINUS' GroupGraphPattern
[73]   GroupOrUnionGraphPattern   ::=   GroupGraphPattern ( 'UNION' GroupGraphPattern )*
[74]   Filter   ::=   'FILTER' Constraint
[75]   Constraint   ::=   BrackettedExpression | BuiltInCall | FunctionCall
[76]   FunctionCall   ::=   iri ArgList
[77]   ArgList   ::=   NIL | '(' 'DISTINCT'? Expression ( ',' Expression )* ')'
[78]   ExpressionList   ::=   NIL | '(' Expression ( ',' Expression )* ')'
[79]   ConstructTemplate   ::=   '{' ConstructTriples? '}'
[80]   ConstructTriples   ::=   TriplesSameSubject ( '.' ConstructTriples? )?
[81]   TriplesSameSubject   ::=   VarOrTerm PropertyListNotEmpty | TriplesNode PropertyList | ReifiedTripleBlock
[82]   PropertyList   ::=   PropertyListNotEmpty?
[83]   PropertyListNotEmpty   ::=   Verb ObjectList ( ';' ( Verb ObjectList )? )*
[84]   Verb   ::=   VarOrIri | 'a'
[85]   ObjectList   ::=   Object ( ',' Object )*
[86]   Object   ::=   GraphNode Annotation
[87]   TriplesSameSubjectPath   ::=   VarOrTerm PropertyListPathNotEmpty | TriplesNodePath PropertyListPath | ReifiedTripleBlockPath
[88]   PropertyListPath   ::=   PropertyListPathNotEmpty?
[89]   PropertyListPathNotEmpty   ::=   ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectListPath )? )*
[90]   VerbPath   ::=   Path
[91]   VerbSimple   ::=   Var
[92]   ObjectListPath   ::=   ObjectPath ( ',' ObjectPath )*
[93]   ObjectPath   ::=   GraphNodePath AnnotationPath
[94]   Path   ::=   PathAlternative
[95]   PathAlternative   ::=   PathSequence ( '|' PathSequence )*
[96]   PathSequence   ::=   PathEltOrInverse ( '/' PathEltOrInverse )*
[97]   PathElt   ::=   PathPrimary PathMod?
[98]   PathEltOrInverse   ::=   PathElt | '^' PathElt
[99]   PathMod   ::=   '?' | '*' | '+'
[100]   PathPrimary   ::=   iri | 'a' | '!' PathNegatedPropertySet | '(' Path ')'
[101]   PathNegatedPropertySet   ::=   PathOneInPropertySet | '(' ( PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')'
[102]   PathOneInPropertySet   ::=   iri | 'a' | '^' ( iri | 'a' )
[103]   TriplesNode   ::=   Collection | BlankNodePropertyList
[104]   BlankNodePropertyList   ::=   '[' PropertyListNotEmpty ']'
[105]   TriplesNodePath   ::=   CollectionPath | BlankNodePropertyListPath
[106]   BlankNodePropertyListPath   ::=   '[' PropertyListPathNotEmpty ']'
[107]   Collection   ::=   '(' GraphNode+ ')'
[108]   CollectionPath   ::=   '(' GraphNodePath+ ')'
[109]   AnnotationPath   ::=   ( Reifier | AnnotationBlockPath )*
[110]   AnnotationBlockPath   ::=   '{|' PropertyListPathNotEmpty '|}'
[111]   Annotation   ::=   ( Reifier | AnnotationBlock )*
[112]   AnnotationBlock   ::=   '{|' PropertyListNotEmpty '|}'
[113]   GraphNode   ::=   VarOrTerm | TriplesNode | ReifiedTriple
[114]   GraphNodePath   ::=   VarOrTerm | TriplesNodePath | ReifiedTriple
[115]   VarOrTerm   ::=   Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | NIL | TripleTerm
[116]   ReifiedTriple   ::=   '<<' ReifiedTripleSubject Verb ReifiedTripleObject Reifier? '>>'
[117]   ReifiedTripleSubject   ::=   Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | ReifiedTriple | TripleTerm
[118]   ReifiedTripleObject   ::=   Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | ReifiedTriple | TripleTerm
[119]   TripleTerm   ::=   '<<(' TripleTermSubject Verb TripleTermObject ')>>'
[120]   TripleTermSubject   ::=   Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | TripleTerm
[121]   TripleTermObject   ::=   Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | TripleTerm
[122]   TripleTermData   ::=   '<<(' TripleTermDataSubject ( iri | 'a' ) TripleTermDataObject ')>>'
[123]   TripleTermDataSubject   ::=   iri
[124]   TripleTermDataObject   ::=   iri | RDFLiteral | NumericLiteral | BooleanLiteral | TripleTermData
[125]   VarOrIri   ::=   Var | iri
[126]   Var   ::=   VAR1 | VAR2
[127]   Expression   ::=   ConditionalOrExpression
[128]   ConditionalOrExpression   ::=   ConditionalAndExpression ( '||' ConditionalAndExpression )*
[129]   ConditionalAndExpression   ::=   ValueLogical ( '&&' ValueLogical )*
[130]   ValueLogical   ::=   RelationalExpression
[131]   RelationalExpression   ::=   NumericExpression ( '=' NumericExpression | '!=' NumericExpression | '<' NumericExpression | '>' NumericExpression | '<=' NumericExpression | '>=' NumericExpression | 'IN' ExpressionList | 'NOT' 'IN' ExpressionList )?
[132]   NumericExpression   ::=   AdditiveExpression
[133]   AdditiveExpression   ::=   MultiplicativeExpression ( '+' MultiplicativeExpression | '-' MultiplicativeExpression | ( NumericLiteralPositive | NumericLiteralNegative ) ( ( '*' UnaryExpression ) | ( '/' UnaryExpression ) )* )*
[134]   MultiplicativeExpression   ::=   UnaryExpression ( '*' UnaryExpression | '/' UnaryExpression )*
[135]   UnaryExpression   ::=     '!' UnaryExpression
| '+' PrimaryExpression
| '-' PrimaryExpression
| PrimaryExpression
[136]   PrimaryExpression   ::=   BrackettedExpression | BuiltInCall | iriOrFunction | RDFLiteral | NumericLiteral | BooleanLiteral | Var | ExprTripleTerm
[137]   ExprTripleTerm   ::=   '<<(' ExprTripleTermSubject Verb ExprTripleTermObject ')>>'
[138]   ExprTripleTermSubject   ::=   iri | Var
[139]   ExprTripleTermObject   ::=   iri | RDFLiteral | NumericLiteral | BooleanLiteral | Var | ExprTripleTerm
[140]   BrackettedExpression   ::=   '(' Expression ')'
[141]   BuiltInCall   ::=     Aggregate
| 'STR' '(' Expression ')'
| 'LANG' '(' Expression ')'
| 'LANGMATCHES' '(' Expression ',' Expression ')'
| 'LANGDIR' '(' Expression ')'
| 'DATATYPE' '(' Expression ')'
| 'BOUND' '(' Var ')'
| 'IRI' '(' Expression ')'
| 'URI' '(' Expression ')'
| 'BNODE' ( '(' Expression ')' | NIL )
| 'RAND' NIL
| 'ABS' '(' Expression ')'
| 'CEIL' '(' Expression ')'
| 'FLOOR' '(' Expression ')'
| 'ROUND' '(' Expression ')'
| 'CONCAT' ExpressionList
| SubstringExpression
| 'STRLEN' '(' Expression ')'
| StrReplaceExpression
| 'UCASE' '(' Expression ')'
| 'LCASE' '(' Expression ')'
| 'ENCODE_FOR_URI' '(' Expression ')'
| 'CONTAINS' '(' Expression ',' Expression ')'
| 'STRSTARTS' '(' Expression ',' Expression ')'
| 'STRENDS' '(' Expression ',' Expression ')'
| 'STRBEFORE' '(' Expression ',' Expression ')'
| 'STRAFTER' '(' Expression ',' Expression ')'
| 'YEAR' '(' Expression ')'
| 'MONTH' '(' Expression ')'
| 'DAY' '(' Expression ')'
| 'HOURS' '(' Expression ')'
| 'MINUTES' '(' Expression ')'
| 'SECONDS' '(' Expression ')'
| 'TIMEZONE' '(' Expression ')'
| 'TZ' '(' Expression ')'
| 'NOW' NIL
| 'UUID' NIL
| 'STRUUID' NIL
| 'MD5' '(' Expression ')'
| 'SHA1' '(' Expression ')'
| 'SHA256' '(' Expression ')'
| 'SHA384' '(' Expression ')'
| 'SHA512' '(' Expression ')'
| 'COALESCE' ExpressionList
| 'IF' '(' Expression ',' Expression ',' Expression ')'
| 'STRLANG' '(' Expression ',' Expression ')'
| 'STRLANGDIR' '(' Expression ',' Expression ',' Expression ')'
| 'STRDT' '(' Expression ',' Expression ')'
| 'sameTerm' '(' Expression ',' Expression ')'
| 'isIRI' '(' Expression ')'
| 'isURI' '(' Expression ')'
| 'isBLANK' '(' Expression ')'
| 'isLITERAL' '(' Expression ')'
| 'isNUMERIC' '(' Expression ')'
| 'hasLANG' '(' Expression ')'
| 'hasLANGDIR' '(' Expression ')'
| RegexExpression
| ExistsFunc
| NotExistsFunc
| 'isTRIPLE' '(' Expression ')'
| 'TRIPLE' '(' Expression ',' Expression ',' Expression ')'
| 'SUBJECT' '(' Expression ')'
| 'PREDICATE' '(' Expression ')'
| 'OBJECT' '(' Expression ')'
[142]   RegexExpression   ::=   'REGEX' '(' Expression ',' Expression ( ',' Expression )? ')'
[143]   SubstringExpression   ::=   'SUBSTR' '(' Expression ',' Expression ( ',' Expression )? ')'
[144]   StrReplaceExpression   ::=   'REPLACE' '(' Expression ',' Expression ',' Expression ( ',' Expression )? ')'
[145]   ExistsFunc   ::=   'EXISTS' GroupGraphPattern
[146]   NotExistsFunc   ::=   'NOT' 'EXISTS' GroupGraphPattern
[147]   Aggregate   ::=     'COUNT' '(' 'DISTINCT'? ( '*' | Expression ) ')'
| 'SUM' '(' 'DISTINCT'? Expression ')'
| 'MIN' '(' 'DISTINCT'? Expression ')'
| 'MAX' '(' 'DISTINCT'? Expression ')'
| 'AVG' '(' 'DISTINCT'? Expression ')'
| 'SAMPLE' '(' 'DISTINCT'? Expression ')'
| 'GROUP_CONCAT' '(' 'DISTINCT'? Expression ( ';' 'SEPARATOR' '=' String )? ')'
[148]   iriOrFunction   ::=   iri ArgList?
[149]   RDFLiteral   ::=   String ( LANG_DIR | '^^' iri )?
[150]   NumericLiteral   ::=   NumericLiteralUnsigned | NumericLiteralPositive | NumericLiteralNegative
[151]   NumericLiteralUnsigned   ::=   INTEGER | DECIMAL | DOUBLE
[152]   NumericLiteralPositive   ::=   INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE
[153]   NumericLiteralNegative   ::=   INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE
[154]   BooleanLiteral   ::=   'true' | 'false'
[155]   String   ::=   STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2
[156]   iri   ::=   IRIREF | PrefixedName
[157]   PrefixedName   ::=   PNAME_LN | PNAME_NS
[158]   BlankNode   ::=   BLANK_NODE_LABEL | ANON

終端記号の生成規則:

[159]   IRIREF   ::=   '<' ( [^<>"{}|^`\]-[#x00-#x20] | UCHAR ) * '>'
[160]   PNAME_NS   ::=   PN_PREFIX? ':'
[161]   PNAME_LN   ::=   PNAME_NS PN_LOCAL
[162]   BLANK_NODE_LABEL   ::=   '_:' ( PN_CHARS_U | [0-9] ) ((PN_CHARS|'.')* PN_CHARS)?
[163]   VAR1   ::=   '?' VARNAME
[164]   VAR2   ::=   '$' VARNAME
[165]   LANG_DIR   ::=   '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)* ('--' [a-zA-Z]+)?
[166]   INTEGER   ::=   [0-9]+
[167]   DECIMAL   ::=   [0-9]* '.' [0-9]+
[168]   DOUBLE   ::=   ( ([0-9]+ ('.'[0-9]*)? ) | ( '.' ([0-9])+ ) ) EXPONENT
[169]   EXPONENT   ::=   [eE] [+-]? [0-9]+
[170]   INTEGER_POSITIVE   ::=   '+' INTEGER
[171]   DECIMAL_POSITIVE   ::=   '+' DECIMAL
[172]   DOUBLE_POSITIVE   ::=   '+' DOUBLE
[173]   INTEGER_NEGATIVE   ::=   '-' INTEGER
[174]   DECIMAL_NEGATIVE   ::=   '-' DECIMAL
[175]   DOUBLE_NEGATIVE   ::=   '-' DOUBLE
[176]   STRING_LITERAL1   ::=   "'" ( ([^#x27#x5C#xA#xD]) | ECHAR | UCHAR )* "'"
[177]   STRING_LITERAL2   ::=   '"' ( ([^#x22#x5C#xA#xD]) | ECHAR | UCHAR )* '"'
[178]   STRING_LITERAL_LONG1   ::=   "'''" ( ( "'" | "''" )? ( [^'\] | ECHAR | UCHAR ) )* "'''"
[179]   STRING_LITERAL_LONG2   ::=   '"""' ( ( '"' | '""' )? ( [^"\] | ECHAR | UCHAR ) )* '"""'
[180]   ECHAR   ::=   '\' [tbnrf\"']
[181]   UCHAR   ::=   ('\u' HEX HEX HEX HEX) | ('\U' HEX HEX HEX HEX HEX HEX HEX HEX)
[182]   NIL   ::=   '(' WS* ')'
[183]   WS   ::=   #x20 | #x9 | #xD | #xA
[184]   ANON   ::=   '[' WS* ']'
[185]   PN_CHARS_BASE   ::=   [A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[186]   PN_CHARS_U   ::=   PN_CHARS_BASE | '_'
[187]   VARNAME   ::=   ( PN_CHARS_U | [0-9] ) ( PN_CHARS_U | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] )*
[188]   PN_CHARS   ::=   PN_CHARS_U | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]
[189]   PN_PREFIX   ::=   PN_CHARS_BASE ((PN_CHARS|'.')* PN_CHARS)?
[190]   PN_LOCAL   ::=   (PN_CHARS_U | ':' | [0-9] | PLX ) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX) )?
[191]   PLX   ::=   PERCENT | PN_LOCAL_ESC
[192]   PERCENT   ::=   '%' HEX HEX
[193]   HEX   ::=   [0-9] | [A-F] | [a-f]
[194]   PN_LOCAL_ESC   ::=   '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%' )

この文法のテキスト版はこちらで利用できます。

20. 適合性

非規範的であると示された節に加えて、この仕様におけるすべての作成指針、図、例、および注記は 非規範的です。この仕様におけるそれ以外のすべては規範的です。

この文書におけるキーワードMAYMUSTMUST NOTOPTIONAL、およびSHOULDは、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。

20.1 適合性

SPARQLクエリ文字列の適合性については 19 SPARQL文法節を、クエリ結果の適合性については 16 クエリ形式節を参照してください。 application/sparql-queryメディア型への適合性については 22. インターネット・メディア型節を参照してください。

この仕様は、SPARQL 1.1 Protocol [SPARQL11-PROTOCOL]、SPARQL Query Results XML Format (Second Edition) [RDF-SPARQL-XMLRES]、 SPARQL 1.1 Query Results JSON Format [SPARQL11-RESULTS-JSON]、およびSPARQL 1.1 Query Results CSV and TSV Formats [SPARQL11-RESULTS-CSV-TSV]と 組み合わせて使用することを意図しています。それらの適合基準については、 それらの仕様を参照してください。

SPARQLプロトコルは、SPARQLクエリをSPARQLクエリ処理サービスへ伝達し、 クエリ結果をそれらを要求したエンティティへ返すための手段を記述していることに注意してください。

21. インターネット・メディア型および ファイル拡張子

SPARQLクエリ言語のインターネット・メディア型(以前はMIME型として知られていたもの)は "application/sparql-query"です。

SPARQLクエリ・ファイルには、すべてのプラットフォームで拡張子".rq"(小文字)を 付けることが推奨されます。

型名:
application
サブタイプ名:
sparql-query
必須パラメーター:
なし
任意パラメーター:
なし
エンコーディングに関する考慮事項:
SPARQLクエリ言語の構文は、Unicode [UNICODE]のコードポイント上で表現されます。 エンコーディングは常にUTF-8 [RFC3629]です。
Unicodeコードポイントは、\uXXXX(U+0からU+FFFF)または \UXXXXXXXX構文(U+0からU+10FFFF)を用いて表現することもできます。ここでXは16進数字 [0-9A-Fa-f]であり、サロゲート・コードポイントである U+D800からU+DFFFは除外されます。
セキュリティに関する考慮事項:
SPARQL Query付録C、セキュリティ考慮事項、および UTF-8, a transformation format of ISO 10646 [RFC3629]第7節 Security Considerationsを参照してください。
相互運用性に関する考慮事項:
既知の相互運用性の問題はありません。
公開仕様:
この仕様。
このメディア型を使用するアプリケーション:
現在、このメディア型を使用する既知のアプリケーションはありません。
追加情報:
マジックナンバー:
SPARQLクエリは、文書の冒頭付近に文字列'PREFIX'(大文字小文字を区別しない)を 持つことがあります。
ファイル拡張子:
".rq"
基底URI:
SPARQLの'BASE <IRIref>'用語は、クエリ言語内で文書の後続部分に順次使用される 相対IRIrefの現在の基底URIを変更できます。
詳細情報の連絡先となる人物およびメールアドレス:
public-rdf-dawg-comments@w3.org
想定される用途:
COMMON
使用上の制限:
なし
作成者/変更管理者:
SPARQL 1.2仕様は、World Wide Web Consortiumの RDF-star Working Groupの作業成果物です。W3Cは これらの仕様に対する変更管理権限を持ちます。

A. SPARQL 1.1クエリ言語とSPARQL 1.2クエリ言語の間の変更点

この節は非規範的です。

B. プライバシー考慮事項

TODO

C. セキュリティ考慮事項

FROM、FROM NAMED、またはGRAPHを使用するSPARQLクエリは、指定されたURIが 逆参照される原因になることがあります。これにより、ネットワーク、ディスク、またはCPUリソースの 追加使用が発生し、サービス拒否などの関連する二次的問題も生じる可能性があります。 Uniform Resource Identifier (URI): Generic Syntax [RFC3986]第7節のセキュリティ問題を 考慮するべきです。さらに、file: URIの内容は場合によってはアクセス、処理され、結果として返されることがあり、ローカルリソースへの 意図しないアクセスを提供することになります。

SPARQLリクエストは、FROM NAMEDなどにより、SPARQLエンドポイントから追加のリクエストが 発行される原因になることがあります。エンドポイントは組織のファイアウォールまたはDMZの内側に ある可能性があるため、そのようなクエリは間接攻撃の源となる可能性があります。

SPARQL言語は拡張を許可しており、それらには独自のセキュリティ上の 含意があります。

複数のIRIが同じ外観を持つことがあります。異なる文字体系の文字は似て見える場合があります (キリル文字の"о"はラテン文字の"o"に似て見えることがあります)。結合文字が続く文字は、 別の文字と同じ視覚表現を持つ場合があります(LATIN SMALL LETTER E followed by COMBINING ACUTE ACCENTはLATIN SMALL LETTER E WITH ACUTEと同じ視覚表現を持ちます)。SPARQLの利用者は、データ内のIRIと一致するIRIを用いて クエリを構築するよう注意しなければなりません。類似文字の照合に関する詳細情報は、 Unicode Security Considerations [UTR36]およびInternationalized Resource Identifiers (IRIs) [RFC3987] 第8節で見つけることができます。

D. 国際化に関する 考慮事項

TODO

E. 索引

E.1 この仕様で定義される用語

E.2 参照により定義される用語

F. 参照文献

F.1 規範的参照文献

[BCP47]
言語を識別するためのタグ. A. Phillips, Ed.; M. Davis, Ed. IETF. 2009年9月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc5646
[CBD]
CBD - 簡潔有界記述. Patrick Stickler, Nokia. W3C. 2005年6月3日. W3C 会員提出物. URL: https://www.w3.org/Submission/CBD/
[CURIE]
CURIE 構文 1.0. Mark Birbeck; Shane McCarron. W3C. 2010年12月16日. W3C ワーキンググループノート. URL: https://www.w3.org/TR/curie/
[I18N-GLOSSARY]
国際化用語集. Richard Ishida; Addison Phillips. W3C. 2024年10月17日. W3C ワーキンググループノート. URL: https://www.w3.org/TR/i18n-glossary/
[rdf-concepts]
Resource Description Framework (RDF): 概念および抽象構文. Graham Klyne; Jeremy Carroll. W3C. 2004年2月10日. W3C 勧告. URL: https://www.w3.org/TR/rdf-concepts/
[RDF-DAWG-UC]
RDF データアクセスのユースケースおよび 要件. Kendall Clark. W3C. 2005年3月25日. W3C 作業草案. URL: https://www.w3.org/TR/rdf-dawg-uc/
[RDF-SPARQL-XMLRES]
SPARQL クエリ結果 XML 形式(第二 版). Dave Beckett; Jeen Broekstra. W3C. 2013年3月21日. W3C 勧告. URL: https://www.w3.org/TR/rdf-sparql-XMLres/
[RDF12-CONCEPTS]
RDF 1.2 の概念および抽象データ モデル. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 2026年4月7日. W3C 候補勧告. URL: https://www.w3.org/TR/rdf12-concepts/
[RDF12-SEMANTICS]
RDF 1.2 意味論. Peter Patel-Schneider; Enrico Franconi; Dörthe Arndt. W3C. 2026年4月7日. W3C 候補勧告. URL: https://www.w3.org/TR/rdf12-semantics/
[RDF12-XML]
RDF 1.2 XML 構文. Gregg Kellogg; Jerven Bolleman. W3C. 2026年6月18日. W3C 作業草案. URL: https://www.w3.org/TR/rdf12-xml/
[RFC2119]
RFC において要求レベルを示すために用いる キーワード. S. Bradner. IETF. 1997年3月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3629]
UTF-8、ISO 10646 の変換形式. F. Yergeau. IETF. 2003年11月. インターネット標準. URL: https://www.rfc-editor.org/rfc/rfc3629
[RFC3986]
Uniform Resource Identifier (URI): 汎用 構文. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005年1月. インターネット 標準. URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRI). M. Duerst; M. Suignard. IETF. 2005年1月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc3987
[RFC4122]
Universally Unique IDentifier (UUID) URN 名前空間. P. Leach; M. Mealling; R. Salz. IETF. 2005年7月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC4647]
言語タグの照合. A. Phillips, Ed.; M. Davis, Ed. IETF. 2006年9月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc4647
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の 曖昧性. B. Leiba. IETF. 2017年5月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc8174
[SPARQL-FEATURES]
SPARQL の新機能と根拠. Kjetil Kjernsmo; Alexandre Passant. W3C. 2009年7月2日. W3C 作業草案. URL: https://www.w3.org/TR/sparql-features/
[SPARQL11-ENTAILMENT]
SPARQL 1.1 含意レジーム. Birte Glimm; Chimezie Ogbuji. W3C. 2013年3月21日. W3C 勧告. URL: https://www.w3.org/TR/sparql11-entailment/
[SPARQL11-FEDERATED-QUERY]
SPARQL 1.1 連合 クエリ. Eric Prud'hommeaux; Carlos Buil Aranda. W3C. 2013年3月21日. W3C 勧告. URL: https://www.w3.org/TR/sparql11-federated-query/
[SPARQL11-PROTOCOL]
SPARQL 1.1 プロトコル. Lee Feigenbaum; Gregory Williams; Kendall Clark; Elias Torres. W3C. 2013年3月21日. W3C 勧告. URL: https://www.w3.org/TR/sparql11-protocol/
[SPARQL11-Query]
SPARQL 1.1 クエリ言語. Steven Harris; Andy Seaborne. W3C. 2013年3月21日. W3C 勧告. URL: https://www.w3.org/TR/sparql11-query/
[SPARQL11-RESULTS-CSV-TSV]
SPARQL 1.1 クエリ結果 CSV および TSV 形式. Andy Seaborne. W3C. 2013年3月21日. W3C 勧告. URL: https://www.w3.org/TR/sparql11-results-csv-tsv/
[SPARQL11-RESULTS-JSON]
SPARQL 1.1 クエリ結果 JSON 形式. Andy Seaborne. W3C. 2013年3月21日. W3C 勧告. URL: https://www.w3.org/TR/sparql11-results-json/
[SPARQL11-UPDATE]
SPARQL 1.1 Update. Paula Gearon; Alexandre Passant; Axel Polleres. W3C. 2013年3月21日. W3C 勧告. URL: https://www.w3.org/TR/sparql11-update/
[SPARQL12-PROTOCOL]
SPARQL 1.2 プロトコル. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026年4月26日. W3C 作業 草案. URL: https://www.w3.org/TR/sparql12-protocol/
[SPARQL12-Query]
SPARQL 1.2 クエリ言語. Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026年6月24日. W3C 作業草案. URL: https://www.w3.org/TR/sparql12-query/
[SPARQL12-Update]
SPARQL 1.2 Update. Ruben Taelman; Andy Seaborne; Thomas Pellissier Tanon. W3C. 2026年6月12日. W3C 作業草案. URL: https://www.w3.org/TR/sparql12-update/
[TURTLE]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 2014年2月25日. W3C 勧告. URL: https://www.w3.org/TR/turtle/
[UAX31]
Unicode 識別子および 構文. Mark Davis; Robin Leroy. Unicode Consortium. 2025年8月20日. Unicode 標準附属書 #31. URL: https://www.unicode.org/reports/tr31/tr31-43.html
[UNICODE]
Unicode 標準. Unicode Consortium. URL: https://www.unicode.org/versions/latest/
[UTR36]
Unicode セキュリティ 考慮事項. Mark Davis; Michel Suignard. Unicode Consortium. 2014年9月19日. Unicode 技術報告 #36. URL: https://www.unicode.org/reports/tr36/tr36-15.html
[vcard-rdf]
vCard オントロジー - 人物および 組織の記述用. Renato Iannella; James McKinney. W3C. 2014年5月22日. W3C 作業 グループノート. URL: https://www.w3.org/TR/vcard-rdf/
[WEBARCH]
World Wide Web のアーキテクチャ、第 1巻. Ian Jacobs; Norman Walsh. W3C. 2004年12月15日. W3C 勧告. URL: https://www.w3.org/TR/webarch/
[XML-NAMES11]
XML 1.1 における名前空間(第二 版). Tim Bray; Dave Hollander; Andrew Layman; Richard Tobin et al. W3C. 2006年8月16日. W3C 勧告. URL: https://www.w3.org/TR/xml-names11/
[XML11]
Extensible Markup Language (XML) 1.1(第二 版). Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau; John Cowan et al. W3C. 2006年8月16日. W3C 勧告. URL: https://www.w3.org/TR/xml11/
[XMLSCHEMA11-2]
W3C XML Schema Definition Language (XSD) 1.1 Part 2: データ型. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 2012年4月5日. W3C 勧告. URL: https://www.w3.org/TR/xmlschema11-2/
[XPATH-31]
XML Path Language (XPath) 3.1. Jonathan Robie; Michael Dyck; Josh Spiegel. W3C. 2017年3月21日. W3C 勧告. URL: https://www.w3.org/TR/xpath-31/
[XPATH-DATAMODEL-31]
XQuery および XPath データモデル 3.1. Norman Walsh; John Snelson; Andrew Coleman. W3C. 2017年3月21日. W3C 勧告. URL: https://www.w3.org/TR/xpath-datamodel-31/
[XPATH-FUNCTIONS-31]
XPath および XQuery 関数と演算子 3.1. Michael Kay. W3C. 2017年3月21日. W3C 勧告. URL: https://www.w3.org/TR/xpath-functions-31/

F.2 参考参照文献

[RDF12-TURTLE]
RDF 1.2 Turtle. Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk. W3C. 12 June 2026. W3C Working Draft. URL: https://www.w3.org/TR/rdf12-turtle/
[SPARQL12-CONCEPTS]
SPARQL 1.2 Concepts. The W3C RDF & SPARQL Working Group. W3C. W3C Editor's Draft. URL: https://w3c.github.io/sparql-concepts/spec/
[SPARQL12-ENTAILMENT]
SPARQL 1.2 Entailment Regimes. Peter Patel-Schneider. W3C. 9 April 2026. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-entailment/
[SPARQL12-FEDERATED-QUERY]
SPARQL 1.2 Federated Query. Ruben Taelman; Gregory Williams. W3C. 23 April 2026. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-federated-query/
[SPARQL12-GRAPH-STORE-PROTOCOL]
SPARQL 1.2 Graph Store Protocol. Andy Seaborne; Thomas Pellissier Tanon. W3C. 19 December 2024. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-graph-store-protocol/
[SPARQL12-NEW]
What’s New in SPARQL 1.2. The W3C RDF & SPARQL Working Group. W3C. W3C Editor's Draft. URL: https://w3c.github.io/sparql-new/spec/
[SPARQL12-RESULTS-CSV-TSV]
SPARQL 1.2 Query Results CSV and TSV Formats. Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 28 March 2026. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-results-csv-tsv/
[SPARQL12-RESULTS-JSON]
SPARQL 1.2 Query Results JSON Format. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 28 March 2026. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-results-json/
[SPARQL12-RESULTS-XML]
SPARQL 1.2 Query Results XML Format. Ruben Taelman; Dominik Tomaszuk; Thomas Pellissier Tanon. W3C. 27 December 2024. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-results-xml/
[SPARQL12-SERVICE-DESCRIPTION]
SPARQL 1.2 Service Description. Ruben Taelman; Gregory Williams. W3C. 23 April 2026. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-service-description/