Copyright © 2008-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
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プロセス文書に従います。
RDFは、Web上の情報を表現するための有向ラベル付きグラフ・データモデルです。RDFは、 とりわけ、個人情報、ソーシャルネットワーク、デジタル成果物に関するメタデータを 表現するため、また異種の情報源を統合する手段を提供するために、しばしば用いられます。 この仕様は、RDFのためのSPARQLクエリ言語の構文と意味論を定義します。
RDFのためのSPARQLクエリ言語は、[RDF-DAWG-UC]で RDF Data Accessワーキンググループにより特定されたユースケースおよび要件、 [SPARQL-FEATURES]でSPARQL 1.1ワーキング グループにより特定されたもの、ならびにRDF-starワーキンググループによるものを満たすように 設計されています。
節見出しに特に明記されていない限り、この文書のすべての節および附録は 規範的です。
この文書のこの節、第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 記法で表現された文法として与えられます。
この文書では、特に明記されていない限り、例は次の名前空間接頭辞定義を 前提とします。
| 接頭辞 | 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# |
この文書では、各トリプルを明示的に示すために、 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" .
結果セットは表形式で示されます。
| x | y | z |
|---|---|---|
| "Alice" | <http://example/a> |
「束縛」は、(変数,
RDF用語)の対です。
この結果セットには3つの変数、
x、y、およびzがあります(列見出しとして示されています)。各解は
表の本体内の1行として示されます。ここでは、単一の解があり、
その中で変数xは"Alice"に束縛され、変数yは
<http://example/a>に束縛され、変数zは
RDF用語に束縛されていません。変数は、解において必ずしも束縛されている必要は
ありません。
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構文です。
SPARQLクエリの多くの形式は、基本グラフ・パターンと呼ばれる トリプル・パターンの集合を含みます。トリプル・パターンはRDFトリプルに似ていますが、 主語、述語、および目的語のそれぞれが変数であってもよい点が異なります。 RDFデータの部分グラフからのRDF用語を 変数の代わりに代入でき、その結果がその部分グラフと等価なRDFグラフになるとき、 基本グラフ・パターンはRDFデータの部分グラフに一致します。
次の例は、与えられたデータグラフから本のタイトルを見つける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" |
クエリの結果は、クエリのグラフ・パターンがデータと一致する方法に対応する 解列です。 クエリに対する解は、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> .
これは基本グラフ・パターン照合です。クエリ・パターンで 用いられるすべての変数は、すべての解で束縛されていなければなりません。
下のデータには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節のクエリ例のためのデータグラフです。
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 のいずれかに制限される。
言語タグとは異なり、これは常に小文字である。
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短縮形を定義します。
次のクエリは、変数vが
:zに束縛された解を持ちます。クエリ処理系は、
そのデータ型の値空間内の値について何ら理解している必要はありません。
字句形式とデータ型IRIの両方が一致するため、
リテラルは一致します。
SELECT ?v WHERE { ?v ?p "abc"^^<http://example.org/datatype#specialDatatype> }
| v |
|---|
| <http://example.org/ns#z> |
クエリ結果には空白ノードが含まれる場合があります。この文書の例の 結果セット内の空白ノードは、"_:"の後に 空白ノード識別子が続く形式で 書かれます。
空白ノード識別子は、結果セット(「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と、データの構文で用いられる空白ノード識別子との間に
何らかの関係がある必要はありません。
アプリケーション作成者は、クエリ内の空白ノード識別子が データ内の特定の空白ノードを参照することを期待すべきではありません。
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" |
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>
グラフ・パターン照合は解列を生成し、各解は変数から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 .
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正規表現に基づいています。
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未満の価格を持つためです。
数値型に加えて、SPARQLは
xsd:string、xsd:boolean、およびxsd:dateTime型を
サポートします(オペランドのデータ型を参照)。
演算子マッピング節は演算子を説明し、
関数定義節は
RDF用語に適用できる関数を説明します。
この節では、SPARQLが RDF 用語 およびトリプル・パターンに用いる構文を扱います。 完全な文法は第19節に示されています。
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へ解決されます。
PREFIXキーワードは、接頭辞ラベルをIRIに関連付けます。接頭辞付き名前は、
コロン「:」で区切られた接頭辞ラベルとローカル部です。接頭辞付き
名前は、接頭辞に関連付けられたIRIとローカル部を連結することによってIRIに
対応付けられます。接頭辞ラベルまたはローカル部は空であってもかまいません。
SPARQLローカル名は先頭の数字を許可しますが、
XMLローカル名は許可しないことに
注意してください。
SPARQLローカル名はまた、バックスラッシュ
文字エスケープ(例: ns:id\=123)を介して、IRIで許可される
非英数字文字も許可します。SPARQLローカル
名は、
CURIEよりも
多くの構文上の制限を持ちます。
相対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
リテラルの一般的な構文は、二重引用符
"..."または単一引用符'...'で囲まれた文字列であり、
任意の言語タグ(@で導入)または任意のデータ型IRIもしくは接頭辞付き名前
(^^で導入)を伴います。
便宜上、整数は直接(引用符および明示的なデータ型IRIなしで)書くことができ、
データ型xsd:integerを持つリテラルとして解釈されます。
数値中に「.」があり指数を持たない十進数はxsd:decimalとして解釈され、
指数を持つ数値はxsd:doubleとして解釈されます。
xsd:boolean型の値も、trueまたはfalseとして
書くことができます。
引用符を含むリテラル値、または長く改行文字を含むリテラル値を書きやすくするため、 SPARQLは、リテラルを3つの単一引用符または二重引用符で囲む 追加の引用構造を提供します。
SPARQLにおけるリテラル構文の例には次のものがあります。
"chat"'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と同じです生成規則
INTEGER、
DECIMAL、
DOUBLE、または
BooleanLiteralのいずれかに一致するトークンは、
そのトークンの字句値と対応するデータ型
(xsd:integer、xsd:decimal、
xsd:double、またはxsd:boolean)を持つリテラルと等価です。
クエリ変数は、「?」または「$」のいずれかを用いることで示されます。「?」または「$」は
変数名の一部ではありません。クエリ内では、$abcと?abcは同じ
変数を識別します。変数に使える名前は、
SPARQL文法に示されています。
グラフ・パターン内の
空白ノードは、
クエリ対象のデータ内の特定の空白ノードへの参照ではなく、変数として
機能します。空白ノードは、「_: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> .
トリプル・パターンは、主語、述語、目的語として書かれます。 いくつかの一般的なトリプル・パターン構造には、省略して書く方法があります。
次の例は同じクエリを表します。
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 }
共通の主語を持つトリプル・パターンは、「;」
記法を用いることで、主語を1回だけ書き、複数のトリプル・パターンに対して
使用するように書くことができます。
?x foaf:name ?name ; foaf:mbox ?mbox .
これは、次のトリプル・パターンを書くことと同じです。
?x foaf:name ?name . ?x foaf:mbox ?mbox .
トリプル・パターンが主語と述語の両方を共有する場合、目的語は
「,」で区切ることができます。
?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_" .
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" .
これは(b0、b1、b2
および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 .
キーワード「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" .
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 指令がない場合に考慮される。
SPARQL バージョンラベルとは、SPARQL クエリの 構文および意味論への適合性を識別する 文字列である。
SPARQL におけるバージョンラベル文字列は、 RDF によって定義された バージョンラベルと同じであるものの、その意味は異なる。具体的には、SPARQL の バージョンラベルは SPARQL の構文および意味論を指すのに対し、RDF のバージョンラベルは RDF の構文 および意味論を指す。
| バージョン・ラベル | 構文 | 意味論 |
|---|---|---|
| "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パーサーを不要に失敗させるためです。
SPARQLはグラフ・パターン照合を中心に構成されています。より複雑なグラフ・パターンは、 小さなパターンをさまざまな方法で組み合わせることで形成できます。
この節では、連言によってパターンを組み合わせる2つの形式、すなわち トリプル・パターンを組み合わせる基本グラフ・パターンと、その他すべての グラフ・パターンを組み合わせるグループ・グラフ・パターンについて説明します。
クエリ内で最も外側にあるグラフ・パターンはクエリ・パターンと呼ばれます。これは文法上、
次に示すGroupGraphPatternによって識別されます。
[17] |
WhereClause |
::= | 'WHERE'? GroupGraphPattern
|
基本グラフ・パターンは、トリプル・パターンの集合です。SPARQLのグラフ・パターン照合は、 基本グラフ・パターンの照合結果を組み合わせるという観点から定義されます。
任意のフィルターを伴うトリプル・パターンの列は、単一の基本グラフ・ パターンを構成します。その他のグラフ・パターンは、基本グラフ・パターンを終了させます。
_:abc形式の空白ノードを使用する場合、空白ノードの識別子は
基本グラフ・パターンにスコープを持ちます。
空白ノード識別子は、
いかなるクエリにおいても1つの基本グラフ・パターンでのみ使用できます。
SPARQLは、単純含意について定義される部分グラフ照合を用いて 基本グラフ・パターンを評価します。SPARQLは、以下で説明するように、 一定の条件が与えられれば、他の形式の含意へ拡張できます。 文書 SPARQL 1.1含意体制は、 いくつかの具体的な含意体制を説明しています。
SPARQLクエリ文字列では、グループ・グラフ・パターンは波括弧{}で区切られます。
たとえば、このクエリのクエリ・パターンは、1つの基本グラフ・
パターンからなるグループ・グラフ・パターンです。
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE {
?x foaf:name ?name .
?x foaf:mbox ?mbox .
}
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE {
{ ?x foaf:name ?name . }
{ ?x foaf:mbox ?mbox . }
}
グループ・パターン:
{ }
は、どの変数も束縛しない1つの解をもって、任意のグラフ(空グラフを含む)に 一致します。たとえば:
SELECT ?x
WHERE {}
は、変数xが束縛されていない1つの解で一致します。
キーワード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 .
}
{ ?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つのトリプル・パターンからなる別の基本グラフ・パターンの グループです。
基本グラフ・パターンにより、アプリケーションは、解が存在するためにはクエリ・パターン全体が 一致しなければならないクエリを作成できます。少なくとも1つの基本グラフ・パターンを持つ グループ・グラフ・パターンのみを含むクエリの各解では、すべての変数が解内のRDF用語に 束縛されます。しかし、すべてのRDFグラフで規則的で完全な構造を仮定できるわけではありません。 情報が利用可能な場合にはその情報を解に追加できる一方で、クエリ・パターンの一部が 一致しないという理由で解を拒否しないクエリを持てることは有用です。任意照合はこの機能を 提供します。任意部分が一致しない場合、それは束縛を作成しませんが、解を除去することも ありません。
グラフ・パターンの任意部分は、グラフ・パターンに適用される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を持つトリプルがある場合、解にはそのトリプルの目的語も
含まれます。この例では、クエリの任意照合部分に単一のトリプル・パターンだけが
与えられていますが、一般には任意部分は任意のグラフ・パターンであってかまいません。
任意グラフ・パターンがクエリ解に影響を与えるには、その任意グラフ・パターン全体が
一致しなければなりません。
任意グラフ・パターン内に制約を与えることができます。例:
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」を含む解を導かなかったためです。
グラフ・パターンは再帰的に定義されます。グラフ・パターンは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> |
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からのタイトル述語と作成者述語の両方を 持つ場合にのみ本に一致します。
SPARQLクエリ言語は、2つの形式の否定を組み込みます。1つは、フィルター対象の クエリ解の文脈でグラフ・パターンが一致するかどうかに応じて結果をフィルタリングするもの、 もう1つは、別のパターンに関連する解を除去するものです。
クエリ解のフィルタリングは、FILTER式内で
NOT EXISTSおよびEXISTSを用いて行われます。
フィルター・スコープ規則は、
フィルターが現れるグループ全体に適用されることに注意してください。
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> |
フィルター式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> |
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> |
NOT EXISTSとMINUSは、否定について考える2つの方法を表します。
1つは、クエリ・パターンによってすでに決定された束縛が与えられたとき、
データ内にパターンが存在するかどうかをテストするものです。もう1つは、2つの
パターンの評価に基づいて一致を除去するものです。場合によっては異なる答えを
生成することがあります。
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> |
別のケースとして、例に具象パターン(変数なし)がある場合があります。
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> |
これは、束縛の一致がないため、解が除去されないからです。
フィルター内では、グループの変数がスコープ内に
あるため、相違も生じます。
この例では、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 |
プロパティ・パスは、2つのグラフ・ノード間でグラフを通る可能な経路です。 自明な場合は、長さが正確に1のプロパティ・パスであり、これはトリプル・パターンです。 パスの両端はRDF用語または変数であってかまいません。変数はパス自体の一部としては 使用できず、両端にのみ使用できます。
プロパティ・パスにより、一部のSPARQL基本グラフ・パターンをより簡潔に表現でき、 また任意長のパスによって2つのリソースの接続性を照合する能力も追加されます。
以下の説明では、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の順序には意味がなく、混在した順序で 出現できます。
構文形式の優先順位は、高いものから低いものへ次のとおりです。
*、?、および+/|グループ内では、優先順位は左から右です。
代替: 一方または両方の可能性に一致する
{ :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 }
注: このパス式は結果の順序を保証しません。
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 |
任意長のプロパティ・パスによる主語と目的語の接続性は、「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
}
同様に、:xがfoaf:knows関係を介して接続する
すべての人物を見つけるには、
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX : <http://example/>
SELECT ?person
{
:x foaf:knows+ ?person
}
このような接続性照合は、繰り返されるパス自体がそうでなければ重複を生じる場合でも、 重複を導入しません(接続を行う方法の数を取り込みません)。
照合されるグラフには循環が含まれる場合があります。接続性照合は、循環の照合が 未定義または無限の結果を導かないように定義されています。
式の値は、新しい変数をその式の値、すなわちRDF用語に束縛することで、 解マッピングに追加できます。その変数は、その後クエリ内で使用でき、 結果でも返すことができます。
これを可能にする構文形式は3つあります。BINDキーワード、
SELECT節内の式、および
GROUP BY節内の式です。割り当て形式は
(expression AS ?var)です。
式の評価がエラーを生成した場合、その解について変数は未束縛のままになりますが、 クエリ評価は継続します。
インラインデータとして
VALUESを用いることで、データをクエリに直接含めることもできます。
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 |
データは、グラフ・パターン内に直接書くことも、VALUESを用いて
クエリに追加することもできます。VALUESは、
解列としてインラインデータを提供し、これは
結合操作によってクエリ評価の結果と組み合わされます。
アプリケーションがクエリ結果に対する特定の要件を提供するためにも、
SERVICEキーワードを通じてフェデレーテッドクエリを
提供するSPARQLクエリエンジン実装が、より制約されたクエリをリモート・クエリサービスへ
送信するためにも使用できます。
VALUESでは、データブロック内で複数の変数を指定できます。
1つの変数といくつかの値だけを指定する一般的な場合のために、特別な構文があります。
次の例には、?xと
?yという2つの変数の表があります。2行目には?yの値がありません。
VALUES (?x ?y) {
(:uri1 1)
(:uri2 UNDEF)
}
任意で、単一の変数といくつかの値がある場合:
VALUES ?z { "abc" "def" }
これは一般形式を用いることと同じです。
VALUES (?z) { ("abc") ("def") }
同じ変数を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 |
この例では、VALUESをSELECTクエリの結果に対して
実行するよう指定することもできました。
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)
}
これは異なるクエリですが、この例の状況では同じ結果を持ちます。
集約は、解のグループに対して式を適用します。既定では、解集合は すべての解を含む単一のグループで構成されます。
グループ化は、GROUP BY構文を用いて指定できます。
SPARQLのバージョン1.1で定義された集約は、COUNT、SUM、
MIN、MAX、AVG、GROUP_CONCAT、および
SAMPLEです。
集約は、問い合わせる者が、単一の解ではなく解のグループに対して計算される 結果を見たい場合に使用されます。たとえば、特定の変数が取る各値を個別に見るのではなく、 その最大値を見る場合です。
データ:
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)に従ってクエリ解をグループ化し、
HAVINGはFILTER式に類似していますが、個々の解ではなく
グループに対して作用します。
この例は、GROUP BY式に従って解をグループ化し
(すなわち、?orgが特定の値を取るすべての解が同じグループ内に現れます)、
そのグループに対して集合関数SUMを評価することによって生成されます。
その後、グループはHAVING式によってフィルタリングされ、
SUM(?lprice)が10より大きくないすべてのグループが除去されます。
集約クエリおよびサブクエリでは、クエリ・パターンに現れるが
GROUP BY節には含まれない変数は、集約されている場合にのみ、
投影またはSELECT式内で使用できます。この目的にはSAMPLE集約を
使用できます。詳細については、投影制約の節を参照してください。
関数の場合と同様に、集約式をクエリまたはサブクエリから
投影するには、(BIND節と同様に、キーワードASを用いて)
別名を付ける必要があることに注意してください。上の例では、変数
?totalPriceを用いてこれを行っています。他の集約投影または
WHERE節で既に使用されている名前を持つ変数へ集約を投影することはエラーです。
解に対する集約値を計算するには、まず解を1つ以上のグループに分割し、 各グループについて集約値を計算します。
SELECT、HAVING、または
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
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より大きい場合に限ります。
グループ化を使用するクエリレベル(明示的なGROUP BY節の使用によるもの、
または投影、HAVING、もしくはORDER BY節内での集約の使用によるもの)では、
そのクエリレベルの投影またはSELECT式に現れる変数のすべての出現は、
次の条件のいずれかを満たさなければなりません。
GROUP BY変数として現れること
(対応するGROUP BY式が単に変数Vだけで構成されるか、
(expr AS V)の形式を持つこと)
MIN(?v)または
AVG(?v+2))
そのような変数の出現がこれらの条件のいずれも満たさない場合、そのクエリは 構文的に無効です。
たとえば、次のクエリは、?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集約を用いて
そのグループから投影できます。
この節では、集約を使用するクエリ例を示し、集約が存在する場合に 結果内でエラーがどのように扱われるかを示します。
データ:
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の評価がエラーとなり、その束縛が解から除去されるため、 結果に含まれないことに注意してください。
サブクエリは、SPARQLクエリを他のクエリ内に埋め込む方法であり、通常は クエリ内の何らかの部分式からの結果数を制限するなど、他の方法では達成できない 結果を達成するために用いられます。
SPARQLクエリ評価のボトムアップな性質により、サブクエリは論理的に 先に評価され、その結果が外側のクエリへ投影されます。
サブクエリから投影された変数のみが、外側のクエリに対して可視、すなわち スコープ内になることに注意してください。
データ:
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 |
RDFデータモデルは、主語、述語、目的語を持つトリプルからなるグラフとして情報を表現します。 多くのRDFデータストアは複数のRDFグラフを保持し、各グラフに関する情報を記録します。 これにより、アプリケーションは複数のグラフからの情報を含むクエリを行うことができます。
SPARQLクエリは、グラフの集合を表す RDFデータセット [RDF12-CONCEPTS]に対して実行されます。 RDFデータセットは、名前を持たないデフォルトグラフである1つのグラフと、 0個以上の名前付きグラフから構成されます。各名前付きグラフは、IRIまたは空白ノードによって識別されます。 SPARQLクエリは、 13.3 データセットのクエリ節で説明されるように、 クエリ・パターンの異なる部分を異なるグラフに対して照合できます。
RDFデータセットは、0個の名前付きグラフを含む場合があります。RDFデータセットは常に1つの デフォルトグラフを含みます。クエリはデフォルトグラフの照合を含む必要はなく、 名前付きグラフの照合だけを含めることもできます。
基本グラフ・パターンの照合に使用されるグラフは、アクティブグラフです。
前の節では、すべてのクエリは、RDFデータセットのデフォルトグラフである単一のグラフを
アクティブグラフとして実行されるものとして示されました。GRAPHキーワードは、
クエリの一部について、アクティブグラフをデータセット内の名前付きグラフのいずれかにするために使用されます。
RDFデータセットの定義 [RDF12-CONCEPTS]は、名前付きグラフと デフォルトグラフの関係を制限しません。情報は異なるグラフで繰り返されることがあり、 グラフ間の関係が公開されることもあります。有用な2つの構成は次のとおりです。
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マージでは、マージされたグラフ内の空白ノードは、マージ対象のグラフ由来の 空白ノードとは共有されません。
SPARQLクエリは、RDFデータセットを記述するためにFROM節および
FROM NAMED節を用いることで、照合に使用するデータセットを指定できます。
クエリがそのようなデータセット記述を提供する場合、クエリ内にデータセット記述が
提供されないときにクエリサービスが使用する任意のデータセットの代わりに、それが使用されます。
RDFデータセットは
SPARQLプロトコル要求で
指定されることもあり、
その場合、プロトコル記述はクエリ自体の任意の記述を上書きします。クエリサービスは、
データセット記述がそのサービスにとって受け入れられない場合、クエリ要求を拒否できます。
FROMおよびFROM NAMEDキーワードにより、クエリは
参照によってRDFデータセットを指定できます。これらは、与えられたIRI(すなわち、
与えられたIRI参照の絶対形式)によって識別されるリソースの表現から取得される
グラフをデータセットが含むべきであることを示します。複数のFROM節および
FROM NAMED節から得られるデータセットは次のとおりです。
FROM節で参照されるグラフのRDFマージからなるデフォルトグラフ、および
FROM NAMED節から1つずつ得られる(IRI, グラフ)対の集合。FROM節がなく、1つ以上のFROM NAMED節がある場合、
データセットはデフォルトグラフとして空グラフを含みます。
各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マージです。
クエリは、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]を参照してください。
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つの出現から取得されたトリプル内の
空白ノード同一性について、いかなる仮定もできません。一般に、グラフの等価性についても
いかなる仮定もできません。
グラフの集合をクエリする場合、名前付きグラフに対してパターンを照合するために
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 .
下のクエリは、データセット内の各名前付きグラフに対してグラフ・パターンを照合し、
照合されているグラフの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" |
クエリは、グラフ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" |
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によって特定の個人プロフィール文書に制限されているためです。
クエリ・パターンは、デフォルトグラフと名前付きグラフの両方を含むことができます。 この例では、アグリゲーターが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 |
この文書は、SPARQLフェデレーション拡張の構文を取り込みます。
この機能は、文書SPARQL 1.1フェデレーテッドクエリで定義されています。
クエリ・パターンは、順序付けされていない解の集合を生成します。各 解は、変数からRDF 用語への部分関数です。これらの解はその後、列(解列)として扱われます。初期状態では特定の 順序はありません。その後、任意の列修飾子が適用されて別の列が作成されます。最後に、 この後者の列は、SPARQL クエリ形式の結果の1つを生成するために使用されます。
解列修飾子は次のいずれかです。
修飾子は、上のリストで示された順序で適用されます。
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)
「<」演算子(演算子
マッピングおよび演算子の拡張性を参照)は、
numerics、
xsd:strings、xsd:booleansおよびxsd:dateTimesの対の
相対順序を定義します。IRIの対は、データ型xsd:stringのリテラルとして
比較することで順序付けられます。
SPARQLはまた、そうでなければ順序付けられないいくつかの種類のRDF用語の間に 順序を定めます。
SPARQLは、すべての可能なRDF用語の全順序を定義しません。実装は 演算子の拡張性を通じて全順序を定義できます。以下は、 相対順序が未定義である用語の対のいくつかの例です。
xsd:stringを持つリテラルと、言語
タグを持つリテラル)xsd:stringを持つリテラルと、
サポートされる
データ型を持つリテラル)この変数束縛のリストは昇順です。
| 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 BY、
LIMITまたはOFFSETは含まれません。
解列は、変数の部分集合だけを含むものへ変換できます。列内の各解について、 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" |
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解修飾子は、重複する解を除去します。
同じ変数を同じRDF用語に束縛する解は、1つの解だけが
クエリから返されます。
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?name WHERE { ?x foaf:name ?name }
| name |
|---|
| "Alice" |
解列修飾子の順序に従い、 重複はlimitまたはoffsetのいずれかが適用される前に除去されることに注意してください。
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" |
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
LIMIT節は、返される解の数に上限を設定します。
OFFSETが適用された後の実際の解の数がlimitより大きい場合、
高々limit個の解が返されます。
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { ?x foaf:name ?name }
LIMIT 20
LIMITが0の場合、結果は返されません。limitは
負であってはなりません。
SPARQLには4つのクエリ形式があります。これらのクエリ形式は、パターン照合からの解を用いて 結果セットまたはRDFグラフを形成します。クエリ形式は次のとおりです。
- SELECT
- クエリ・パターン照合で束縛された変数のすべて、またはその部分集合を返します。
- CONSTRUCT
- トリプル・テンプレートの集合内の変数を代入することによって構築されたRDFグラフを返します。
- ASK
- クエリ・パターンが一致するかどうかを示すブール値を返します。
- DESCRIBE
- 見つかったリソースを記述するRDFグラフを返します。
SPARQL 1.1クエリ結果JSON形式、
SPARQL
クエリ結果XML形式(第2版)、または
SPARQL 1.1クエリ結果CSVおよびTSV
形式などの形式を使用して、
SELECTクエリからの結果セット、またはASKクエリのブール結果を
シリアル化できます。
SELECT形式の結果は、変数とその束縛を直接返します。これは、 必要な変数を投影する操作と、新しい変数束縛をクエリ解へ導入する操作を組み合わせます。
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のいずれかへ シリアル化することもできます。
{
"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" }
}
]
}
}
<?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>
パターン照合からどの変数を結果に含めるかを選ぶだけでなく、 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 |
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" .
テンプレートは、空白ノードを含む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データセットに由来し、
変更されません。
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用語へ変換する
拡張
関数を識別します。
クエリの解修飾子は、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" .
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 }
アプリケーションは、クエリ・パターンに解があるかどうかをテストするために
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
DESCRIBE形式は、リソースに関するRDFデータを含む単一の結果RDFグラフを
返します。このデータはSPARQLクエリによって規定されるものではありません。そこでは
クエリ・クライアントがデータソース内のRDF構造を知っている必要がありますが、
代わりにSPARQLクエリ処理系によって決定されます。クエリ・パターンは結果セットを
作成するために使用されます。DESCRIBE形式は、解で識別された各リソースを、
IRIで直接名付けられた任意のリソースとともに取り、対象RDFデータセットを含む
利用可能な任意の情報から来る「記述」を取ることで、単一のRDFグラフを組み立てます。
その記述はクエリサービスによって決定されます。構文DESCRIBE *は、
クエリ内のすべての変数を記述する省略形です。
DESCRIBE節自体は、リソースを識別するためにIRIを取ることができます。
最も単純なDESCRIBEクエリは、DESCRIBE
節内の単なるIRIです。
DESCRIBE <http://example.org/>
記述されるリソースは、結果セット内のクエリ変数への束縛から取ることもできます。 これにより、データセット内で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}
返される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節への一致が
返されましたが、これは必須ではありません。
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の定義に影響します。
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値テストで使用される追加の型を識別します。
xsd:integer、xsd:decimal、xsd:float、または
xsd:doubleを持つ
リテラルを示します。
次の型はnumeric型から派生し、 numeric引数を取る関数および演算子への有効な引数です。
xsd:nonPositiveInteger
xsd:negativeInteger
xsd:long
xsd:int
xsd:short
xsd:byte
xsd:nonNegativeInteger
xsd:unsignedLong
xsd:unsignedInt
xsd:unsignedShort
xsd:unsignedByte
xsd:positiveInteger
SPARQL言語拡張は、追加の型をXML Schemaデータ型から派生するものとして 扱ってもよいです。
SPARQL式は、 解マッピングに関して、 かつアクティブグラフを持つ RDFデータセットの文脈で評価されます。 そのような評価の結果は、 RDF 用語または エラーのいずれかです。
SPARQLは、 XPath and XQuery Functions and Operatorsによって定義される関数および演算子の部分集合を提供します。 次の規則は、XPath/XQueryとSPARQLのデータモデルおよび実行モデルの違いに対応します。
xsd:booleanへ強制変換されます。
||)、
logical-and(&&)、
logical-not(!)、
NOT EXISTS、
EXISTS、および
EBVを除き、
すべての関数はRDF用語に対して作用します。
関数は、いずれかの引数が未束縛である場合にエラーを生成します。
||)または
logical-and(&&)以外の任意の式が
エラーに遭遇した場合、そのエラーを生成します。
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 |
SPARQLは、引数リストに対して関数を呼び出すための構文を定義します。 特に明記されていない限り、これらは次のように呼び出されます。
これらの手順のいずれかが失敗した場合、呼び出しはエラーを生成します。 エラーの効果は17.2 式評価節で定義されます。
また、各形式で指定されるように、関数とは異なる評価規則を持つ 「関数形式」もあります。
式の評価は、 関数への引数が誤ったデータ型のリテラルである場合や、 引数が誤った種類の RDF用語である場合などに、 エラーを 導くことがあります。
式の評価がエラーを発生させる場合、その エラーを持つ式を含むすべての関数、演算子、および式の評価も エラーを発生させます。 一部の関数形式は、 その定義で説明されるようにエラーを処理します。
実効ブール値は、
論理関数
logical-and、logical-or、
およびlogical-notへの引数を計算するため、ならびに
FILTER式の結果を評価するために使用されます。
xsd:boolean EBV (RDF term term)
xsd:booleanの
データ型IRIを持つ
リテラルであり、
有効な字句形式を持つ場合、EBV関数はその引数を返します。
NaNであるか数値的に0に等しいなら、
EBV関数はリテラル"false"^^xsd:booleanを返します。
そうでなければ、EBV関数はリテラル"true"^^xsd:booleanを返します。
xsd:stringを持つ
リテラルであり、その値が空文字列に等しい場合、
EBV関数はリテラル"false"^^xsd:booleanを返します。
そうでなければ、EBV関数はリテラル"true"^^xsd:booleanを返します。
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"を持つ
リテラルとして表されます。
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:integer、
xsd:decimal、xsd:float、xsd: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用語の等価性でテストできます。
| 演算子 | 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 |
| 演算子 | 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へ強制変換されます。
トリプル用語に適用される 演算子=および!=は、 各構成要素に演算子を適用します。
SPARQL言語拡張は、演算子と演算子関数との間に追加の関連付けを提供できます。
これは、上の表に行を追加することに相当します。追加の演算子は、
エラー以外の任意の結果を置き換える結果を
生成してはなりません。
この規則の帰結として、SPARQLのFILTERは、
拡張されていない実装と同じ中間束縛を、FILTER適用後に
少なくとも生成します。
'<'演算子の追加マッピングは、特にORDER
BY節で使用される場合に、オペランドの相対順序を制御することが期待されます。
この節では、SPARQLクエリ言語によって導入される演算子および関数を定義します。 例は、適切な文法構成によって呼び出された演算子の挙動を示します。
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"は
このクエリの解ではありませんでした。
rdfTerm IF (expression1, expression2, expression3)
IF関数形式は、最初の引数を評価し、それを
実効ブール値として解釈して、EBVがtrueであれば
expression2の値を返し、そうでなければ
expression3の値を返します。expression2と
expression3のうち一方だけが評価されます。最初の引数の評価が
エラーを発生させる場合、
IF式の評価についてエラーが発生します。
例: あるクエリ解において、?xが2に束縛され、
?zが0に束縛され、
?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") |
エラーを発生させる |
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個であるため、エラーを発生させる。 |
グラフ・パターンを取るフィルター演算子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を評価した結果は次のとおりです。
ここでAは、18.3
代数構文への変換に従って
{ pattern }を変換することで得られる
代数クエリ式です。
文法のExistsFunc生成規則に従い、
{ pattern }はGroupGraphPattern
生成規則に一致します。
任意のGroupGraphPatternの変換を扱う
18.3
代数構文への変換の具体的な小節は、
18.3.2.6 グラフ・パターンの変換です。
xsd:boolean logical-or (xsd:boolean left, xsd:boolean right)
この関数は式内で直接使用することはできません。
この関数の目的は、"||"演算子の意味論を定義することです。
この関数は、leftとrightの論理ORを返します。
logical-orは、それぞれの引数の
実効ブール値に対して作用することに注意してください。
注: ||演算子によるエラーの扱いについては、
17.2
式評価節を参照してください。
xsd:boolean logical-and (xsd:boolean left, xsd:boolean right)
この関数は式内で直接使用することはできません。
この関数の目的は、"&&"
演算子の意味論を定義することです。
この関数は、leftとrightの論理ANDを返します。
logical-andは、それぞれの引数の
実効ブール値に対して作用することに注意してください。
注: &&演算子によるエラーの扱いについては、
17.2
式評価節を参照してください。
xsd:boolean logical-not (xsd:boolean arg)
この関数は式内で直接使用することはできません。この
関数の目的は、"!"演算子の意味論を定義することです。
この関数は、argの論理NOTを返します。
logical-notは、その引数の
実効ブール値に対して作用することに注意してください。
boolean rdfTerm IN (expression, ...)
IN演算子は、左辺のRDF用語が右辺の式の値のリスト内に
見つかるかどうかをテストします。テストは"="演算子で行われ、
これは演算子マッピングによって決定される同じ値であるかを
テストします。
右辺の用語が0個のリストは合法であり、falseに評価されます。
比較内のエラーは、テスト対象のRDF用語が用語のリスト内の他の場所で
見つからない場合、IN式にエラーを発生させます。
INがrdfTermを生成する式とともに使用される場合、
その式は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) |
エラーを発生させる |
boolean rdfTerm NOT IN (expression, ...)
NOT IN演算子は、左辺のRDF用語が右辺の式のリストの値内に
見つからないかどうかをテストします。テストは"!="演算子で行われ、
これは演算子マッピングによって決定されるように、
2つの値が同じ値でないことをテストします。
右辺の用語が0個のリストは合法であり、trueに評価されます。
NOT INがrdfTermを生成する式とともに使用される場合、
その式は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) |
エラーを発生させる |
xsd:boolean sameTerm (RDF term term1, RDF term term2)
RDF 1.2 Concepts and Abstract Data
Model [RDF12-CONCEPTS]で
定義されるように、term1とterm2が同じRDF用語であれば
TRUEを返します。そうでなければFALSEを返します。
次のいずれかがtrueである場合、term1とterm2は 同じRDF用語です。
term1とterm2が、
IRIであり、IRIとして
同じである。
term1とterm2が
リテラルであり、リテラル用語として
等しい。
term1とterm2が
空白ノードであり、空白ノードとして
等しい。
term1とterm2が
トリプル用語であり、トリプルとして
等しい。
すなわち、
主語、
述語、および
目的語
構成要素が、それぞれ対ごとに同じ用語である。
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 |
この関数は、SPARQL 1.1のRDFterm-equalを置き換えます。
xsd:boolean sameValue (RDF term term1, RDF term term2)
この関数は式内で直接使用することはできません。この関数の目的は、 17.3 演算子 マッピングの演算子マッピング表で扱われる具体的な場合に該当しない 2つのRDF用語に"="演算子が適用される場合の意味論を定義することです。
この関数の結果は、次の手順を進めることで決定されます。
term1とterm2が
等しいRDF用語である場合、
TRUEを返します。
term1またはterm2が
IRIまたは
空白ノードである場合、
FALSEを返します。
term1とterm2のうち正確に一方だけが
トリプル用語である場合、
FALSEを返します。
term1とterm2の両方が
トリプル用語である場合、
関数sameValueを各構成要素に対ごとに適用します。
各構成要素の対がTRUEを返す場合はTRUEを返し、
いずれかの構成要素の対がエラーを生成する場合は
エラーを生成し、
そうでなければFALSEを返します。
term1とterm2の両方が
リテラルであり、
これらのリテラルの一方または両方が
不正型であることが分かっている場合、
エラーを生成します。
"NaN"^^xsd:doubleおよび"NaN"^^xsd:floatは、
同じ値を表すものと見なされます。
term1とterm2が
xsd:doubleまたはxsd:floatのいずれかでともに"NaN"である場合、
TRUEを返します。
term1とterm2の両方が
リテラルであり、
SPARQL処理系がそれらの値が等しいと判定できる場合、
TRUEを返します。
term1とterm2の両方が
リテラルであり、
SPARQL処理系がそれらの値が等しくないと判定できる場合、
FALSEを返します。
2つの引数がリテラルである場合、関数sameValueは、
SPARQL処理系がこれらのリテラルの値が等しい、または等しくないと判定できる場合に、
trueまたはfalseを返します。
SPARQL処理系が確信できない場合は、errorを返します。
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と定義します。
同様に、関数sameValueは
sameValue("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をテストするとエラーを生成します。
xsd:boolean isIRI (RDF term term) xsd:boolean isURI (RDF term term)
termが
IRIである場合はtrueを返します。
そうでない場合はfalseを返します。
isURIは
isIRI演算子の別表記です。
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> |
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)だけが空白ノードでした。
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" |
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 |
xsd:string STR (literal literal) xsd:string STR (IRI rsrc)
literal(リテラル)の
字句形式を返します。
rsrc(IRI)のコードポイント表現を返します。
これは、たとえばホスト名など、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> |
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:nameとfoaf: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 |
xsd:string LANGDIR (literal ltrl)
ltrlが
基底方向を持つ場合、その基底方向を返します。
ltrlが
基底方向を持たない場合、空文字列を返します。
RDFデータモデルには空の
基底方向を持つリテラルが含まれないことに
注意してください。
| 式 | 結果 |
|---|---|
LANGDIR("abc"@en--ltr) |
"ltr" |
LANGDIR("abc"@en) |
"" |
LANGDIR("abc") |
"" |
LANGDIR(1) |
"" |
LANGDIR(<http://example/>) |
error |
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 |
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 |
iri DATATYPE (literal literal)
与えられたリテラルの データ型IRIを返します。
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:nameとfoaf: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 |
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/> |
blank node BNODE()
blank node BNODE(xsd:string)
BNODE関数は、問い合わせ対象のデータセット内のすべての空白ノードとは
異なり、かつ他のクエリ解に対するこのコンストラクター呼び出しによって作成される
すべての空白ノードとも異なる空白ノードを構築します。引数なし形式が使用される場合、
すべての呼び出しは異なる空白ノードを生成します。xsd:stringリテラルを
持つ形式が使用される場合、異なるxsd:stringリテラルに対するすべての呼び出しは
異なる空白ノードを生成し、1つの解マッピングについての
式内で同じxsd:stringリテラルを持つ呼び出しには同じ空白ノードを生成します。
この機能は、SPARQL CONSTRUCTテンプレートにおける 空白ノードの扱いと互換性があります。
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を
使用するべきです。
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 |
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 |
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> |
xsd:string STRUUID()
UUIDのスキーム固有部分である文字列を返します。すなわち、UUIDを生成し、
データ型xsd:stringを持つリテラルへ変換し、
先頭のurn:uuid:を取り除いた結果を、データ型
xsd:stringを持つリテラルとして返します。
STRUUID() |
"73cd4307-8a99-4691-a608-b5bda64fb6c1" |
特定の関数(例: REGEX、STRLEN、 CONTAINS)は、 文字列リテラルを引数として取ります。 文字列リテラルは次のいずれかです。
xsd:stringを持つリテラルrdf:langStringを持ち、
言語タグを持つリテラル
rdf:dirLangStringを持ち、
言語タグと
基底方向の両方を持つリテラル
その他のRDF用語を使用すると、その関数呼び出しはエラーを発生させます。
"abc"は、
"abc"^^xsd:stringの構文上の省略形である
単純リテラルです。
関数SUBSTR、 STRBEFORE、 STRAFTER、および REPLACEは、その最初の引数と同じ種類の 文字列リテラルを返します。
関数CONCATは、引数の文字列リテラル形式に応じた 文字列 リテラルを返します。
関数STRSTARTS、 STRENDS、 CONTAINS、 STRBEFORE、 および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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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() |
"" |
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-tag、language-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" .
このクエリは、langMatchesと
langを使用して、英語で
"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 |
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" |
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" |
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" |
numeric ABS (numeric term)
argの絶対値を返します。argが数値でない場合、
エラーが発生します。
この関数は、XDM由来のデータ型を持つ用語について、 fn:absと同じです。
ABS(1) |
1 |
ABS(-1.5) |
1.5 |
numeric ROUND (numeric term)
引数に最も近い、小数部を持たない数を返します。そのような数が2つある場合は、
正の無限大に最も近い方が返されます。argが数値でない場合、
エラーが発生します。
この関数は、XDM由来の データ型を持つ用語について、fn:roundと同じです。
ROUND(2.4999) |
2.0 |
ROUND(2.5) |
3.0 |
ROUND(-2.5) |
-2.0 |
numeric CEIL (numeric term)
argの値より小さくない、小数部を持たない最小の
(負の無限大に最も近い)数を返します。argが数値でない場合、
エラーが発生します。
この関数は、XDM由来のデータ型を持つ用語について、 fn:ceilingと同じです。
CEIL(10.5) |
11.0 |
CEIL(-10.5) |
-10.0 |
numeric FLOOR (numeric term)
argの値より大きくない、小数部を持たない最大の
(正の無限大に最も近い)数を返します。argが数値でない場合、
エラーが発生します。
この関数は、XDM由来のデータ型を持つ用語について、 fn:floorと同じです。
FLOOR(10.5) |
10.0 |
FLOOR(-10.5) |
-11.0 |
xsd:double RAND ( )
0(含む)から1.0e0(含まない)までの疑似乱数を返します。 この関数が呼び出されるたびに、異なる数を生成できます。 数はおおよそ等しい確率で生成されるべきです。
rand() |
"0.31221030831984886"^^xsd:double |
xsd:dateTime NOW ()
現在のクエリ実行に対するXSD dateTime値を返します。 1回のクエリ実行内でのこの関数のすべての呼び出しは、同じ値を返さなければなりません。 返される正確な瞬間は指定されません。
NOW() |
"2011-01-10T14:45:13.815-05:00"^^xsd:dateTime |
xsd:integer YEAR (xsd:dateTime arg)
argの年部分を整数として返します。
この関数はfn:year-from-dateTimeに対応します。
YEAR("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) |
2011 |
xsd:integer MONTH (xsd:dateTime arg)
argの月部分を整数として返します。
この関数はfn:month-from-dateTimeに対応します。
MONTH("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) |
1 |
xsd:integer DAY (xsd:dateTime arg)
argの日部分を整数として返します。
この関数はfn:day-from-dateTimeに対応します。
day("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) |
10 |
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 |
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 |
xsd:decimal SECONDS (xsd:dateTime arg)
argの字句形式の秒部分を返します。
この関数はfn:seconds-from-dateTimeに対応します。
SECONDS("2011-01-10T14:45:13.815-05:00"^^xsd:dateTime) |
13.815 |
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 |
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) |
"" |
triple term TRIPLE (RDF term subj, RDF term pred, RDF term obj)
<<( subj pred obj )>>
3タプル(subj、
pred、
obj)が
RDFトリプル
(すなわち、subjが
IRIまたは
空白ノードであり、
predが
IRIであり、
objが
IRI、
トリプル用語、
空白ノード、または
リテラルである)
場合、この関数はこれら3つの要素を持つトリプル用語を返します。
そうでなければ、この関数はエラーを発生させます。
省略記法として、TRIPLE関数は
<<(および)>>を用いる
トリプル用語式の形式でも書くことができます。
この省略形には構文上の制限があります。
関数形式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 .
}
RDF term SUBJECT (triple term triple-term)
引数が トリプル用語である場合、 この関数はそのトリプル用語の 主語を返します。 引数が トリプル用語でない場合、 エラーが発生します。
RDF term PREDICATE (triple term triple-term)
引数が トリプル用語である場合、 この関数はそのトリプル用語の 述語を返します。 引数が トリプル用語でない場合、 エラーが発生します。
RDF term OBJECT (triple term triple-term)
引数が トリプル用語である場合、 この関数はそのトリプル用語の 目的語を返します。 引数が トリプル用語でない場合、 エラーが発生します。
xsd:boolean isTRIPLE (RDF term term)
引数がトリプル用語である場合、 この関数はtrueを返します。 引数がその他の種類の RDF用語である場合、 この関数はfalseを返します。
xsd:string MD5 (xsd:string arg)
xsd:stringの字句形式に対して計算されたMD5チェックサムを、
16進数字文字列として返します。16進数字は小文字であることが
望ましいです。
MD5("abc") |
"900150983cd24fb0d6963f7d28e17f72" |
xsd:string SHA1 (xsd:string arg)
xsd:stringの字句形式に対して計算されたSHA1チェックサムを、
16進数字文字列として返します。16進数字は小文字であることが
望ましいです。
SHA1("abc") |
"a9993e364706816aba3e25717850c26c9cd0d89d" |
xsd:string SHA256 (xsd:string arg)
xsd:stringの字句形式に対して計算されたSHA256チェックサムを、
16進数字文字列として返します。16進数字は小文字であることが
望ましいです。
SHA256("abc") |
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
xsd:string SHA384 (xsd:string arg)
xsd:stringの字句形式に対して計算されたSHA384チェックサムを、
16進数字文字列として返します。16進数字は小文字であることが
望ましいです。
SHA384("abc") |
"cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7"
|
xsd:string SHA512 (xsd:string arg)
xsd:stringの字句形式に対して計算されたSHA512チェックサムを、
16進数字文字列として返します。16進数字は小文字であることが
望ましいです。
SHA512("abc") |
"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"
|
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データ型へのキャストだけを定義します。 残りのキャストは次のように定義されます。
xsd:stringへキャストすると、
IRIを構成するコードポイントの字句値と、xsd:stringのデータ型を持つ
リテラルが生成されます。
下の表は、常に許可される(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 |
一部の条件下でエラーを返すよう指定されている任意の関数または演算子は、 有効な拡張ポイントであることに注意してください。すなわち、実装はこれらのエラーの場合に 非エラー値を返すことができ、それでもこの勧告に適合します。
PrimaryExpression文法規則は、IRIで名前付けされた 拡張関数の呼び出しであり得ます。拡張関数は、いくつかのRDF用語を引数として取り、 RDF用語を返します。これらの関数の意味論は、その関数を識別するIRIによって識別されます。
拡張関数を使用するSPARQLクエリは、相互運用性が制限される可能性があります。
例として、func:evenという関数を考えます。
xsd:booleanfunc:even(numericvalue)
この関数は、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:doubleaGeo:distance(numericx1,numericy1,numericx2,numericy2)
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用語へ変換するような、データ型形式間の変換である場合もあります。
この節では、クエリ文字列とRDFデータセットが与えられたときの、グラフ・パターンおよび解 修飾子の評価に関する正しい振る舞いを定義します。これは、SPARQL実装がここで定義される 処理を使用しなければならないことを意味するものではありません。
SPARQLクエリを実行した結果は、一連の手順によって定義されます。まず文字列としての SPARQLクエリから始まり、その文字列を抽象構文形式へ変換し、次にその 抽象構文を、SPARQL代数の演算子から構成されるSPARQL抽象クエリへ変換します。この 抽象クエリは、その後RDFデータセット上で評価されます。
RDFデータセットの概念は、[RDF12-CONCEPTS]で定義されています。
以下の定義のために、各RDFデータセットを集合として捉えます。
{ G, (<u1>, G1), (<u2>, G2), ... (<un>, Gn) } ここでGおよび各Giはグラフであり、各<ui>はIRIまたは空白 ノードです。各 <ui>は互いに異なります。
Gはデフォルトグラフと呼ばれます。(<ui>, Gi)は名前付き グラフと呼ばれます。
定義: アクティブグラフ
アクティブグラフとは、基本グラフ・パターン照合に使用される、データセット内の グラフです。
定義: クエリ変数
すべてのRDF用語の集合と互いに素である、可算無限集合 Vを仮定します。 この集合Vの各メンバーはクエリ変数です。
定義: トリプル・パターン
トリプル・パターンは、次のように帰納的に定義される 3タプルです。 すなわち、
(s, p, o)はトリプル・パターンです。
トリプル・パターンは循環を許しません (すなわち、トリプル・パターンはそれ自身の内部に含まれてはなりません)。
このトリプル・パターンの定義にはリテラル主語が含まれます。 これはRDF-coreによって指摘されています。
「[RDF core Working Group]は、リテラルが主語であってはならない理由を認識しておらず、 より制限の少ない憲章を持つ将来のWGが、文の主語としてリテラルを許可するように 構文を拡張する可能性があることを指摘しました。」
RDFグラフはリテラル主語を含まないため、主語としてリテラルを持つ任意のSPARQL トリプル・パターンは、どのRDFグラフにも一致しません。
定義: 基本グラフ・パターン
基本グラフ・パターンは、 トリプル・パターンの集合です。
空のグラフ・パターンは、空集合である基本グラフ・パターンです。
定義: プロパティ・パス
プロパティ・パスとは、系列STに含まれるトリプルtiの列であり、n = length(ST)-1として、i=0からnまでについて、tiの目的語が ti+1の主語と同じ用語であるものです。
t0の主語をパスの始点と呼びます。
tnの目的語をパスの終点と呼びます。
各tiがGのトリプルである場合、プロパティ・パスはグラフG内のパスです。
プロパティ・パスは、データセット内の複数のグラフにまたがりません。
定義: プロパティ・パス式
プロパティ・パス式とは、上で記述したプロパティ・パス形式を使用する式です。
定義: プロパティ・パス・パターン
プロパティ・パス・パターンは、次の条件を満たす3タプル(s, p, o)です。
プロパティ・パス・パターンは、述語位置にプロパティ・パス式を含めるように トリプル・パターンを一般化したものです。
解マッピングとは、変数の集合からRDF用語の集合へのマッピングです。明らかな場合には 「解」という用語を使用します。
定義: 解マッピング
解マッピングμは部分関数 μ : V → Tであり、ここで Vはすべての変数の集合であり、 TはすべてのRDF用語の集合です。
μの定義域はdom(μ)で表され、 μが定義されているVの部分集合です。
定義: 解列
解列とは、順序付けられていない可能性のある解のリストです。
μによって与えられる変数の用語を使用した式exprの値をexpr(μ)と書きます。 評価はエラーになることがあります。
定義: SPARQLクエリ
SPARQL抽象クエリはタプル(E, DS, QF)であり、 ここで:
定義: クエリレベル
クエリレベルとは、グラフ・パターン、グループ化と集約の集合、および 解修飾子の集合です。
クエリは「クエリレベル」の木であり、各サブクエリは その木の1つのクエリレベルを形成します。
SPARQLクエリの評価意味論を定義するために、 SPARQLクエリ文字列の抽象構文木 (SPARQL文法によって定義されるもの)は、 まずSPARQL代数に似た構文へ変換されます。 この節では、この代数構文で形成できる式を定義し、 SPARQLクエリ文字列をこの代数構文へ変換する方法は 第 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 |
ある変数が、クエリの代数式の評価における その時点で、解マッピングの定義域に含まれ得る方法が存在する場合、その変数は スコープ内であると定義します。 以下の定義は、クエリの抽象構文木からこれを判定する方法を提供します。
投影を持つサブクエリは変数を隠すことがあることに注意してください。
FILTER内またはMINUS内で変数を使用しても、
それらの形式の外でその変数がスコープ内になるわけではありません。
P、P1、およびP2をグラフ・パターンとし、E、
E1,..., 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 } |
vはP内でスコープ内である |
VALUES v { values } |
vはスコープ内である |
VALUES varlist { values } |
vがvarlist内にある場合、vはスコープ内である |
変数vは、(expr AS v)形式の時点で
スコープ内であってはなりません。(expr AS v)のスコープは
SELECT式内で直ちに適用されます。
BIND (expr AS v)では、使用されるグループ・グラフ・パターン内の
先行要素から変数vがスコープ内でないことを要求します。
SELECTでは、変数vはSELECT節のグラフ・パターン内で
スコープ内であってはならず、また、その節内のより前の別のselect式で使用されていてもなりません。
この節では、SPARQLグラフ・パターンを
代数クエリ式へ変換する処理について説明します。
この処理は、クエリのWHERE節を形成するグループ・グラフ・パターン
(波括弧("{ }")区切りの単位)に適用され、
グループ・グラフ・パターン内の各構文要素に再帰的に適用されます。
変換の結果は
代数クエリ式です。
要約すると、手順は次のように適用されます。
FILTERを収集する。
ここで説明するグラフ・パターン変換アルゴリズムを、次のように書きます。
translate(graph pattern)
OPTIONAL { { ... FILTER ( ... ?x ... ) } }..
これは2つの非規範的テストケースによって示されます。
グラフ・パターンのすべての変換後に簡略化ステップを適用することが 推奨される読みです。
第 4. SPARQL構文で与えられるIRIおよびトリプル・パターンの省略形を展開します。
FILTER式は、それが現れるグループ・グラフ・パターン全体に適用されます。
フィルタリングを実行する代数演算子は、各グループ要素の変換後にグループへ追加されます。
ここではフィルターをまとめて収集し、グループから削除した後、
変換済みグループ・グラフ・パターン全体へ
適用します。
Let FS := empty set
For each form FILTER(expr) in the group graph pattern
FS := FS ∪ {expr}
End
フィルター式の集合FSは後で
使用されます。
次の表は、SPARQLクエリ文字列内の プロパティ・パス式を 代数プロパティ・パス式へ変換する方法を示します。 これはプロパティ・パス式のすべての要素へ 再帰的に適用されます。
この手順の次の手順では、
特定の形式をトリプル・パターンへ変換し、それらは後で基本グラフ・パターンへ
隣接性によって変換されます(介在するグループ・パターン区切り
{および})や
その他の構文形式なしに)。全体として、IRIだけからなるSPARQL構文のプロパティ・パスは
トリプル・パターンになり、それらは基本グラフ・パターンへ集約されます。
注:
| 構文形式(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}), |
path1 / path2 |
Seq(path1, path2) |
path1 | path2 |
Alt(path1, path2) |
path* |
ZeroOrMorePath(path)
|
path+ |
OneOrMorePath(path)
|
path? |
ZeroOrOnePath(path)
|
前の手順ではプロパティ・パス式を変換しました。 この手順ではプロパティ・パス・パターンを変換します。 これは主語端点、プロパティ・パス式、および目的語端点から構成されます。 この手順は、プロパティ・パス・パターンのプロパティ・パス式がすでに 代数プロパティ・パス式の形式で 与えられていることを仮定します。この手順の結果は、トリプル・パターン、および 代数クエリ式 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) |
パス変換処理全体の例(?_Vは新鮮な
変数):
プロパティ・パスを変換した後、隣接するトリプル・パターンはまとめて収集され、
基本グラフ・パターンBGP(triples)を形成します。
次に、残りの各グラフ・パターン形式を変換し、変換処理を再帰的に適用します。
形式が
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は、変数のリスト(または単一変数)内の対応する位置の変数から解マッピングを
形成することによって構成されます。ただし、DataBlockValueが
UNDEFという語である場合、その束縛は省略されます。
形式がSubSelectである場合
The result is ToMultiset(Translate(SubSelect))
グループが変換された後、フィルター式が追加され、グループの残り全体に適用されます。
If FS is not empty
Let G := output of preceding step
Let X := Conjunction of expressions in FS
G := Filter(X, G)
End
1つのグラフ・パターンからなる一部のグループは、Join(Z, A)になります。ここでZは空の基本 グラフ パターン(空集合)です。これらはAに置き換えられます。空の グラフ・パターンZはjoinの単位元です。
Replace Join(Z, A) by A Replace Join(A, Z) by A
書き換え例の2番目の形式は、最初の形式から簡略化ステップにより空のグループjoinを削除したものです。 Zは空の基本グラフ・パターンです。
例: 単一のトリプル・パターンからなる基本グラフ・パターンを持つグループ:
例: 2つのトリプル・パターンからなる基本グラフ・パターンを持つグループ:
例: 2つの基本グラフ・パターンのunionからなるグループ:
例: unionと基本グラフ・パターンのunionからなるグループ:
例: 基本グラフ・パターンとoptionalグラフ・パターンからなるグループ:
例: 基本グラフ・パターンと2つのoptionalグラフ・パターンからなるグループ:
例: 基本グラフ・パターンと、フィルターを持つoptionalグラフ・パターンからなるグループ:
例: unionグラフ・パターンとoptionalグラフ・パターンからなるグループ:
例: 基本グラフ・パターン、フィルター、およびoptionalグラフ・ パターンからなるグループ:
例: BINDを含むパターン:
例: BINDを含み、 簡略化ステップを伴うパターン:
{}を使用していますが、上の前の例では代わりにZを使用しています。
例はこの点で一貫しているべきです。
例: MINUSを含むパターン:
例: サブクエリを含むパターン:
この手順では、クエリレベル上の節を次の順序で処理します。
手順: GROUP BY
GROUP BYキーワードが使用される場合、または
HAVING節やORDER BY節、あるいは
投影内で集約を使用することにより暗黙的なグループ化がある場合、グループ化はGroup関数によって実行されます。
この場合、グループ化の前に、ToList関数を適用することで
解集合が解列へ変換されます。
次に、Group関数は、
この解列を、同じ全体濃度を持つ1つ以上の解のグループへ分割します。
暗黙的なグループ化の場合、すべての解を単一のグループへグループ化するために固定
定数(1)が使用されます。
手順: 集約
集約手順は、クエリレベル上の変換として適用され、クエリレベル内の aggregate式をAggregation()代数 式へ置き換えます。
任意のaggregateを使用するクエリレベルに対する変換を 以下に示します。
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式を変換するときに使用されます。
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
クエリに末尾の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
データの変換はインライン データの場合と同じです。
手順: 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のターゲットとしてすでに使用されている場合に発生します。
解修飾子は、パターン照合後のSPARQLクエリの処理に適用されます。
解修飾子は解マッピングの列に対して作用するため、 この時点までに生成されたクエリ結果は、まず解マッピングのマルチセットから そのような列へ変換されます。この列には暗黙の順序はなく、 重複が隣接している必要もありませんが、この列は、それに含まれる要素と その多重度という点では、マルチセットと同一です。この マルチセットから列への変換を適用するため、解修飾子を 代数クエリ式へ 変換するアルゴリズムは次の手順から開始します。ここでAは、 前の節のアルゴリズムによって生成された 代数クエリ式です。
Let M := ToList(A)
次に、解修飾子は次の順序で適用されます。
クエリ文字列にORDER BY節がある場合
M := OrderBy(M, list of order comparators)
投影変数の集合PVは、 SELECT式の処理で計算されています。
M := Project(M, PV)
クエリがDISTINCTを含む場合、
M := Distinct(M)
クエリがREDUCEDを含む場合、
M := Reduced(M)
クエリが"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)
全体の代数クエリ式はMです。
グラフ・パターンを照合するとき、可能な解は マルチセット、 バッグとも呼ばれるものを形成します。マルチセットとは、 各要素が複数回現れ得る、順序付けられていない要素の集まりです。それは 要素の集合と、これら各要素の多重度(すなわち、その要素がマルチセットに含まれる回数) を与える関数によって記述されます。
解マッピングをμと書きます。
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(μ | Ψ) と書いて、μがΨ内に現れる回数を表します。
基本グラフ・パターンは、クエリのその部分に対するアクティブグラフと照合されます。 基本グラフ・パターンは、変数と空白ノードの両方を用語で置き換えることによって インスタンス化でき、インスタンスには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です。
この定義により、解マッピングは、基本グラフ・パターン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であっても クエリ結果に冗長性が含まれることを許し、 論理的に等価なデータセットが異なるクエリ結果を生じることも許します。
この節では、プロパティ・パス パターンの評価を定義します。プロパティ・パス・パターンは、主語端点 (RDF用語または変数)、 プロパティ・パス式、および目的語端点から構成されます。
プロパティ・パス式の変換は、
すべてのプロパティ・パス式を
代数プロパティ・パス式へ変換します。
たとえば、プロパティ・パス式(:p/:q)*は、
sequenceプロパティ・パスを含むZeroOrMorePath式であり、
代数プロパティ・パス式
ZeroOrMorePath( Seq(Link(:p), Link(:q)) )へ変換されます。
その後、プロパティ・パス・パターンの変換は、 これらの代数プロパティ・パス式の一部を他のSPARQLグラフ・パターンへ変換します。 たとえば、長さ1のプロパティ・パスをトリプル・パターンへ変換し、それらはさらに 基本グラフ・パターンへ結合されます。 その結果、次の演算子を持つ代数プロパティ・パス式が残ります。 Alt、 ZeroOrOnePath、 ZeroOrMorePath、 OneOrMorePath、 およびNPS、 ならびにこれらの演算子内に含まれる代数プロパティ・パス 式です。
これらの残りの代数プロパティ・パス式を持つプロパティ・パス・パターンは、 代数構文内で、端点 XおよびYに対する Path(X, ppe, X)の形式で 存在します。
プロパティ・パス・パターンの評価を表すために、すべての 代数クエリ式 のうち Path(X, ppe, Y)の形式であるものについて、 次のように書きます。
ppeval(X, ppe, Y)
これは解マッピングのマルチセットを生成し、各解マッピングは使用される変数の束縛を持ちます (XおよびYはどちらも 変数であり得ます)。一部の演算子は解マッピングの集合だけを生成します。
| 表記 | xが次である場合 |
|---|---|
x:term |
RDF用語 |
x:var |
変数 |
ppevalのシグネチャは次のように拡張されるべきです。
ppeval(X, ppe, Y, G)。
ここでGはRDFグラフです。
すべての評価は、クエリ全体の評価におけるその時点の アクティブグラフとの照合によって行われます。 明確さのため、各定義にアクティブグラフを明示的に含めることは省略します。
定義: 述語プロパティ・パスの評価
iriをIRIとします。
ppeval(X, Link(iri), Y) = evaluation of basic graph pattern {X iri Y}
XとYがどちらも変数である場合、これは次と同じです。
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 }
XとYがどちらも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 }という
サブクエリを実行することと同じです。
定義: 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になり、
P2はppe2へ変換できます。
この観察は、単純含意の下では空白ノード_: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になり、 P2はppe2へ変換できます。
定義: 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 p ∉ S }
SPARQL抽象クエリに残る各記号について、評価用の演算子を定義します。 同じ名前のSPARQL代数演算子は、「評価 意味論」の節で説明されるように、SPARQL抽象クエリノードを評価するために使用されます。 基本グラフ・パターンおよびプロパティ・パス・パターンの評価は、上で説明されています。
定義: Filter
Ωを解マッピングのマルチセット、 exprを式、 Dをデータセット、 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を解マッピングのマルチセット、 exprを式、 Dをデータセット、 Gをアクティブグラフとします。 次のように定義します。
Diff(Ω1, Ω2, expr, D, G) = { μ in Ω1 | Ω2内のすべての μ'について、次の条件のいずれかが成り立つ:
"true"^^xsd:boolean ではない。
}
multiplicity( μ | Diff(Ω1, Ω2, expr, D, G) ) = multiplicity( μ | Ω1 )
ここで、すべての解マッピングμについて、 expr(μ, D, G) は、 アクティブグラフGを持つデータセットDの文脈において、 μに関して式exprを 評価した結果です。
Diffは、LeftJoinの定義のために内部的に使用されます。
定義: LeftJoin
Ω1およびΩ2を解マッピングのマルチセット、 exprを式、 Dをデータセット、 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を変数、 exprを式、 Dをデータセット、 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を 評価した結果です。
Cがxに関する条件であるような要素の列を [ 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) )
定義: Distinct
Ψを解マッピングの列とします。次のように定義します。
Distinct(Ψ) = [ μ | μ in Ψ ]
multiplicity( μ | Distinct(Ψ) ) = 1 for every μ ∈ Distinct(Ψ)
multiplicity( μ | Distinct(Ψ) ) = 0 for every μ ∉ Distinct(Ψ)
定義: Reduced
Ψを解マッピングの列とします。次のように定義します。
Reduced(Ψ) = [ μ | μ in Ψ ]
multiplicity( μ | Reduced(Ψ) ) は、 すべてのμ ∈ Reduced(Ψ)について、 1から multiplicity( μ | Ψ ) までの間です。
multiplicity( μ | Reduced(Ψ) ) = 0 for every μ ∉ Reduced(Ψ)
Reduced解列修飾子は、定義された多重度を保証しません。
定義: Slice
Ψを解マッピングの列、offsetおよびlimitを 非負整数とします。次のように定義します。
Slice(Ψ, offset) = Ψ0 if offset ≥ Card(Ψ)
Slice(Ψ, offset) = subseq(Ψ, offset+1, Card(Ψ)) if 0 ≤ offset < Card(Ψ)
Slice(Ψ, offset, limit) = Ψ0 if offset ≥ Card(Ψ) or limit = 0
Slice(Ψ, offset, limit) = subseq(Ψ, offset+1, Card(Ψ)) if 0 ≤ offset < Card(Ψ) and limit ≥ Card(Ψ)−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( μ | Ψ )
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つの条件のいずれかが真である場合に限り、 同じと見なされます。
定義: ListEval
ListEval((expr1, ..., exprn), μ) はリスト (e1, ..., en) を返します。ここで、 ei = expri(μ) または エラーです。
ListEvalは、リスト要素の評価から生じるエラーを保持します。
ListEvalの結果にはエラーが含まれることがあり、 エラーがグループ化に使用されることもありますが、 エラー値を含む解は、グループおよび任意の集約関数の評価の最後に削除されることに注意してください。
ListEval((unbound), μ)の結果はリスト(error)であることにも注意してください。 束縛されていない式の評価はエラーであるためです。
Aggregationは、集約 式の出力としてスカラー値を計算する関数です。これはSELECT節、HAVING評価処理、および必要な場合にはORDER BYで使用されます。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用語およびエラーを含むことがあります)。
特別な場合: 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)], {})) } です。
S1, ..., Snを集合のリストとし、 各集合SiはAggregationによって生成される キーから(集約された)値へのマップを含むものとします。
K = { key | key in dom(Sj)
for some 1 ≤ j ≤ n } をキーの集合とすると、
AggregateJoin(S1, ...,
Sn) = { agg1→val1,
..., aggn→valn |
key in K and key→vali in
Si for each 1 ≤ i ≤ n }
SPARQL集約の基礎となる集合関数はすべて共通のシグネチャを持ちます。
SetFunc(S)、または SetFunc(S, scalarvals) です。
ここでSはリストの列であり、scalarvalsは、
SPARQL文法内の集約用の ( ... ; key=value ) 構文を介して間接的に集合関数へ渡される
1つ以上のスカラー値です。SPARQL Query 1.1の組み込み集約でサポートされる
この仕組みの唯一の使用は、GROUP_CONCAT(?x ; separator=", ")のような
GROUP_CONCATです。
「集合関数」という名前はいくらか歴史的なものであることに注意してください。 集合関数への引数は実際には列です。この名前は、マルチセットに対して動作するSQLの 集合関数との共通性のために保持されています。
この文書で定義される集合関数は、
Count、
Sum、
Min、
Max、
Avg、
GroupConcat、および
Sample
です。これらは集約COUNT、
SUM、MIN、MAX、AVG、
GROUP_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の濃度です。
Countは、与えられた式が集約グループ内で 束縛され、エラーでない値を持つ回数を数えるSPARQL集合関数です。
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)は次のように再帰的に定義されます。
xsd:integer。
L1はLの最初の要素であり、 L2..nは最初の要素を除いたLであることに注意してください。
このように、Sum( [(1), (2), (3)] ) = SumList( (1, 2, 3) ) = op:numeric-add(1, op:numeric-add(2, op:numeric-add(3, 0))) です。
たとえば、Avg([(1), (2), (3)]) = Sum([(1), (2), (3)])/Count([(1), (2), (3)]) = 6/3 = 2 です。
Minは、グループから最小値を返す SPARQL集合関数です。
これは、任意の型の式に対する順序付けを可能にするため、SPARQL ORDER BYの順序定義を使用します。
Maxは、グループから最大値を返す SPARQL集合関数です。
これは、任意の型の式に対する順序付けを可能にするため、SPARQL ORDER BYの順序定義を使用します。
GroupConcatは、グループ内の式の値にわたって 文字列連結を実行する集合関数です。文字列の順序は指定されません。 連結で使用される区切り文字は、スカラー引数SEPARATORによって与えられます。
定義: GroupConcat
xsd:string GroupConcat(sequence S, function scalarvals)
scalarvals引数がGROUP_CONCATから省略されている場合、
scalarvalsは空関数とみなされます。
sepを、次のように定義される文字列とします。
GroupConcat(S, scalarvals) = GCList(L, sep),
ここでL = Flatten(S)であり、 GCList(L, sep)は 次のように再帰的に定義されます。
CONCAT("", L1)。
CONCAT(L1, sep,
GCList(L2..n, sep))。
L1はLの最初の要素であり、 L2..nは最初の要素を除いたLであることに注意してください。
たとえば、GroupConcat([("a"), ("b"), ("c")], {"separator" → "."}) = GCList( ("a", "b", "c"), "." ) = "a.b.c" です。
Sampleは、渡された列から任意の値を返す 集合関数です。
たとえば、Sample([("a"), ("b"), ("c")])が与えられた場合、 "a"、"b"、および"c"はすべて有効な戻り値です。 Sample関数は、与えられた入力について決定的であることを 要求されないことに注意してください。唯一の制限は、出力値が入力列に存在していなければならないことです。
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 }形式の
式を評価するときです。
以下の定義で使用される追加の記号は次のとおりです。
定義: プロパティ・パス・ パターンの評価
eval( D(G), Path(X, path, Y), μctx ) = 解マッピングのマルチセット
プロパティ・パス・パターンの節を参照してください。
定義: ContextSolutionの評価
eval( D(G), ContextSolution, μctx ) = μctxだけを含み、多重度が1であるマルチセット
定義: 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 ) は次のように定義されます。
Ω := 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 μ = {x → gn} the result is Ω
eval( D(G), Aggregation(exprlist, func, scalarvals, Grp), μctx ) = Aggregation( exprlist, func, scalarvals, eval(D(G), Grp, μctx) )
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 )
定義: 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) )
SPARQL全体の設計は、基本グラフ・パターンの照合条件を書き換えることにより、 単純含意よりも複雑な形式の含意を仮定するクエリに使用できます。 そのような条件を、すべての含意形式に適用され、不要または不適切な冗長性を最適に除去する 単一の一般形式で述べることは未解決の研究課題であるため、この文書では、 そのような任意の解が満たすべき必要条件だけを示します。これらは、各特定の場合について 完全な定義へ拡張される必要があります。
基本グラフ・パターンは、RDFグラフがRDFトリプルに対して持つのと同じ関係を、 トリプル・パターンに対して持っており、多くの同じ用語を適用できます。特に、 2つの基本グラフ・パターンは、トリプル・パターンの用語間に全単射Mが存在し、 それが空白ノードを空白ノードへ写し、変数、リテラルおよびIRIをそれ自身へ写し、 かつトリプル( s, p, o )が最初のパターンに含まれる場合に限り、 トリプル( M(s), M(p), M(o) )が2番目に含まれるなら、 等価であると言われます。この定義は、等価なパターン間で変数名を保持することにより、 RDFグラフ等価性の定義を基本グラフ・パターンへ拡張します。
含意体制は次を指定します。
さまざまな含意体制を問い合わせるための詳細な定義は、 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)と表します。
含意体制は、さらに次の条件を満たさなければなりません。
SG E-entails (SG union μ1(BGP1) union ... union μn(BGPn))
これらの条件は、RDFが無制限の冗長性を許すため、可能な解の集合を完全には決定しません。 したがって、さらに次の条件が成り立たなければなりません。
(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) = σi(μi(BGPi)) です。したがって、
P1(BGP1) union ... union Pn(BGPn)
= σ1(μ1(BGP1)) union ... union
σn(μn(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によって単純に含意されます。
SPARQL文法は、SPARQL QueryとSPARQL 1.1 Updateの両方を対象とします。
SPARQL 文字列は、 この節で与えられる文法に適合する RDF 文字列です。
RDF文字列は、 Unicodeスカラー値である Unicodeコードポイント の列です。 Unicodeスカラー値には、 サロゲートコードポイントは含まれません。
SPARQLクエリ文字列は、 SPARQL文字列であり、 QueryUnit生成規則から始まる文法に適合するものです。
SPARQL 更新文字列は、 SPARQL文字列であり、 UpdateUnit生成規則から始まる文法に適合するものです。
Unicodeの将来の版との互換性のため、この文字列内の文字には、
この公開日の時点で未割り当てのUnicodeコードポイントを含めることができます
(Unicode Identifiers and
Syntax [UAX31] 第4節 Pattern Syntaxを参照)。
除外文字クラスを持つ生成規則
(たとえば[^<>'{}|^`])では、文字は
#x0 - #x10FFFFの範囲から除外されます。
SPARQL文書で使用されるエスケープには3つの形式があります。
数値エスケープシーケンスは、 Unicodeコードポイント の値を表します。
数値エスケープシーケンスは、 Unicode サロゲートの範囲である U+D800からU+DFFFまでの範囲の コードポイント値を生成してはなりません。
| エスケープシーケンス | Unicodeコードポイント |
|---|---|
| '\u' HEX HEX HEX HEX | U+0000からU+D7FF およびU+E000からU+FFFF までの範囲内のUnicodeコードポイントであり、 4桁の16進数字を最上位桁から最下位桁へ解釈してエンコードされた値に対応します。 |
| '\U' HEX HEX HEX HEX HEX HEX HEX HEX | 文字列 U+0000からU+D7FF およびU+E000からU+10FFFF までの範囲内のUnicodeコードポイントであり、 8桁の16進数字を最上位桁から最下位桁へ解釈してエンコードされた値に対応します。 |
ここでHEXは16進文字です。
HEX ::= [0-9] | [A-F] | [a-f]
文字列エスケープシーケンスは、文字列リテラル内で伝統的に エスケープされる文字を表します。
| エスケープ | Unicodeコードポイント |
|---|---|
| '\t' | U+0009(タブ) |
| '\n' | U+000A(改行) |
| '\r' | U+000D(復帰) |
| '\b' | U+0008(バックスペース) |
| '\f' | U+000C(改ページ) |
| '\"' | U+0022(引用符、二重引用符) |
| "\'" | U+0027(アポストロフィ引用符、一重引用符) |
| '\\' | U+005C(バックスラッシュ) |
予約文字エスケープシーケンスは、
\の後にこれらの文字
~.-!$&'()*+,;=/?#@%_のいずれかが続くものであり、
\の右側にある文字を表します。
エスケープシーケンスは、次の場所で使用できます。
| 数値 エスケープ |
文字列 エスケープ |
予約文字 エスケープ |
|
|---|---|---|---|
| IRI、 RDF用語 として、または PREFIX、 もしくはBASE宣言内で使用されるもの | はい | いいえ | いいえ |
| ローカル名 | いいえ | いいえ | はい |
| 文字列 | はい | はい | いいえ |
エスケープシーケンスは、関連する文法生成規則に一致する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を指します。
空白(生成規則WS)は、そうでなければ1つの終端記号として
(誤って)認識される2つの終端記号を分離するために使用されます。以下の大文字の規則名は、
空白が重要な場所を示します。これらは、SPARQLパーサーを構築するための終端記号の
可能な選択肢を形成します。空白は文字列内では重要です。それ以外では、
空白はトークン間で無視されます。
たとえば:
?a<?b&&?c>?d
は、変数'?a'、IRI
'<?b&&?c>'、および変数'?d'というトークン列であり、
2つの式を'<'(小なり)および'>'(大なり)で
接続する演算子'&&'を含む式ではありません。
SPARQLクエリ内のコメントは、IRIまたは文字列の外側にある'#'の形式を取り、
行末(文字0x0Dまたは0x0Aで示される)まで、
またはコメントマーカーの後に行末がない場合はファイル末尾まで続きます。
コメントは空白として扱われます。
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用語の構文を参照してください。
空白ノードは、次の中では使用できません。
SPARQL更新 リクエスト内では。
空白ノード識別子 は、それが現れるSPARQL文字列にスコープ付けられます。 リクエスト文字列内で同じ空白ノード識別子が異なる場所で使われた場合、 同じ空白ノードを参照します。新しい空白ノードは各リクエストごとに生成されます。 空白ノードは、リクエストをまたいで識別子により参照することはできません。
同じ空白ノード識別子は、次の中では使用できません。
WHERE節INSERT DATA操作同じ空白ノード識別子は、SPARQL 1.1 Updateリクエスト内の 異なるQuadPattern節に現れることができる点に注意してください。
文法で使用されるEBNF表記は、 Extensible Markup Language (XML) 1.1 [XML11] 第6節表記で定義されています。
文法には2つの入口点があります。
QueryUnitUpdateUnit。SPARQL文法は、大文字名の規則を終端記号として使用する場合、LL(1)です。
注記:
a'は例外であり、
Turtleと同様に、rdf:typeのIRI
(完全にはhttp://www.w3.org/1999/02/22-rdf-syntax-ns#type)の代わりに使用されます。
INSERT DATA、
DELETE DATAおよび
DELETE WHEREは、
単語間に任意の量の空白を許します。
明確さのため、文法では単一空白版が使用されます。
QuadDataおよび
QuadPattern規則は、どちらも
Quads規則を使用します。
INSERT DATAおよび
DELETE DATAで使用される
QuadData規則は、
quadパターン内の変数を許してはなりません。
DELETE WHERE、
DELETE用のDeleteClause、
およびDELETE DATAでは許されません。
VALUES節の変数リスト内の変数の数は、
DataBlock内の関連値リストそれぞれに含まれる
RDF用語
の数と対応していなければなりません。
VALUES節の変数リスト内の変数は、
そのリスト内で一意でなければなりません。
SELECT節内のASによって導入される変数は、
すでにスコープ内にあってはなりません。
BIND節で割り当てられる変数は、
GroupGraphPattern内で直前にある
TriplesBlock内で
すでに使用中であってはなりません。
DISTINCTキーワードを使用できます。
a、または変数)である場合に限り、
トリプルの後で許可され、他のパス式では許可されません。
*の使用は、
GROUP BY節を含む
クエリ、または
集約がHAVINGもしくは
ORDER BY節のいずれかに現れる場合には許可されません。
[1] |
QueryUnit |
::= | Query |
[2] |
Query |
::= | Prologue
|
[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 )
|
[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
|
[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
|
[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 ) ')'
|
[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 |
::= | '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%' )
|
この文法のテキスト版はこちらで利用できます。
非規範的であると示された節に加えて、この仕様におけるすべての作成指針、図、例、および注記は 非規範的です。この仕様におけるそれ以外のすべては規範的です。
この文書におけるキーワードMAY、MUST、MUST NOT、OPTIONAL、およびSHOULDは、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。
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クエリ処理サービスへ伝達し、 クエリ結果をそれらを要求したエンティティへ返すための手段を記述していることに注意してください。
SPARQLクエリ言語のインターネット・メディア型(以前はMIME型として知られていたもの)は
"application/sparql-query"です。
SPARQLクエリ・ファイルには、すべてのプラットフォームで拡張子".rq"(小文字)を 付けることが推奨されます。
この節は非規範的です。
TRIPLE、isTRIPLE、SUBJECT、PREDICATE、
OBJECT
LANGDIR、hasLANG、hasLANGDIR、およびSTRLANGDIR
xsd:stringへの明示的な言及に置き換え
-0001ではなく0000で
表されることに注意してください。
詳細については
date/timeSevenPropertyModel
に関する注記を参照してください。
EBVを関数形式として定義VALUES内の重複変数を禁止EXISTSの以前の非形式的な定義を修正し、
17.4.1.4 NOT
EXISTS and EXISTSに形式的定義を追加しました。この定義には、
eval関数を、解マッピングμctxを
第3引数として持つように拡張することが含まれます
RDFterm-equalを17.4.2.2 sameValueへ改名し、
異なるデータ型のリテラル引数であって、その値が等しい、または等しくないことが
分かっているものを扱うように定義を拡張*投影の使用制限を拡張sameValue(以前のRDFterm-equal)およびsameTermを
17.4.2
RDF用語に対する関数へ移動
!!を許可するための文法規則UnaryExpressionTODO
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節で見つけることができます。
TODO
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: