Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この文書は、SHACL Shapes Constraint Language の SPARQL 関連機能を定義する。 SHACL の Core 部分がシェイプの基本構文および SHACL でサポートされる最も一般的な制約コンポーネントを 定義する一方、SPARQL 関連機能は SPARQL を用いて Core の表現力を拡張する。 特に、この文書は、SPARQL を使用して制約および制約コンポーネントをどのように定義できるかを定義する。 さらに、この文書は、ノードのリストを導出するために使用できる SPARQL ベースのノード式を 導入する。 最後に、この文書は、SHACL ノード式に基づいて新しい SPARQL 関数を定義するための宣言的な仕組みを 定義する。
このセクションは、この文書の公開時点における状態を説明します。現在の W3C 公開物の一覧と、この技術報告書の最新版は、 W3C 標準および草案 インデックスで確認できます。
この文書は、Data Shapes ワーキンググループによって、 勧告 トラックを使用する 作業草案として公開されました。
作業草案としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 この文書を、進行中の作業以外のものとして引用することは不適切です。
この文書は、 W3C 特許 ポリシーの下で活動する グループによって作成されました。 W3C は、 グループの成果物に関連して行われた 特許開示の公開一覧 を管理しています。そのページには、特許を開示するための手順も含まれています。 個人が、その個人が 必須クレーム を含むと考える特許について実際の知識を有している場合、その個人は W3C 特許ポリシーのセクション 6 に従って情報を開示しなければなりません。
この文書は、 2025年8月18日版 W3C プロセス文書 によって管理されます。
この仕様は SHACL 1.2 仕様群の一部です。これらの仕様の詳細な 紹介については、SHACL 1.2 の概要を参照してください。
仕様は次のとおりです。
作業草案:
編集者草案:
実装者は、上記の仕様への適合度を、各仕様のメタデータにリンクされている テストケースを使用して 自らテストすることで部分的に確認できます。 ただし、テストスイートのすべてのテストに合格しても、 仕様への完全な適合を意味するわけではなく、 実装がテストスイートでテストされた側面に適合していることのみを意味します。
この文書は、Shapes Constraint Language (SHACL) の SPARQL 関連機能を規定します。
この文書全体で、次の用語を使用します。
この文書で定義される SHACL の SPARQL 関連機能は、SHACL-SPARQL と呼ばれることがある。
RDF 1.2 Concepts and Abstract Syntax の各部分にリンクされている用語は、そこで定義されているとおりに SHACL-SPARQL で使用されます。 SPARQL 1.2 Query Language の各部分にリンクされている用語は、そこで定義されているとおりに SHACL-SPARQL で 使用されます。 SHACL 1.2 Core の各部分にリンクされている用語は、そこで定義されているとおりに SHACL-SPARQL で使用されます。 1 つのリンクがあれば、この文書内に出現する特定の用語のすべての箇所に対する定義を提供するのに十分です。
定義はこの文書内で完結しています。すなわち、この文書にある状況を真にする規則が 存在しない場合、その状況は偽です。
SHACL の構文は RDF です。 この文書の例では Turtle [rdf12-turtle] を使用します。 実際には RDF/XML などの他の RDF シリアル化を使用できます。 読者は、トリプルなどの基本的な RDF 概念 [rdf12-concepts] と、 SPARQL [sparql12-query] に精通している必要があります。
この文書内では、次の名前空間プレフィックスバインディングが使用されます:
| 接頭辞 | 名前空間 |
|---|---|
owl: |
http://www.w3.org/2002/07/owl# |
rdf: |
http://www.w3.org/1999/02/22-rdf-syntax-ns# |
rdfs: |
http://www.w3.org/2000/01/rdf-schema# |
sh: |
http://www.w3.org/ns/shacl# |
xsd: |
http://www.w3.org/2001/XMLSchema# |
ex: |
http://example.com/ns# |
shnex: |
http://www.w3.org/ns/shacl-node-expr# |
sparql: |
http://www.w3.org/ns/sparql# |
この文書内では、次の JSON-LD コンテキストが使用されます:
{
"@context": {
"owl": "http://www.w3.org/2002/07/owl#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"sh": "http://www.w3.org/ns/shacl#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"ex": "http://example.com/ns#",
"shnex": "http://www.w3.org/ns/shacl-node-expr#",
"sparql": "http://www.w3.org/ns/sparql#"
}
}
SHACL 語彙自体を定義するグラフの URI は、上記の名前空間と同等であり、
つまり # を含むことに注意してください。
たとえば owl:imports による SHACL 語彙への参照には、# を含めるべきです。
文書全体に、Turtle の RDF グラフを含む色分けされたボックスが現れます。 これらの Turtle 文書の断片は、上記のプレフィックスバインディングを使用します。
SHACL 定義は青いボックスに表示されます:
# このボックスには SPARQL またはテキスト定義が含まれます。
このような灰色のボックスには、シェイプグラフに適用される構文規則が含まれます。
$マーカーを使用するSPARQL変数は、外部の束縛を表し、これらは事前に束縛されるか、$PATHの場合には、置換される。これらの処理はSPARQLクエリの実行前に行われる(詳しくは
3.3 次を用いた検証:
SPARQLベースの制約で説明されている)。
true は RDF 用語 "true"^^xsd:boolean を表します。
false は RDF 用語 "false"^^xsd:boolean を表します。
非規範的と明示された節に加えて、この仕様に含まれるすべての作成ガイドライン、図、例、注記は 非規範的です。この仕様のその他のすべての内容は規範的です。
この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、および SHOULD は、 ここに示すようにすべて 大文字で記述されている場合に限り、BCP 14 [RFC2119] [RFC8174] に記載されているとおりに 解釈しなければなりません。
この文書は、SHACL コアを拡張する SHACL-SPARQL 言語を定義します。 この仕様では、次の適合基準について説明します。
SPARQLValidation として識別されます)。
このようなプロセッサーは、追加で5.
注釈
プロパティをサポートしてもかまいません(MAY)。
サポートするプロセッサーは、その節の規則に従わなければなりません(MUST)。
SPARQLNodeExpr)
SPARQLCustomFunctions)
SHACL コアの適合性の節にある整形式に関する説明も参照してください。
SHACL 1.2 推論ルール仕様 [shacl12-inference-rules] は、SHACL 向けの追加の SPARQL ベースの機能を定義します。
この節では、SPARQLクエリの名前空間接頭辞を宣言するために、この文書全体で使用される仕組みを 紹介します。
シェイプグラフには、 同じシェイプグラフから導出されたSPARQLクエリを短縮するために使用できる名前空間接頭辞の宣言を 含めることができます。 このような接頭辞宣言の構文を、次の例に示します。
sh:prefixとsh:namespaceの両方の
値を持つ
IRIまたは空白ノードは、
接頭辞宣言と呼ばれます。
SHACL語彙には、このような接頭辞宣言の型として
クラスsh:PrefixDeclarationが含まれていますが、
これらにrdf:typeトリプルは必要ありません。
接頭辞
宣言は、プロパティsh:prefixの値を正確に1つ持ちます。
sh:prefixの値は、データ型
xsd:stringのリテラルです。
接頭辞
宣言は、プロパティsh:namespaceの値を正確に1つ持ちます。
sh:namespaceの値は、データ型
xsd:anyURIまたはxsd:stringのリテラルです。
このような値の組は、接頭辞から名前空間への単一のマッピングを指定します。
プロパティ
sh:declareの値は、接頭辞宣言です。
sh:declareの値に推奨される主語は、接頭辞を使用するシェイプを含む
名前付きグラフのIRIです。
これらのIRIは、多くの場合sh:ShapesGraphまたはowl:Ontologyの
インスタンスとして宣言されますが、これは必須ではありません。
特に、接頭辞宣言は、SPARQL ベースの制約、
SPARQL ベースの制約コンポーネントのバリデーター、
SPARQL ベースのノード式、および
SPARQL ベースの推論ルールで使用できます。
これらのノードは、sh:prefixes プロパティを使用して接頭辞マッピングの集合を指定できます。
sh:prefixes プロパティの使用例は、この
例に示されています。
sh:prefixes の値は、IRI または空白ノードです。
SHACL プロセッサーは、すべての個別の接頭辞マッピングの和集合として、
接頭辞マッピングの集合を収集します。これらのマッピングは、値であり、SPARQL プロパティパス
sh:prefixes/(^owl:versionIRI)?/(owl:imports/(^owl:versionIRI)?)*/sh:declare
によって、SPARQL ベースの制約、バリデーター、またはSPARQL ベースのノード式から取得されます。
(^owl:versionIRI)? 要素は、グラフの
owl:versionIRIによって参照されるグラフをサポートし、
sh:prefixes の値として直接、または owl:imports を介して参照できます。
接頭辞宣言を収集し、さらに owl:imports をたどる前に、
バージョン IRI からシェイプグラフ IRI へ移動します。
このような
接頭辞宣言の集合に、同じ sh:prefix の値に対して複数の異なる名前空間が含まれる場合、
シェイプ
グラフは非整形式です。
(SHACL プロセッサーは、到達しない接頭辞宣言を無視してもかまいません(MAY))。
SPARQL ベースの制約、バリデーター、またはSPARQL ベースのノード式に
sh:prefixes の値がない場合、
SHACL プロセッサーは、接頭辞宣言のうち、
シェイプ
グラフ内で、owl:Ontology、sh:DataGraph、sh:ShapesGraph、
または sh:RulesGraph(sh:ShapesGraph のサブクラス)の
SHACL インスタンスにおいて
sh:declare の値となるものを使用します。
SHACL プロセッサーは、sh:select(および
sh:ask や sh:construct などの類似プロパティ)の値を、
すべての接頭辞マッピングに対応するPREFIX
宣言を先頭に追加することで
SPARQL に変換します。
sh:prefix の各値は PNAME_NS に変換され、
sh:namespace の各値は
PREFIX 宣言内の IRIREF に変換されます。
上記のシェイプグラフの例では、SHACL-SPARQL プロセッサーは
PREFIX ex: <http://example.com/ns#> のような行を生成します。
生成されたクエリー文字列を有効な SPARQL 1.2 クエリーとして解析できない場合、SHACL-SPARQL プロセッサーは
失敗を生成しなければなりません(MUST)。
この文書の残りの部分では、簡潔にするために sh:prefixes 文を省略している場合があります。
SHACL-SPARQLは、SPARQL SELECTクエリに基づく制限を表現するために使用できる 制約コンポーネントを サポートします。
制約コンポーネントIRI: sh:SPARQLConstraintComponent
| プロパティ | 概要 |
|---|---|
sh:sparql |
評価するSPARQLクエリを宣言するSPARQLベースの 制約。 |
SPARQLベースの制約の構文規則および検証プロセスは、この節の以降の部分で定義します。
この節は非規範的です。
次の例は、SPARQLベースの 制約の構文を示しています。
{
"@graph": [
{
"@id": "ex:LanguageExampleShape",
"@type": "sh:NodeShape",
"sh:sparql": {
"@type": "sh:SPARQLConstraint",
"sh:message": "Values are literals with German language tag.",
"sh:prefixes": {
"@id": "http://example.com/ns#"
},
"sh:select": "\n\t\t\tSELECT $this (ex:germanLabel AS ?path) ?value\n\t\t\tWHERE {\n\t\t\t\t$this ex:germanLabel ?value .\n\t\t\t\tFILTER (!isLiteral(?value) || !langMatches(lang(?value), \"de\"))\n\t\t\t}\n\t\t\t"
},
"sh:targetClass": {
"@id": "ex:Country"
}
},
{
"@id": "http://example.com/ns#",
"sh:declare": {
"@id": "_:b1"
}
}
]
}
上記のシェイプのターゲットには、ex:CountryのすべてのSHACLインスタンスが
含まれます。
SPARQLクエリは、それらのノード(変数thisによって表されます)について、
ex:germanLabelの値をたどり、
それらがドイツ語の言語コードを持つリテラルであることを検証します。
{
"@graph": [
{
"@id": "ex:InvalidCountry",
"@type": "ex:Country",
"ex:germanLabel": {
"@language": "en",
"@value": "Spain"
}
},
{
"@id": "ex:ValidCountry",
"@type": "ex:Country",
"ex:germanLabel": {
"@language": "de",
"@value": "Spanien"
}
}
]
}
{
"@type": "sh:ValidationReport",
"sh:conforms": {
"@type": "xsd:boolean",
"@value": "false"
},
"sh:result": {
"@type": "sh:ValidationResult",
"sh:focusNode": {
"@id": "ex:InvalidCountry"
},
"sh:resultPath": {
"@id": "ex:germanLabel"
},
"sh:resultSeverity": {
"@id": "sh:Violation"
},
"sh:sourceConstraintComponent": {
"@id": "sh:SPARQLConstraintComponent"
},
"sh:sourceShape": {
"@id": "ex:LanguageExampleShape"
},
"sh:value": {
"@language": "en",
"@value": "Spain"
}
}
}
SPARQLクエリは、制約に違反する変数valueのすべての束縛について、
結果集合の解を返します。
後述するマッピング規則を適用し、
その結果集合内の各解に対して1つの検証結果があります。
この例では、各検証結果は、変数
thisの束縛をsh:focusNodeとして、
ex:germanLabelをsh:resultPathとして、違反する値を
sh:valueとして持ちます。
次の例は、上記と同様のシナリオをプロパティシェイプで示します。
{
"@graph": [
{
"@id": "ex:LanguageExamplePropertyShape",
"@type": "sh:PropertyShape",
"sh:path": {
"@id": "ex:germanLabel"
},
"sh:sparql": {
"@type": "sh:SPARQLConstraint",
"sh:message": "Values are literals with German language tag.",
"sh:prefixes": {
"@id": "http://example.com/ns#"
},
"sh:select": "\n\t\t\tSELECT $this ?value\n\t\t\tWHERE {\n\t\t\t\t$this $PATH ?value .\n\t\t\t\tFILTER (!isLiteral(?value) || !langMatches(lang(?value), \"de\"))\n\t\t\t}\n\t\t\t"
},
"sh:targetClass": {
"@id": "ex:Country"
}
},
{
"@id": "http://example.com/ns#",
"sh:declare": {
"@id": "_:b1"
}
}
]
}
シェイプはプロパティ
sh:sparqlの値を持つことができ、これらの値はIRIまたは空白ノードです。
これらの値は、SPARQLベースの制約と呼ばれます。
SPARQLベースの制約は、プロパティ
sh:selectの値を正確に1つ持ちます。
sh:selectの値は、データ型
xsd:stringのリテラルです。
クラスsh:SPARQLConstraintはSHACL語彙で定義されており、これらの制約の
型として
使用できます(ただし、型は必須ではありません)。
接頭辞処理規則を使用すると、sh:selectの値は
有効なSPARQL 1.2 SELECTクエリになります。
sh:selectの値から導出されるSPARQLクエリは、SELECT句で変数
thisを射影します。
次の2つのプロパティは、シェイプでの使用方法と同様です。
SPARQL ベースの
制約は、プロパティ sh:message の値を持つことができ、
これらはリテラルであり、そのデータ型は
xsd:string、rdf:dirLangString、rdf:langString、または
rdf:HTML です。
同じ言語タグを持つ sh:message の値が複数存在してはならず、
データ型が xsd:string の値も複数存在すべきではありません。
SPARQL ベースの
制約は、プロパティ sh:deactivated の値を最大 1 つ持つことができます
が、この値はノード式であり、
シェイプの場合と同様に、(唯一の)出力ノードとして
true または false を持たなければなりません。
SPARQL ベースの制約は、プロパティ
sh:severity の値を最大 1 つ持つことができ、
この値はIRIです。
プロパティシェイプのコンテキストで使用される SELECT
クエリーは、
PATH という名前の特別な変数を、シェイプが使用するパスのプレースホルダーとして使用します。
SPARQL
ベースの制約および
SPARQL ベースの制約の SPARQL クエリーにおいて、
SELECT ベースのバリデーターで変数 PATH を使用できるのは、
述語の
トリプルパターン内の位置のみです。
変数 PATH を他の位置で使用するクエリーは非整形式です。
変数 PATH は、プロパティシェイプの場合にのみ置換されます。
ノードシェイプの SPARQL
クエリーでは、
バインドされていない変数のままです。
この節では、sh:SPARQLConstraintComponent のバリデーターについて説明します。
このバリデーターは、考えられる実装戦略の 1 つを示すにすぎず、
SHACL プロセッサーは、結果が同等である限り、別の方法を選択できることに注意してください。
$sparql を sh:sparql の値とします。
$sparql がプロパティ sh:deactivated に対して値 expr を持ち、
かつ
evalExpr(expr, データグラフ, フォーカスノード, {})
が唯一の出力ノードとして
true を生成する場合、
その制約は無効化され、検証結果はありません。
それ以外の場合は、SPARQL ベースの制約 $sparql で指定された SPARQL
クエリーを、
3.3.1 SPARQL 制約における
事前バインドされた変数 $thisで説明されているように、変数 this を事前バインドして実行します。
シェイプが
プロパティ
シェイプである場合、実行前に
置換します。これは、変数 PATH が述語の
位置に現れるトリプルパターンにおいて、
sh:path で指定されたSHACL プロパティパスの
有効な SPARQL 表層構文文字列を使用するものであり、このパスはプロパティシェイプで指定されます。
変数 failure の検証結果は、
true を解の変数 failure に対するバインディングとして持たない各解につき
1 つ生成されます。
これらの検証結果は、MUST、3.3.2 解のバインディング
から結果プロパティへのマッピングで説明されているプロパティ値を持たなければなりません。
$sparql が sh:severity の値を持つ場合、
検証結果は、MUST、
その値を唯一の sh:resultSeverity として持たなければなりません。
いずれかの失敗は、MUST、解のいずれかが
failure に対するバインディングとして true
を持つ場合、かつその場合に限り生成されなければなりません。
SPARQLベースの制約の
SPARQLクエリ、およびSPARQLベースの制約コンポーネントの
バリデーターが
処理されるとき、
SHACL-SPARQLプロセッサは、変数$thisの値を現在のフォーカスノードに
事前束縛します。
検証結果ノードの プロパティの値は、結果の解と制約自体の値を 組み合わせて、次の規則によって導出されます。 規則は上から下へ実行され、最初に束縛された値が使用されることを意図しています。
| プロパティ | 生成規則 |
|---|---|
sh:focusNode |
|
sh:resultPath |
|
sh:value |
|
sh:resultMessage |
これらのメッセージリテラルには、
{?varName}または
{$varName}を介して任意のSELECT結果変数の名前を含めることができます。
制約がSPARQLベースの制約
コンポーネントに基づく場合、コンポーネントのパラメーター名も使用できます。
これらの{?varName}および{$varName}ブロックは、
それらの変数の値を表す適切な文字列表現に置き換える
べきである。
|
sh:sourceConstraint |
|
変数 failure は予約されており、結果プロパティにはマッピングされません。
上記で定義されているように、failure の解が
true
を failure のバインディングとして持つ場合、失敗が生成され、
検証結果は生成されません。
SPARQLベースの制約は高い柔軟性を提供しますが、 人によっては理解しにくかったり、繰り返しにつながったりする可能性があります。 この節では、SPARQLの複雑さを抽象化し、Core制約コンポーネントに類似した 高水準で再利用可能なコンポーネントを宣言する方法として、SPARQLベースの制約 コンポーネントを導入します。 このような制約コンポーネントは、SHACL RDF語彙を使用して宣言できるため、共有および再利用できます。
この節は非規範的です。
次の例は、SHACL-SPARQL言語を使用して新しい制約コンポーネントを指定するために、
SPARQLをどのように使用できるかを示しています。
この例では、各値ノードが指定された正規表現に
一致することを検証するために、sh:patternおよび
sh:flagsを
SPARQL ASKクエリを使用して実装します。
これは実装例にすぎず、規範的なものと見なすべきではないことに注意してください。
{
"@graph": [
{
"@id": "ex:hasPattern",
"@type": "sh:SPARQLAskValidator",
"sh:ask": "\n\t\tASK {\n\t\t\tFILTER (!isBlank($value) &&\n\t\t\t\tIF(bound($flags), regex(str($value), $pattern, $flags), regex(str($value), $pattern)))\n\t\t}",
"sh:message": "値がパターン {$pattern} に一致しません"
},
{
"@id": "sh:PatternConstraintComponent",
"@type": "sh:ConstraintComponent",
"sh:parameter": [
{
"sh:path": {
"@id": "sh:pattern"
}
},
{
"sh:optional": {
"@type": "xsd:boolean",
"@value": "true"
},
"sh:path": {
"@id": "sh:flags"
}
}
],
"sh:validator": {
"@id": "ex:hasPattern"
}
}
]
}
制約コンポーネントを宣言すると、次の例に示すように、そのパラメーターをシェイプで使用できます。
{
"@id": "ex:CaseInsensitiveSearch",
"@type": "sh:NodeShape",
"sh:property": {
"sh:flags": "i",
"sh:path": {
"@id": "ex:code"
},
"sh:pattern": "^[A-Z]{3}[0-9]{2}$"
}
}
制約コンポーネントは、シェイプ内の制約を
識別して検証する方法を、検証エンジンに指示します。
一般に、シェイプ
Sがプロパティpの値を持ち、
pをパラメーターとして指定する制約コンポーネント
Cが存在し、SがCのすべての必須
パラメーターの値を持つ場合、
これらのパラメーター値の集合(任意選択のパラメーターを含む)は
制約を宣言し、
検証エンジンはCの適切なバリデーターを使用して
この制約の検証を実行します。
上記の例では、sh:PatternConstraintComponentは必須パラメーター
sh:pattern、
任意選択のパラメーターsh:flags、
およびノードシェイプまたはプロパティシェイプの
いずれかに対する検証の実行に使用できるバリデーターを宣言します。
SPARQLベースの制約コンポーネントは、
シェイプ
グラフにおいてSHACL型
sh:ConstraintComponentを持つIRIです。
この文書で新しい制約コンポーネントを 宣言する仕組みは、SPARQLに基づくものに限定されています。 ただし、パラメーターおよびバリデーターを宣言するための一般構文は、 JavaScriptなどの他の拡張言語でも機能するように設計されています。
制約
コンポーネントのパラメーターは、
プロパティsh:parameterを介して宣言されます。
sh:parameterの値は、パラメーター宣言と呼ばれます。
クラスsh:Parameterは、パラメーター宣言の型として使用できますが、
そのようなトリプルは必須ではありません。
各
パラメーター宣言は、プロパティ
sh:pathの値を正確に1つ持ちます。
パラメーター宣言において、
sh:pathの値はIRIです。
IRIの
ローカル名は、IRIの末尾にある最長の
NCNAMEであり、
IRI内の
最初のコロンがその直前にないものとして定義されます。
パラメーター宣言の
パラメーター名は、sh:pathの値のローカル名として定義されます。
パラメーターからSPARQL変数への正しいマッピングを可能にするため、次の構文規則が適用されます。
すべてのパラメーター名は、有効なSPARQL VARNAMEです。
パラメーター名は、次のいずれでもあってはなりません。
this、path、PATH、value、
message、failure。
2 つ以上のパラメーター宣言が
同じパラメーター名を使用する制約
コンポーネントは非整形式です。
sh:optionalの値は、データ型xsd:booleanを持つ
リテラルでなければなりません。
パラメーター宣言は、プロパティ
sh:optionalの値を最大1つ持つことができます。
trueに設定されている場合、パラメーター宣言は任意選択のパラメーターを
宣言します。
すべての制約コンポーネントは、
任意選択ではないパラメーターを少なくとも1つ持ちます。
クラスsh:Parameterは、sh:PropertyShapeのSHACLサブクラスとして
定義されており、プロパティシェイプに適用可能なすべてのプロパティをパラメーターにも
使用できます。
これには、sh:nameやsh:descriptionなどの記述プロパティだけでなく、
sh:classなどの制約パラメーターも含まれます。
パラメーターに
対して宣言された制約に適合しないシェイプは、非整形式です。
一部の実装は、無効なパラメーター値を持つ制約コンポーネントの実行を防ぐために、
これらの制約パラメーターを使用してもよい。
プロパティ sh:labelTemplate は、任意の制約コンポーネントで、
制約を人間向けにどのように表示するかを
提案するために使用できます。
sh:labelTemplate の値は、データ型がリテラルである
xsd:string、rdf:langString、または rdf:dirLangString
です。
これらは
ラベルテンプレートと呼ばれます。
この節の残りは非規範的です。
ラベルテンプレートには、制約コンポーネントに対して
宣言されたパラメーターの名前を、{?varName}または{$varName}という
構文を使用して含めることができます。ここで、varNameはパラメーター名です。
表示時に、これらの{?varName}および{$varName}ブロックは、
実際のパラメーター値に置き換えるべきです。
同じ主語に対して複数のラベルテンプレートが存在する場合がありますが、
同じ言語タグを持つべきではなく、データ型xsd:stringを持つテンプレートが
複数あってはなりません。
サポートされる各シェイプ型(すなわち、プロパティシェイプまたはノードシェイプ)について、 制約コンポーネントは適切なバリデーターを宣言します。 特定の制約について、次の規則を順番に使用して制約コンポーネントからバリデーターを選択します。
sh:nodeValidatorの値が存在すれば、そのいずれかを
使用します。sh:propertyValidatorの値が存在すれば、そのいずれかを使用します。
sh:validatorの値のいずれかを使用します。
適切なバリデーターが見つからない場合、SHACL-SPARQLプロセッサはその制約を無視します。
SHACL-SPARQLには、SPARQL SELECT(
sh:nodeValidatorおよびsh:propertyValidator用)または
SPARQL ASKクエリ(sh:validator用)に
基づく2種類のバリデーターが含まれています。
バリデーターのうち、
SHACL
型が sh:SPARQLSelectValidator であるものをSELECT ベースのバリデーターと呼びます。
sh:nodeValidator の値は、SELECT
ベースのバリデーターでなければなりません。
sh:propertyValidator の値は、SELECT ベースのバリデーターでなければなりません。
SELECT ベースのバリデーターは、
プロパティ sh:select に対してちょうど 1 つの値を
持ちます。
sh:select の値は、
データ型が xsd:string のリテラルです。
接頭辞の処理規則を使用すると、sh:select の値は
有効な SPARQL 1.2 SELECT クエリーになります。
sh:select の値から導出された SPARQL クエリーは、SELECT 句で変数
this を射影します。
この節の残りは非規範的です。
次の例は、SPARQL SELECT クエリに基づく制約コンポーネントの宣言を示しています。
これは、3.1 SPARQL
に基づく制約の例の例を一般化したものです。
その SPARQL クエリには、特定のプロパティ
ex:germanLabel と言語タグ de という2つの定数が含まれていましたが、
この例では、任意のプロパティを言語タグ付きで定義できるように制約を一般化しています。
実際には、制約コンポーネントは、
パラメータ述語をシェイプに追加することで適用され(例: ex:lang "de")、SHACL-SPARQL
プロセッサは、SELECT バリデータを実行する前に、これを対応する SPARQL
変数(例: $lang)に事前バインドします。
制約コンポーネントを使用すると、このようなシナリオを一般化し、定数が事前バインドされる際にパラメータを使用できます。
これにより、新しい SPARQL を記述することなく、複数の場所でクエリロジックを再利用できます。
{
"@id": "ex:LanguageConstraintComponentUsingSELECT",
"@type": "sh:ConstraintComponent",
"rdfs:label": "言語制約コンポーネント",
"sh:labelTemplate": "値は言語 \"{$lang}\" のリテラルです",
"sh:parameter": {
"sh:datatype": {
"@id": "xsd:string"
},
"sh:description": "言語タグ(例: \"de\")。",
"sh:minLength": {
"@type": "xsd:integer",
"@value": "2"
},
"sh:name": "言語",
"sh:path": {
"@id": "ex:lang"
}
},
"sh:propertyValidator": {
"@type": "sh:SPARQLSelectValidator",
"sh:message": "値は言語 \"{?lang}\" のリテラルです",
"sh:select": "\n\t\t\tSELECT DISTINCT $this ?value\n\t\t\tWHERE {\n\t\t\t\t$this $PATH ?value .\n\t\t\t\tFILTER (!isLiteral(?value) || !langMatches(lang(?value), $lang))\n\t\t\t}\n\t\t\t"
}
}
制約コンポーネントを(シェイプグラフ内で)宣言すると、その
パラメータを次の例に示すように使用できます。ex:lang を含むすべてのプロパティシェイプは、
ex:LanguageConstraintComponentUsingSELECT を使用するものとして解釈されます($lang をその
値にバインドします)。
{
"@id": "ex:LanguageExampleShape",
"@type": "sh:NodeShape",
"sh:property": [
{
"ex:lang": "de",
"sh:path": {
"@id": "ex:germanLabel"
}
},
{
"ex:lang": "en",
"sh:path": {
"@id": "ex:englishLabel"
}
}
],
"sh:targetClass": {
"@id": "ex:Country"
}
}
上記のシェイプ例は、ex:germanLabel のすべての値が
言語タグ de を持ち、
ex:englishLabel のすべての値が言語として en を持つという条件を指定しています。
これらの詳細は、制約コンポーネントで必須とされる
ex:lang パラメータの値を持つ2つのプロパティシェイプによって指定されています。
多くの制約コンポーネントでは、すべての値ノードを 何らかのブール条件に対して個別にテストします。 特に、制約コンポーネントをプロパティシェイプとノード シェイプの両方で使用できる場合、このためのSELECTクエリの記述は煩雑になります。 SHACL-SPARQLは、ASKクエリに基づくバリデーター用に、より簡潔な代替構文を提供します。
SHACL
型sh:SPARQLAskValidatorを持つバリデーターは、
ASKベースのバリデーターと
呼ばれます。
sh:validatorの値は、ASKベースのバリデーターで
なければなりません。
ASKベースのバリデーターは、プロパティ
sh:askの値を正確に1つ持ちます。
sh:askの値は、データ型xsd:stringを持つリテラルで
なければなりません。
sh:askの値は、前述の接頭辞
処理規則を使用する有効なSPARQL ASKクエリでなければなりません。
この節の残りは非規範的です。
ASKクエリは、指定された値ノード
(事前束縛された変数valueによって表されます)が制約に適合する場合、
かつその場合に限りtrueを返します。
次の例は、ASKクエリを使用して制約コンポーネントを宣言します。
{
"@graph": [
{
"@id": "ex:hasLang",
"@type": "sh:SPARQLAskValidator",
"sh:ask": "\n\t\tASK {\n\t\t\tFILTER (isLiteral($value) && langMatches(lang($value), $lang))\n\t\t}\n\t\t",
"sh:message": "Values are literals with language \"{$lang}\""
},
{
"@id": "ex:LanguageConstraintComponentUsingASK",
"@type": "sh:ConstraintComponent",
"rdfs:label": "Language constraint component",
"sh:labelTemplate": "Values are literals with language \"{$lang}\"",
"sh:parameter": {
"sh:datatype": {
"@id": "xsd:string"
},
"sh:description": "The language tag, e.g. \"de\".",
"sh:minLength": {
"@type": "xsd:integer",
"@value": "2"
},
"sh:name": "language",
"sh:path": {
"@id": "ex:lang"
}
},
"sh:validator": {
"@id": "ex:hasLang"
}
}
]
}
ASKクエリによって実装される検証条件は、対応するSELECTクエリとは
「逆方向」であることに注意してください。
ASKクエリは制約に適合する値ノードに対してtrueを返す一方、
SELECTクエリは適合しない値ノードを返します。
この節では、SPARQL ベースの制約コンポーネントのバリデーターを定義します。 このバリデーターは、考えられる実装戦略の 1 つを説明するにすぎず、 SHACL プロセッサーは、結果が同等である限り、別の方法を選択できます。
最初のステップとして、バリデーターを、MUST の要件に従い、以下に示す規則に基づいて選択しなければなりません。 4.2.3 バリデーター。 次に、以下の規則を適用し、SPARQL クエリーの解の集合を生成します。
false を返す各値
ノード v について、
v が変数 value に事前バインドされている場合、
バインディングからなる 1 つの解を作成します。
($this, フォーカスノード) および
($value, v) です。
QS をこれらの解のリストとします。
PATH を置換します。
トリプルパターンの
述語位置に、有効な SPARQL 表層構文文字列として表現されたSHACL プロパティパスを使用します。
このパスは、sh:path を介してプロパティシェイプで指定されます。
QS を SPARQL クエリーの実行によって生成された解とします。
上記の SPARQL クエリーの実行では、変数 this を事前バインドしなければなりません(MUST)。
その方法は、3.3.1 SPARQL
制約における事前バインドされた変数 $thisで説明されています。
さらに、制約における
制約コンポーネントの
各パラメーターの
値は、
パラメーター名を名前とする変数として、
MUST 事前バインドされなければなりません。
検証結果の生成規則は、
SPARQL ベースの制約の生成規則と同一であり、
上記で生成された解 QS を使用します。
この節では、一般的な仕組みを拡張し、 SPARQL ベースの制約または 制約コンポーネントを使用して検証結果を生成します。
この機能のサポートは、SHACL-SPARQL 検証プロセッサーでは任意(OPTIONAL)です。1.3 適合性を参照してください。
この機能をサポートするプロセッサーでは、注釈プロパティを、
SPARQL ベースの制約または制約コンポーネントの
SELECT クエリーによって生成された各解に対して作成される検証
結果ノードに追加できます。
このような注釈プロパティは、sh:select または sh:ask のトリプルの
主語において、
sh:resultAnnotation の値を介して宣言する必要があります。
sh:resultAnnotation の値は、
結果注釈と呼ばれ、IRIまたは空白
ノードです。
結果注釈には、次のプロパティがあります。
| プロパティ | 概要と構文規則 |
|---|---|
sh:annotationProperty |
設定するプロパティ。
各結果注釈は、
プロパティ sh:annotationProperty に対してちょうど 1 つの値を持ち、
その値はIRIです。
|
sh:annotationVarName |
注釈値の取得元となる SPARQL 変数の名前。
各結果注釈は、
プロパティ sh:annotationVarName に対して最大 1 つの値を持ち、
この値は、
データ型が
xsd:string のリテラルです。
|
sh:annotationValue |
デフォルト値として使用する定数のRDF 用語。 |
SELECT 結果集合の各解について、注釈をサポートする SHACL プロセッサーは、
宣言された結果注釈を
順に処理します。
結果注釈から SPARQL 変数へのマッピングには、次の規則を使用します。
変数名を決定できた場合、SHACL プロセッサーは、指定された変数のバインディングを、
sh:annotationProperty を使用して指定されたプロパティの値として、
現在の解に対して生成中の検証
結果にコピーします。
結果集合の解において、変数にバインディングがない場合は、
sh:annotationValue の値が存在すれば、それを使用します。
{
"@id": "ex:AnnotationExample",
"@type": "sh:NodeShape",
"sh:sparql": {
"sh:resultAnnotation": {
"sh:annotationProperty": {
"@id": "ex:time"
},
"sh:annotationVarName": "time"
},
"sh:select": "\n\t\t\tSELECT $this ?message ?time\n\t\t\tWHERE {\n\t\t\t\tBIND (CONCAT(\"The \", \"message.\") AS ?message) .\n\t\t\t\tBIND (NOW() AS ?time) .\n\t\t\t}\n\t\t\t"
},
"sh:targetNode": {
"@id": "ex:ExampleResource"
}
}
{
"@type": "sh:ValidationReport",
"sh:conforms": {
"@type": "xsd:boolean",
"@value": "false"
},
"sh:result": {
"@type": "sh:ValidationResult",
"ex:time": {
"@type": "xsd:dateTime",
"@value": "2015-03-27T10:58:00"
},
"sh:focusNode": {
"@id": "ex:ExampleResource"
},
"sh:resultMessage": "The message.",
"sh:resultSeverity": {
"@id": "sh:Violation"
},
"sh:sourceConstraint": {
"@id": "_:b1"
},
"sh:sourceConstraintComponent": {
"@id": "sh:SPARQLConstraintComponent"
},
"sh:sourceShape": {
"@id": "ex:AnnotationExample"
}
}
}
この節では、SPARQL に基づくノード式関数を 紹介します。
この節のノード式関数には、完全な SPARQL クエリーまたは SPARQL 式が埋め込まれています。
sparql:concat などの個別の SPARQL 関数に対応するノード式関数は、
SPARQL クエリーを使用せずに評価され、次の仕様で定義されています。
SHACL 1.2 ノード式。
ノード
式のうち、キーパラメーター
sh:select の値を持つものを、
関数名
sh:SelectExpression を持つ選択式と呼びます。
RDF グラフ内の
ノードが整形式の選択式となるのは、そのノードが
空白ノードであり、
述語
sh:select に対して
ちょうど 1 つの値を持ち、
その値がデータ型
xsd:string のリテラルである場合です。
整形式の選択式は、
プロパティ sh:prefixes に対して最大 1 つの値を持つことができ、
その値はIRIまたは空白ノードに限られます。
接頭辞の処理
規則を使用すると、sh:select の値は有効な SPARQL 1.2 SELECT クエリーになります。
sh:select の値から導出された SPARQL クエリーは、SELECT 句で
ちょうど 1 つの変数を射影します。
選択式の出力
ノードは、リスト resultNodes であり、
クエリーがフォーカス
グラフに対して評価されたときに、SELECT 句から射影される
(唯一の)変数のバインディングのみで構成されます。
focusNode の値は、SPARQL 変数 this の値として
事前バインドされます。
スコープ内の各変数の値は、同じ名前と値を持つ SPARQL 変数として
事前バインドされます。
スコープ内の変数名が文字列リテラルでない場合は、"arg" + str(name) を使用します。
例えば、変数名が "0"^^xsd:integer の場合は、arg0 を使用します。
スコープ内の変数のいずれかが this という名前である場合、
またはこの方法で導出された変数名が有効な
SPARQL VARNAME でない場合、
失敗が生成されます。
evalExpr(expr, focusGraph, focusNode, scope) -> resultNodes
この節の残りの部分は非規範的です。
これは選択式の使用例であり、
プロパティ「フルネーム」のプロパティシェイプの値を、
ex:firstName、スペース、および
ex:lastName の連結として計算します。
{
"@graph": [
{
"@id": "ex:Person-fullName",
"@type": "sh:PropertyShape",
"sh:datatype": {
"@id": "xsd:string"
},
"sh:name": "full name",
"sh:path": {
"@id": "ex:fullName"
},
"sh:values": {
"sh:prefixes": {
"@id": "http://example.com/ns#"
},
"sh:select": "\n\t\t\tSELECT ?fullName\n\t\t\tWHERE {\n\t\t\t\t$this ex:firstName ?firstName .\n\t\t\t\t$this ex:lastName ?lastName .\n\t\t\t\tBIND (CONCAT(?firstName, \" \", ?lastName) AS ?fullName) .\n\t\t\t}\n\t\t"
}
},
{
"@id": "http://example.com/ns#",
"@type": "owl:Ontology",
"sh:declare": {
"sh:namespace": {
"@type": "xsd:anyURI",
"@value": "http://example.com/ns#"
},
"sh:prefix": "ex"
}
}
]
}
この例は、sh:prefixes を使用して、解析前にクエリーの先頭へ
PREFIX 宣言を挿入する方法も示しています。
クエリーは、現在のフォーカスノードを
変数 this に事前バインドして実行されることに注意してください。
これは選択式の使用例であり、
ex:age が 18 未満である
ex:Person のすべてのインスタンスを
シェイプのターゲットノードとして計算します。
{
"@id": "ex:ChildShape",
"@type": "sh:NodeShape",
"rdfs:comment": "This shape applies to all persons under 18 years of age.",
"rdfs:label": "Child shape",
"sh:targetNode": {
"sh:select": "\n\t\t\tPREFIX ex: <http://example.com/ns#>\n\t\t\tSELECT ?person\n\t\t\tWHERE {\n\t\t\t\t?person a/rdfs:subClassOf* ex:Person .\n\t\t\t\t?person ex:age ?age .\n\t\t\t\tFILTER (?age < 18) .\n\t\t\t}\n\t\t"
}
}
次のデータグラフでは、ex:Benjamin だけがターゲットノードです。
{
"@graph": [
{
"@id": "ex:Benjamin",
"@type": "ex:Person",
"ex:age": {
"@type": "xsd:integer",
"@value": "17"
}
},
{
"@id": "ex:Bernd",
"@type": "ex:Person"
},
{
"@id": "ex:Klaus",
"@type": "ex:Person",
"ex:age": {
"@type": "xsd:integer",
"@value": "48"
}
}
]
}
ノード
式のうち、キーパラメーター
sh:sparqlExpr の値を持つものを、
関数名
sh:SPARQLExprExpression を持つSPARQL expr 式と呼びます。
RDF グラフ内のノードが
整形式の SPARQL expr 式であるのは、それが 空白ノード
であり、値を 述語
sh:sparqlExpr に対してちょうど 1 つ持ち、
その値が
リテラル
であり、そのデータ型が
xsd:string である場合です。
整形式の SPARQL expr 式は、プロパティ
sh:prefixes に対して最大 1 つの値を持つことができ、
この値は IRI または 空白ノードです。
$EXPR$ を sh:sparqlExpr の値とし、
$PREFIXES$ を
sh:prefixes の値を使用する接頭辞処理規則から得られる SPARQL 接頭辞ブロックとします。
このとき、select は $EXPR$ と
$PREFIXES$ を次のように挿入した文字列として定義されます。
$PREFIXES$ SELECT ($EXPR$ AS ?result) WHERE {}
select は有効な SPARQL 1.2 SELECT
クエリです。
SPARQL expr 式の出力
ノードは、リスト
resultNodes であり、上記で
定義された select クエリーの SELECT 句から射影される
(唯一の)変数のバインディングのみで構成されます。
これは、クエリーがフォーカスグラフに対して評価される場合です。
focusNode の値は、SPARQL
変数 this の値として事前バインドされます。
スコープ内の各変数の値は、同じ名前と値を持つ SPARQL 変数として事前バインドされます。
スコープ内の変数名が文字列リテラルでない場合は、"arg" + str(name) を使用します。
例えば、変数名が "0"^^xsd:integer の場合は、arg0 を使用します。
スコープ内の変数のいずれかが this という名前である場合、
またはこの方法で導出された変数名が有効なSPARQL VARNAME
でない場合、
失敗が生成されます。
evalExpr(expr, focusGraph, focusNode, scope) -> resultNodes
このセクションの残りは非規範的です。
これは、フォーカスノードの IRI の長さとして、プロパティ "uri length" の プロパティシェイプの値を計算する、 SPARQL expr 式の 使用例です。
{
"@id": "ex:Resource-uriLength",
"@type": "sh:PropertyShape",
"sh:datatype": {
"@id": "xsd:integer"
},
"sh:name": "uri length",
"sh:path": {
"@id": "ex:uriLength"
},
"sh:values": {
"sh:sparqlExpr": "STRLEN(STR($this))"
}
}
URI http://example.com/ns#Test を持つフォーカスノードに適用された場合、結果は
26 になります。
これは次の変形と同じ結果を生成します:
{
"@id": "ex:Resource-uriLength",
"@type": "sh:PropertyShape",
"sh:datatype": {
"@id": "xsd:integer"
},
"sh:name": "uri length",
"sh:path": {
"@id": "ex:uriLength"
},
"sh:values": {
"sh:select": "\n\t\t\tSELECT (STRLEN(STR($this)) AS ?result)\n\t\t\tWHERE {\n\t\t\t}\n\t\t"
}
}
SHACL 1.2 ノード式は、新しいノード式関数を宣言する仕組みとしてカスタムリストパラメーター 関数を定義しています。 これらは他の SHACL ノード式の一部として評価できますが、関数形式の実行をサポートする他のエンジンでも 役立つ場合があります。
SPARQL 仕様は、特定の SPARQL エンジンが追加の SPARQL 関数を提供できるようにする拡張ポイントを定義しています。 この節では、SPARQL プロセッサーがこの拡張ポイントを使用して SHACL リストパラメーター 関数を SPARQL 関数として利用可能にするための宣言的な仕組みを紹介します。
この関数は、クラスを(唯一の)パラメーターとして受け取り、その クラスのインスタンス数を返します。
{
"@id": "ex:instanceCount",
"@type": "sh:ListParameterExpressionFunction",
"rdfs:label": {
"@language": "en",
"@value": "instance count"
},
"rdfs:subClassOf": {
"@id": "sh:ListParameterExpression"
},
"sh:bodyExpression": {
"shnex:count": {
"shnex:instancesOf": {
"shnex:arg": {
"@type": "xsd:integer",
"@value": "0"
}
}
}
},
"sh:parameter": {
"@type": "sh:Parameter",
"sh:description": "The class to count the instances of.",
"sh:name": "class",
"sh:nodeKind": {
"@id": "sh:IRI"
},
"sh:path": {
"@id": "shnex:arg0"
}
}
}
ノード式に基づく SPARQL 関数をサポートする SPARQL エンジンは、 次のような SPARQL クエリーを処理できます。
SELECT ?class ?count
WHERE {
?class a owl:Class .
BIND (ex:instanceCount(?class) AS ?count) .
}
以下のカスタムリストパラメーター関数は、評価時に「入れ子になった」SPARQL クエリーを使用します。
この関数は 2 つのパラメーターを受け取り、SPARQL expr
式を本体式として使用します。
その SPARQL 式では、変数 $arg0 と $arg1 を使用して、
リストパラメーターの値にアクセスします。
これは、SPARQL 式の代わりに sparql:concat ノード式関数を使用する
[shacl12-node-expr] の
ex:spacedConcat の例の変種です。
{
"@id": "ex:spacedConcat",
"@type": "sh:ListParameterExpressionFunction",
"rdfs:label": {
"@language": "en",
"@value": "spaced concat"
},
"rdfs:subClassOf": {
"@id": "sh:ListParameterExpression"
},
"sh:bodyExpression": {
"sh:sparqlExpr": "CONCAT($arg0, ' ', $arg1)"
},
"sh:parameter": [
{
"@type": "sh:Parameter",
"sh:datatype": {
"@id": "xsd:string"
},
"sh:description": "The first string to concatenate.",
"sh:name": "first string",
"sh:path": {
"@id": "shnex:arg0"
}
},
{
"@type": "sh:Parameter",
"sh:datatype": {
"@id": "xsd:string"
},
"sh:description": "The second string to concatenate.",
"sh:name": "second string",
"sh:path": {
"@id": "shnex:arg1"
}
}
]
}
ノード式に基づく SPARQL 関数をサポートする SPARQL エンジンは、 次のような SPARQL クエリーを処理できます。
SELECT ?person ?fullName
WHERE {
?person a ex:Person .
?person ex:firstName ?firstName .
?person ex:lastName ?lastName .
BIND (ex:spacedConcat(?firstName, ?lastName) AS ?fullName) .
}
次の例では、sh:select ノード式を本体として使用します。
この関数は 2 つのパラメーターを受け取り、そのうち 2 番目は任意であり、
選択式を本体式として使用します。
その SPARQL クエリーでは、変数 $arg0 と $arg1 を使用して
リストパラメーターの値にアクセスします。
{
"@id": "ex:langLabelCount",
"@type": "sh:ListParameterExpressionFunction",
"rdfs:label": {
"@language": "en",
"@value": "lang label count"
},
"rdfs:subClassOf": {
"@id": "sh:ListParameterExpression"
},
"sh:bodyExpression": {
"sh:select": "\n\t\t\tPREFIX ex: <http://example.com/ns#>\n\t\t\tPREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n\t\t\tSELECT (COUNT(?label) AS ?result)\n\t\t\tWHERE {\n\t\t\t\t?predicate rdfs:subPropertyOf* rdfs:label .\n\t\t\t\t$arg0 ?predicate ?label .\n\t\t\t\tBIND (COALESCE($arg1, 'en') AS ?matchLang) .\n\t\t\t\tFILTER langMatches(lang(?label), ?matchLang) .\n\t\t\t}\n\t\t"
},
"sh:parameter": [
{
"@type": "sh:Parameter",
"sh:description": "The subject node to get the label count of.",
"sh:name": "subject",
"sh:nodeKind": {
"@id": "sh:IRI"
},
"sh:path": {
"@id": "shnex:arg0"
}
},
{
"@type": "sh:Parameter",
"sh:datatype": {
"@id": "xsd:string"
},
"sh:defaultValue": "en",
"sh:description": "The language to filter, defaulting to 'en'.",
"sh:name": "match language",
"sh:optional": {
"@type": "xsd:boolean",
"@value": "true"
},
"sh:path": {
"@id": "shnex:arg1"
}
}
]
}
この関数は、sh:optional true トリプルを使用して宣言された
照合言語の任意のパラメーターを受け取ります。
ただし、sh:parameter 宣言による SHACL 制約は
自動的には適用されず、宣言された sh:defaultValue も実行時には使用されません。
sh:optional は引数のエラー処理方法を決定しますが
(7.3 カスタム SPARQL 関数の
評価を参照)、それ以外の宣言は文書化を目的としています。
{
"@id": "ex:Cougar",
"rdfs:label": [
{
"@language": "en",
"@value": "Cougar"
},
{
"@language": "en-US",
"@value": "Mountain Lion"
},
{
"@language": "de",
"@value": "Puma"
}
]
}
この文書では、このようなカスタム SPARQL 関数を追加する方法やタイミングについて、厳密な制約を定義していません。
SPARQL エンジンは、提供された任意のシェイプグラフ内の
sh:ListParameterExpressionFunction の各SHACL
インスタンスに対して関数を登録することが推奨されます(SHOULD)。
同じIRIを持つ関数が、組み込み関数または
その他の非カスタム関数としてすでに登録されている場合、
SPARQL エンジンは再定義の試みを無視しなければなりません(MUST)。
登録済みの関数自体が、以前に提供されたシェイプグラフなどに由来する
カスタム SPARQL 関数である場合、新しい宣言がそれを置き換えます。
SPARQL エンジンは、SPARQL クエリーの実行中に登録済みの
SPARQL 関数を変更してはなりません(MUST NOT)。
f を SPARQL 関数呼び出しの
iri、
args を Expression 引数のリストとします。
function を、対応するカスタムリストパラメーター関数とします。この関数は、
グラフ内で
定義され、f をそのIRIとして持ちます。
args 内の各 SPARQL 式を評価し、新しいノードのリスト
nodesList を生成します。
評価によってエラーが
発生した場合、SPARQL 関数呼び出しの結果もエラーになります。
ただし、対応する引数の sh:parameter に
sh:optional true が指定されている場合は例外です。
その場合、引数はスコープ内でバインドされません。
空白
ノードは引数として渡せないことに注意してください。これらは定数ノード式ではないため、
空白ノードに評価される引数は評価失敗を引き起こし、
したがってエラーになります。
rs を evalExpr(function, focusGraph, f, scope) の出力ノードとします。
ここで、focusGraph は SPARQL コンテキストで現在有効なクエリーグラフであり、
scope は nodesList の評価済み引数を、引数のインデックスを
変数名(マップのキー)として対応付けたマップです。
出力ノードのリスト rs に要素がちょうど 1 つある場合、そのノードを返します。
それ以外の場合、または評価によって評価失敗が発生した場合、
SPARQL 関数呼び出しの結果はエラーになります。
SHACL-SPARQL の一部の機能は、この節で定義する変数の事前バインドという概念に依存します。
この機能は「リスクあり」とされており、この分野で現在進行中の RDF および SPARQL 1.2 の作業に 合わせて変更される可能性があります(削除はされません)。 当初は課題 647として議論されました。
SHACL で使用される事前バインドの定義では、SPARQL クエリーに次の制限が必要です。
SHACL-SPARQL プロセッサーは、事前バインドされた変数を使用して実行される
SHACL-SPARQL クエリー(sh:ask、sh:construct、
sh:select および sh:sparqlExpr を介したもの)を含む
シェイプグラフを処理する際、
これらの「MUST」制限のいずれかに違反する場合は、失敗を報告しなければなりません。
「事前バインドされる可能性のある変数」という用語には、変数 this、
value(ASK クエリーの場合)、
クエリーを使用する制約
コンポーネントのパラメーターを表す任意の変数、
およびSPARQL ベースの
ノード式のスコープ変数を表す変数
(arg0 など)が含まれることに注意してください。
MINUS 句を含めてはなりません(MUST)。VALUES 句を
含めてはなりません(MUST)。AS ?var という構文形式を使用してはなりません(MUST)。
さらに、SPARQL クエリーには連合クエリー
(SERVICE)を含めるべきではありません(SHOULD)。
SERVICE を許可しない実装は、上記のように失敗を
報告しなければなりません(MUST)。
ただし、一部の SPARQL 実装では、SERVICE キーワードを
特定の(通常はローカルな)操作の構文として使用していることが認識されているため、
このキーワードは一般的には禁止されていません。
解マッピング μ に対して、Table(μ) を
μ から形成される多重集合と定義します。
Table(μ) = { μ }
Card[μ] = 1
値の挿入関数 Replace(X, μ) を、
X 内の
基本グラフ
パターン、
プロパティパス
式、
Graph(Var, pattern)
の各出現箇所 Y を join(Y, Table(μ)) に置換するものとして定義します。
事前バインドされた変数 μ を持つSPARQL クエリー
Q = (E, DS, QF) の評価は、SPARQL クエリー Q' = (Replace(E, μ), DS, QF) の
評価として定義されます。
この節では、この文書のすべての規範的な構文規則を列挙します。 この節は、この仕様の他の部分から自動的に生成されており、規則の文脈が不明確な場合に本文へ戻れるよう ハイパーリンクが提供されています。 シェイプグラフ内でこれらの規則に違反するノードは不正形式です。
| 構文規則 ID | 構文規則のテキスト |
|---|---|
| prefix-count | 接頭辞宣言は、プロパティ
sh:prefix に対してちょうど 1 つの値を持ちます。
|
| prefix-datatype | sh:prefix の値は、データ型がリテラルである
xsd:string です。
|
| namespace-count | 接頭辞宣言は、プロパティ
sh:namespace に対してちょうど 1 つの値を持ちます。
|
| namespace-datatype | sh:namespace の値は、データ型がリテラルである
xsd:anyURI または xsd:string です。
|
| declare-nodeKind | プロパティ sh:declare の値は、
接頭辞宣言です。
|
| prefixes-nodeKind | sh:prefixes の値は、IRI または空白ノードです。 |
| prefixes-duplicates | このような接頭辞宣言の集合に、同じ sh:prefix の値に対して
複数の異なる名前空間が含まれる場合、
シェイプ
グラフは非整形式です。
|
| sparql-nodeKind | シェイプはプロパティ sh:sparql の値を持つことができ、その値はIRI または空白
ノードです。 |
| SPARQLConstraint-select-count | SPARQL ベースの制約は、プロパティ
sh:select に対してちょうど 1 つの値を持ちます。
|
| SPARQLConstraint-select-datatype | sh:select の値は、データ型がリテラルである
xsd:string です。
|
| select-query-valid | 接頭辞の処理規則を使用すると、sh:select の値は
有効な SPARQL 1.2 SELECT クエリーになります。 |
| select-query-this | sh:select の値から導出された SPARQL クエリーは、SELECT 句で変数
this を射影します。
|
| SPARQLConstraint-message-datatype | SPARQL ベースの制約は、プロパティ
sh:message の値を持つことができ、
これらはリテラルであり、そのデータ型は
xsd:string、rdf:dirLangString、rdf:langString、または
rdf:HTML です。
同じ言語タグを持つ sh:message の値が複数存在すべきではなく、
データ型が xsd:string の値も複数存在すべきではありません。
|
| SPARQLConstraint-deactivated-maxCount | SPARQL ベースの制約は、プロパティ
sh:deactivated の値を最大 1 つ持つことができます。
|
| SPARQLConstraint-severity | SPARQL ベースの制約は、プロパティ
sh:severity の値を最大 1 つ持つことができ、
この値はIRIです。
|
| PATH-position | SPARQL ベースの制約および
SELECT ベースのバリデーターの SPARQL クエリーで
変数 PATH を合法的に使用できるのは、
述語の
トリプルパターン内の位置のみです。
|
| ConstraintComponent | SPARQL ベースの制約コンポーネントは、
IRIであり、
シェイプグラフ内で
SHACL 型
sh:ConstraintComponent を持ちます。
|
| Parameter-predicate-count | 各パラメーター宣言は、プロパティ
sh:path に対してちょうど 1 つの値を持ちます。
|
| Parameter | パラメーター宣言では、sh:path の値は
IRIです。
|
| parameter-name-VARNAME | すべてのパラメーター名は、有効な SPARQL VARNAMEです。 |
| parameter-name-not-in | パラメーター名は、次のいずれでもあってはなりません。
this、path、PATH、value、message、
failure。
|
| parameter-name-unique | 2 つ以上のパラメーター宣言が 同じパラメーター名を使用する制約コンポーネントは、 非整形式です。 |
| optional-datatype | sh:optional の値は、データ型が xsd:boolean のリテラルでなければなりません。 |
| optional-maxCount | パラメーター宣言は、プロパティ
sh:optional の値を最大 1 つ持つことができます。
|
| ConstraintComponent-parameter | すべての制約コンポーネントは、 少なくとも 1 つの必須パラメーターを持ちます。 |
| Parameter-conformance | パラメーターに対して宣言された制約に適合しないシェイプは、 非整形式です。 |
| labelTemplate-datatype | sh:labelTemplate の値は、データ型が
xsd:string、rdf:langString、または rdf:dirLangString の
リテラルです。
|
| nodeValidator-class | sh:nodeValidator の値は、SELECT ベースの
バリデーターでなければなりません。 |
| propertyValidator-class | sh:propertyValidator の値は、SELECT ベースの
バリデーターでなければなりません。 |
| SPARQLSelectValidator-select-count | SELECT ベースのバリデーターは、プロパティ
sh:select に対してちょうど 1 つの値を持ちます。
|
| SPARQLSelectValidator-select-datatype | sh:select の値は、データ型がリテラルである
xsd:string です。
|
| SPARQLSelectValidator-select-query-valid | 接頭辞の処理規則を使用すると、sh:select の値は
有効な SPARQL 1.2 SELECT クエリーになります。 |
| SPARQLSelectValidator-select-query-this | sh:select の値から導出された SPARQL クエリーは、SELECT 句で変数
this を射影します。
|
| validator-class | sh:validator の値は、ASK ベースの
バリデーターでなければなりません。 |
| ask-count | ASK ベースのバリデーターは、プロパティ
sh:ask に対してちょうど 1 つの値を持ちます。
|
| ask-datatype | sh:ask の値は、データ型が xsd:string のリテラルでなければなりません。 |
| ask-sparql | sh:ask の値は、前述の接頭辞の処理規則を使用した有効な SPARQL ASK
クエリーでなければなりません。 |
| resultAnnotation-nodeKind | sh:resultAnnotation の値は、
結果注釈と呼ばれ、IRI または空白ノードです。
|
| annotationProperty | 各結果注釈は、プロパティ
sh:annotationProperty に対してちょうど 1 つの値を持ち、
その値はIRIです。
|
| annotationVarName | 各結果注釈は、プロパティ
sh:annotationVarName に対して最大 1 つの値を持ち、
その値は、
データ型が
xsd:string のリテラルです。
|
| SelectExpression-syntax | RDF グラフ内のノードが整形式の選択式となるのは、それが
空白ノードであり、
述語
sh:select に対して
ちょうど 1 つの値を持ち、
その値が
データ型
xsd:string のリテラルである場合です。
|
| SelectExpression-syntax-prefixes | 整形式の
選択式は、プロパティ
sh:prefixes に対して最大 1 つの値を持つことができ、
その値はIRI または空白ノードに限られます。
|
| SelectExpression-query-valid | 接頭辞の処理規則を使用すると、sh:select の値は
有効な SPARQL 1.2 SELECT クエリーになります。 |
| SelectExpression-query-output-nodes | sh:select の値から導出された SPARQL クエリーは、SELECT 句で
ちょうど 1 つの変数を射影します。
|
| SPARQLExprExpression-syntax-eval | RDF グラフ内のノードが
整形式の
SPARQL expr 式となるのは、それが
空白ノードであり、
述語
sh:sparqlExpr に対してちょうど 1 つの値を持ち、
その値が
データ型
xsd:string のリテラルである場合です。
|
| SPARQLExprExpression-syntax-prefixes | 整形式の
SPARQL expr 式は、プロパティ
sh:prefixes に対して最大 1 つの値を持つことができ、
その値はIRI または空白ノードです。
|
| SPARQLExprExpression-template | $EXPR$ を sh:sparqlExpr の値とし、
$PREFIXES$ を
sh:prefixes の値を使用した接頭辞の処理規則から得られる
SPARQL 接頭辞ブロックとします。
このとき、select は $EXPR$ と
$PREFIXES$ を次のように挿入した
文字列として定義されます。
$PREFIXES$ SELECT ($EXPR$ AS ?result) WHERE {} |
| SPARQLExprExpression-query-valid | select は有効な SPARQL 1.2 SELECT クエリーです。 |
| pre-binding-limitations |
SHACL で使用される事前バインドの定義では、SPARQL
クエリーに次の制限が必要です。
SHACL-SPARQL プロセッサーは、事前バインドされた変数を使用して実行される
SHACL-SPARQL クエリー(
さらに、SPARQL クエリーには連合クエリーを含めるべきではありません(SHOULD)。
( |
この節は非規範的です。
この付録では、制約 コンポーネントおよびターゲットの意味論について、 [shacl12-core] にある非規範的な代替定義で SPARQL 1.2 の一部を使用します。 これらは一部の実装者に役立つ場合がありますが、SHACL コア 言語の実装に SPARQL は必要ありません。
sh:targetClass および sh:class の定義では、
rdfs:subClassOf トリプルを
データグラフ内でのみ検索します。
プロセッサーパラメーター
subClassOfInShapesGraph
が設定されている場合は、
シェイプグラフの
rdfs:subClassOf トリプルも
考慮する必要があります。
$マーカーを使用するSPARQL変数は、外部の束縛を表し、これらは事前に束縛されるか、$PATHの場合には、置換される。これらの処理はSPARQLクエリの実行前に行われる(詳しくは3.3 次を用いた検証:
SPARQLベースの制約で説明されている)。
次のクエリは、クラスターゲットのSPARQLによる定義の候補を表す。
変数targetClassは、事前束縛され、その対象は指定された
sh:targetClassの値となる。
すべての束縛のうち、変数thisについて解から得られるものは、すべてフォーカスノードになる。
SELECT DISTINCT ?this # ?thisはフォーカスノード
WHERE {
?this rdf:type/rdfs:subClassOf* $targetClass .
}
次のクエリーは、SPARQL における主語ターゲットの定義候補を表します。
変数 targetSubjectsOf は、指定された
事前バインドによって
sh:targetSubjectsOf の値に結び付けられます。
バインディングのうち、解から得られる変数 this
のすべてがフォーカスノードになります。
SELECT DISTINCT ?this # ?thisはフォーカスノード
WHERE {
?this $targetSubjectsOf ?any .
}
次のクエリは、オブジェクトターゲットのSPARQLによる定義の候補を表す。
変数targetObjectsOfは、事前束縛され、その対象は指定された
sh:targetObjectsOfの値となる。
すべての束縛のうち、変数thisについて解から得られるものは、すべてフォーカスノードになる。
SELECT DISTINCT ?this # ?thisはフォーカスノード
WHERE {
?any $targetObjectsOf ?this .
}
次のクエリーは、sh:classの SPARQLベースの可能なバリデーターを表す。
ASK {
$value rdf:type/rdfs:subClassOf* $class .
}
次のクエリーは、sh:nodeKindの SPARQLベースの可能なバリデーターを表す。
ASK {
FILTER ((isIRI($value) && $nodeKind IN ( sh:IRI, sh:BlankNodeOrIRI, sh:IRIOrLiteral ) ) ||
(isLiteral($value) && $nodeKind IN ( sh:Literal, sh:BlankNodeOrLiteral, sh:IRIOrLiteral ) ) ||
(isBlank($value) && $nodeKind IN ( sh:BlankNode, sh:BlankNodeOrIRI, sh:BlankNodeOrLiteral ) )) .
}
次のクエリーは、sh:minExclusiveの SPARQLベースの可能なバリデーターを表す。 値ノードを指定された範囲と比較できない場合、たとえば文字列を整数と比較した場合、 SPARQL式はエラーを生成する。 比較を実行できない場合は、検証結果が存在する。 これは、そのようなエラーが暗黙のうちに結果を生成しない通常のSPARQLクエリーなどとは異なる。
ASK {
FILTER ($minExclusive < $value)
}
次のものについても同様の定義が可能である。
次のクエリーは、sh:minLengthの SPARQLベースの可能なバリデーターを表す。
ASK {
FILTER (STRLEN(str($value)) >= $minLength) .
}
次のクエリーは、sh:maxLengthの SPARQLベースの可能なバリデーターを表す。
ASK {
FILTER (STRLEN(str($value)) <= $maxLength) .
}
次のクエリーは、sh:patternの SPARQLベースの可能なバリデーターを表す。
ASK {
FILTER (!isBlank($value) && IF(bound($flags), regex(str($value), $pattern, $flags), regex(str($value), $pattern)))
}
次のクエリーは、sh:disjointの SPARQLベースの可能なバリデーターを表す。
SELECT DISTINCT $this ?value
WHERE {
$this $PATH ?value .
$this $disjoint ?value .
}
次のクエリーは、sh:lessThanの SPARQLベースの可能なバリデーターを表す。
SELECT $this ?value
WHERE {
$this $PATH ?value .
$this $lessThan ?otherValue .
BIND (?value < ?otherValue AS ?result) .
FILTER (!bound(?result) || !(?result)) .
}
次のクエリーは、sh:lessThanOrEqualsの SPARQLベースの可能なバリデーターを表す。
SELECT $this ?value
WHERE {
$this $PATH ?value .
$this $lessThanOrEquals ?otherValue .
BIND (?value <= ?otherValue AS ?result) .
FILTER (!bound(?result) || !(?result)) .
}
このセクションは非規範的です。
GRAPH や FROM などの SPARQL キーワードは、データセット内の
アクティブデータグラフ以外のグラフへのアクセスを提供する可能性があることに注意してください。
SHACL-SPARQL エンジンは、検証を開始したユーザーがアクセスを許可されていない
名前付きグラフへのアクセスを SPARQL エンジンが提供しないようにすべきです。
SHACL-SPARQL のセキュリティ上の考慮事項には、
SPARQL、
SPARQL Federated Query
(SERVICE)、および
SHACL Core の
すべてのセキュリティ上の考慮事項が含まれます。
このセクションは非規範的です。
元の SHACL core 仕様は、RDF Data Shapes Working Group によって作成されました。 Core 仕様の謝辞 セクションおよび Advanced Features 仕様の 謝辞セクションを参照してください。
この節は非規範的です。
sh:SPARQLTarget および sh:SPARQLTargetType を伴う
sh:target)は
定義されなくなりました。
そのユースケースは、sh:targetNode におけるノード式によってカバーされます。
sh:targetNode については、6.1
選択式を参照してください。
sh:SPARQLFunction を使用して宣言された SPARQL 関数(SHACL 高度な機能に由来)は、
次のものに置き換えられました。
7. ノード式に基づく SPARQL 関数の
宣言
sh:SPARQLRule)は、現在 [shacl12-inference-rules]
で定義されています。sh:message)では、データ型 rdf:HTML および
rdf:dirLangString も使用できます。
sh:SelectExpression を追加しました。課題 288を参照してください。
sh:SPARQLExprExpression を追加しました。課題 315を参照してください。
shapesGraph および
currentShape のサポートを削除しました。課題
426を参照してください。
sh:severity を直接指定できるようになりました。課題 573を参照してください。sh:prefixes が存在しない場合、システムは任意の
sh:ShapesGraph で宣言された sh:prefix/sh:namespace の組を使用します。課題 176を参照してください。
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: