SHACL 1.2 SPARQL 関連機能

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-shacl12-sparql-20261011/
最新公開バージョン:
https://www.w3.org/TR/shacl12-sparql/
最新編集者草案:
https://w3c.github.io/data-shapes/shacl12-sparql/
履歴:
https://www.w3.org/standards/history/shacl12-sparql/
コミット履歴
テストスイート:
https://github.com/w3c/data-shapes/tree/gh-pages/shacl12-test-suite
最新勧告:
https://www.w3.org/TR/2017/REC-shacl-20170720/#part2
編集者:
(TopQuadrant, Inc.)
(Corning)
(JPMorgan Chase & Co.)
(Swansea University)
元編集者:
Dimitris Kontokostas
フィードバック:
GitHub w3c/data-shapes (プルリクエスト, 新しい課題, 未解決の課題)
public-shacl@w3.org に、 件名行を [shacl12-sparql] として送信してください (アーカイブ)

概要

この文書は、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 仕様

この仕様は SHACL 1.2 仕様群の一部です。これらの仕様の詳細な 紹介については、SHACL 1.2 の概要を参照してください。

仕様は次のとおりです。

作業草案:

SHACL 1.2 コア
SHACL のコアを定義します
SHACL 1.2 ノード式
SHACL でフォーカスノードと値ノードを導出するために使用される式を定義します
SHACL 1.2 SPARQL 関連機能
SHACL の SPARQL 関連の拡張を定義します
SPARQL 1.2 RL
SHACL のルールベース推論フレームワークを定義します
SHACL 1.2 プロファイリング
SHACL データを含むデータのプロファイリングに SHACL を使用する方法を定義します
SHACL 1.2 ユーザー インターフェイス
ユーザーインターフェイスの生成に SHACL を使用する方法を定義します
SPARQL 1.2 RL
SHACL 1.2 推論ルールとともに使用できる RDF 用の Datalog 形式のルール言語を定義します

編集者草案:

SHACL 1.2 の概要
SHACL 仕様群の概要を示します
SHACL 1.2 コンパクト構文
SHACL の概念を表現するための RDF 構文を定義します
注記

実装者は、上記の仕様への適合度を、各仕様のメタデータにリンクされている テストケースを使用して 自らテストすることで部分的に確認できます。 ただし、テストスイートのすべてのテストに合格しても、 仕様への完全な適合を意味するわけではなく、 実装がテストスイートでテストされた側面に適合していることのみを意味します。

1. はじめに

この文書は、Shapes Constraint Language (SHACL) の SPARQL 関連機能を規定します。

1.1 用語

この文書全体で、次の用語を使用します。

この文書で定義される 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 つのリンクがあれば、この文書内に出現する特定の用語のすべての箇所に対する定義を提供するのに十分です。

定義はこの文書内で完結しています。すなわち、この文書にある状況を真にする規則が 存在しない場合、その状況は偽です。

基本的な RDF 用語
この文書では、 RDF グラフ、 RDF トリプル、 IRI、 リテラル、 空白 ノード、 RDF グラフの ノード、 データ型、 具体化子、 RDF 用語、ならびに RDF トリプルの 主語、 述語、および 目的語 という用語を、 RDF 1.2 Concepts and Abstract Syntax [rdf12-concepts] で定義されているとおりに使用します。
バインディング、解
バインディングとは、(変数, RDF 用語) の組であり、 [sparql12-query] における この用語の用法と一致します。 解とは、各変数が一意でなければならないバインディングの集合です。 非公式には、解は SPARQL クエリの結果表の本体における 1 行として理解されることがよくあります。

1.2 文書の表記規則

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 またはテキスト定義が含まれます。

このような灰色のボックスには、シェイプグラフに適用される構文規則が含まれます。

$マーカーを使用するSPARQL変数は、外部の束縛を表し、これらは事前に束縛されるか、$PATHの場合には、置換される。これらの処理はSPARQLクエリの実行前に行われる(詳しくは 3.3 次を用いた検証: SPARQLベースの制約で説明されている)。

true は RDF 用語 "true"^^xsd:boolean を表します。 false は RDF 用語 "false"^^xsd:boolean を表します。

1.3 適合性

非規範的と明示された節に加えて、この仕様に含まれるすべての作成ガイドライン、図、例、注記は 非規範的です。この仕様のその他のすべての内容は規範的です。

この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、および SHOULD は、 ここに示すようにすべて 大文字で記述されている場合に限り、BCP 14 [RFC2119] [RFC8174] に記載されているとおりに 解釈しなければなりません。

この文書は、SHACL コアを拡張する SHACL-SPARQL 言語を定義します。 この仕様では、次の適合基準について説明します。

SHACL コアの適合性の節にある整形式に関する説明も参照してください。

注記

SHACL 1.2 推論ルール仕様 [shacl12-inference-rules] は、SHACL 向けの追加の SPARQL ベースの機能を定義します。

2. 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 文を省略している場合があります。

3. SPARQLベースの制約

SHACL-SPARQLは、SPARQL SELECTクエリに基づく制限を表現するために使用できる 制約コンポーネントを サポートします。

制約コンポーネントIRI: sh:SPARQLConstraintComponent

パラメーター:
プロパティ 概要
sh:sparql 評価するSPARQLクエリを宣言するSPARQLベースの 制約。

SPARQLベースの制約の構文規則および検証プロセスは、この節の以降の部分で定義します。

3.1 SPARQLベースの制約の 例

この節は非規範的です。

次の例は、SPARQLベースの 制約の構文を示しています。

SPARQLクエリは、制約に違反する変数valueのすべての束縛について、 結果集合の解を返します。 後述するマッピング規則を適用し、 その結果集合内の各解に対して1つの検証結果があります。 この例では、各検証結果は、変数 thisの束縛をsh:focusNodeとして、 ex:germanLabelをsh:resultPathとして、違反する値を sh:valueとして持ちます。

次の例は、上記と同様のシナリオをプロパティシェイプで示します。

3.2 SPARQLベースの制約の 構文

シェイプはプロパティ 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 クエリーでは、 バインドされていない変数のままです。

3.3 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 を持つ場合、かつその場合に限り生成されなければなりません。

3.3.1 SPARQL制約における事前束縛変数$this

SPARQLベースの制約の SPARQLクエリ、およびSPARQLベースの制約コンポーネントの バリデーターが 処理されるとき、 SHACL-SPARQLプロセッサは、変数$thisの値を現在のフォーカスノードに 事前束縛します。

3.3.2 解の束縛から結果プロパティへのマッピング

検証結果ノードの プロパティの値は、結果の解と制約自体の値を 組み合わせて、次の規則によって導出されます。 規則は上から下へ実行され、最初に束縛された値が使用されることを意図しています。

プロパティ 生成規則
sh:focusNode
  1. 変数thisの束縛
sh:resultPath
  1. 変数pathの束縛(それがIRIの場合)
  2. プロパティ シェイプによって生成された結果の場合、シェイプの sh:pathの値と同等の SHACL プロパティパス
sh:value
  1. 変数valueの束縛
  2. 値ノード
sh:resultMessage
  1. 変数messageの束縛
  2. SPARQLベースの制約の場合: SPARQLベースの制約の sh:messageの値。 SPARQLベースの制約コンポーネントの場合: SPARQLベースの 制約コンポーネントのバリデーターの sh:messageの値。
  3. SPARQLベースの制約コンポーネントの場合: SPARQLベースの 制約コンポーネントのsh:messageの値。
  4. それ以外の場合は、シェイプまたは制約でメッセージを宣言する ための既定の仕組みが適用されます。
これらのメッセージリテラルには、{?varName}または {$varName}を介して任意のSELECT結果変数の名前を含めることができます。 制約がSPARQLベースの制約 コンポーネントに基づく場合、コンポーネントのパラメーター名も使用できます。 これらの{?varName}および{$varName}ブロックは、 それらの変数の値を表す適切な文字列表現に置き換える べきである。
sh:sourceConstraint
  1. SPARQLベースの制約、 すなわちsh:sparqlの値

変数 failure は予約されており、結果プロパティにはマッピングされません。 上記で定義されているように、failure の解が true を failure のバインディングとして持つ場合、失敗が生成され、 検証結果は生成されません。

4. SPARQLベースの制約 コンポーネント

SPARQLベースの制約は高い柔軟性を提供しますが、 人によっては理解しにくかったり、繰り返しにつながったりする可能性があります。 この節では、SPARQLの複雑さを抽象化し、Core制約コンポーネントに類似した 高水準で再利用可能なコンポーネントを宣言する方法として、SPARQLベースの制約 コンポーネントを導入します。 このような制約コンポーネントは、SHACL RDF語彙を使用して宣言できるため、共有および再利用できます。

4.1 SPARQLベースの 制約コンポーネントの例

この節は非規範的です。

次の例は、SHACL-SPARQL言語を使用して新しい制約コンポーネントを指定するために、 SPARQLをどのように使用できるかを示しています。 この例では、各値ノードが指定された正規表現に 一致することを検証するために、sh:patternおよび sh:flagsを SPARQL ASKクエリを使用して実装します。 これは実装例にすぎず、規範的なものと見なすべきではないことに注意してください。

制約コンポーネントを宣言すると、次の例に示すように、そのパラメーターをシェイプで使用できます。

制約コンポーネントは、シェイプ内の制約を 識別して検証する方法を、検証エンジンに指示します。 一般に、シェイプ Sがプロパティpの値を持ち、 pをパラメーターとして指定する制約コンポーネント Cが存在し、SがCのすべての必須 パラメーターの値を持つ場合、 これらのパラメーター値の集合(任意選択のパラメーターを含む)は 制約を宣言し、 検証エンジンはCの適切なバリデーターを使用して この制約の検証を実行します。 上記の例では、sh:PatternConstraintComponentは必須パラメーター sh:pattern、 任意選択のパラメーターsh:flags、 およびノードシェイプまたはプロパティシェイプの いずれかに対する検証の実行に使用できるバリデーターを宣言します。

4.2 SPARQLベースの 制約コンポーネントの構文

SPARQLベースの制約コンポーネントは、 シェイプ グラフにおいてSHACL型 sh:ConstraintComponentを持つIRIです。

この文書で新しい制約コンポーネントを 宣言する仕組みは、SPARQLに基づくものに限定されています。 ただし、パラメーターおよびバリデーターを宣言するための一般構文は、 JavaScriptなどの他の拡張言語でも機能するように設計されています。

4.2.1 パラメーター 宣言(sh:parameter)

制約 コンポーネントのパラメーターは、 プロパティ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などの制約パラメーターも含まれます。 パラメーターに 対して宣言された制約に適合しないシェイプは、非整形式です。 一部の実装は、無効なパラメーター値を持つ制約コンポーネントの実行を防ぐために、 これらの制約パラメーターを使用してもよい。

4.2.2 ラベルテンプレート (sh:labelTemplate)

プロパティ sh:labelTemplate は、任意の制約コンポーネントで、 制約を人間向けにどのように表示するかを 提案するために使用できます。 sh:labelTemplate の値は、データ型がリテラルである xsd:string、rdf:langString、または rdf:dirLangString です。 これらは ラベルテンプレートと呼ばれます。

この節の残りは非規範的です。

ラベルテンプレートには、制約コンポーネントに対して 宣言されたパラメーターの名前を、{?varName}または{$varName}という 構文を使用して含めることができます。ここで、varNameはパラメーター名です。 表示時に、これらの{?varName}および{$varName}ブロックは、 実際のパラメーター値に置き換えるべきです。 同じ主語に対して複数のラベルテンプレートが存在する場合がありますが、 同じ言語タグを持つべきではなく、データ型xsd:stringを持つテンプレートが 複数あってはなりません。

4.2.3 バリデーター

サポートされる各シェイプ型(すなわち、プロパティシェイプまたはノードシェイプ)について、 制約コンポーネントは適切なバリデーターを宣言します。 特定の制約について、次の規則を順番に使用して制約コンポーネントからバリデーターを選択します。

  1. ノード シェイプの場合、sh:nodeValidatorの値が存在すれば、そのいずれかを 使用します。
  2. プロパティシェイプの場合、 sh:propertyValidatorの値が存在すれば、そのいずれかを使用します。
  3. それ以外の場合は、sh:validatorの値のいずれかを使用します。

適切なバリデーターが見つからない場合、SHACL-SPARQLプロセッサはその制約を無視します。

SHACL-SPARQLには、SPARQL SELECT( sh:nodeValidatorおよびsh:propertyValidator用)または SPARQL ASKクエリ(sh:validator用)に 基づく2種類のバリデーターが含まれています。

4.2.3.1 SELECTベースの バリデーター

バリデーターのうち、 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 を記述することなく、複数の場所でクエリロジックを再利用できます。

制約コンポーネントを(シェイプグラフ内で)宣言すると、その パラメータを次の例に示すように使用できます。ex:lang を含むすべてのプロパティシェイプは、 ex:LanguageConstraintComponentUsingSELECT を使用するものとして解釈されます($lang をその 値にバインドします)。

上記のシェイプ例は、ex:germanLabel のすべての値が 言語タグ de を持ち、 ex:englishLabel のすべての値が言語として en を持つという条件を指定しています。 これらの詳細は、制約コンポーネントで必須とされる ex:lang パラメータの値を持つ2つのプロパティシェイプによって指定されています。

4.2.3.2 ASKベースのバリデーター

多くの制約コンポーネントでは、すべての値ノードを 何らかのブール条件に対して個別にテストします。 特に、制約コンポーネントをプロパティシェイプとノード シェイプの両方で使用できる場合、このための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クエリを使用して制約コンポーネントを宣言します。

ASKクエリによって実装される検証条件は、対応するSELECTクエリとは 「逆方向」であることに注意してください。 ASKクエリは制約に適合する値ノードに対してtrueを返す一方、 SELECTクエリは適合しない値ノードを返します。

4.3 SPARQLベースの 制約コンポーネントによる検証

この節では、SPARQL ベースの制約コンポーネントのバリデーターを定義します。 このバリデーターは、考えられる実装戦略の 1 つを説明するにすぎず、 SHACL プロセッサーは、結果が同等である限り、別の方法を選択できます。

最初のステップとして、バリデーターを、MUST の要件に従い、以下に示す規則に基づいて選択しなければなりません。 4.2.3 バリデーター。 次に、以下の規則を適用し、SPARQL クエリーの解の集合を生成します。

上記の SPARQL クエリーの実行では、変数 this を事前バインドしなければなりません(MUST)。 その方法は、3.3.1 SPARQL 制約における事前バインドされた変数 $thisで説明されています。 さらに、制約における 制約コンポーネントの 各パラメーターの 値は、 パラメーター名を名前とする変数として、 MUST 事前バインドされなければなりません。

検証結果の生成規則は、 SPARQL ベースの制約の生成規則と同一であり、 上記で生成された解 QS を使用します。

5. 注釈プロパティ

この節では、一般的な仕組みを拡張し、 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 変数へのマッピングには、次の規則を使用します。

  1. プロパティ sh:annotationVarName の値を使用します。
  2. そのような値が 存在しない場合は、sh:annotationProperty の値のローカル名を 変数名として使用します。

変数名を決定できた場合、SHACL プロセッサーは、指定された変数のバインディングを、 sh:annotationProperty を使用して指定されたプロパティの値として、 現在の解に対して生成中の検証 結果にコピーします。 結果集合の解において、変数にバインディングがない場合は、 sh:annotationValue の値が存在すれば、それを使用します。

6. SPARQLベースのノード式

この節では、SPARQL に基づくノード式関数を 紹介します。

注記

この節のノード式関数には、完全な SPARQL クエリーまたは SPARQL 式が埋め込まれています。 sparql:concat などの個別の SPARQL 関数に対応するノード式関数は、 SPARQL クエリーを使用せずに評価され、次の仕様で定義されています。 SHACL 1.2 ノード式。

6.1 選択式

ノード 式のうち、キーパラメーター 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 つの変数を射影します。

SELECT 式の評価

選択式の出力 ノードは、リスト resultNodes であり、 クエリーがフォーカス グラフに対して評価されたときに、SELECT 句から射影される (唯一の)変数のバインディングのみで構成されます。 focusNode の値は、SPARQL 変数 this の値として 事前バインドされます。 スコープ内の各変数の値は、同じ名前と値を持つ SPARQL 変数として 事前バインドされます。 スコープ内の変数名が文字列リテラルでない場合は、"arg" + str(name) を使用します。 例えば、変数名が "0"^^xsd:integer の場合は、arg0 を使用します。 スコープ内の変数のいずれかが this という名前である場合、 またはこの方法で導出された変数名が有効な SPARQL VARNAME でない場合、 失敗が生成されます。

evalExpr(expr, focusGraph, focusNode, scope) -> resultNodes

この節の残りの部分は非規範的です。

6.2 SPARQL Expr式

ノード 式のうち、キーパラメーター 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 式の評価

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

このセクションの残りは非規範的です。

7. ノード式に基づく SPARQL 関数の宣言

SHACL 1.2 ノード式は、新しいノード式関数を宣言する仕組みとしてカスタムリストパラメーター 関数を定義しています。 これらは他の SHACL ノード式の一部として評価できますが、関数形式の実行をサポートする他のエンジンでも 役立つ場合があります。

SPARQL 仕様は、特定の SPARQL エンジンが追加の SPARQL 関数を提供できるようにする拡張ポイントを定義しています。 この節では、SPARQL プロセッサーがこの拡張ポイントを使用して SHACL リストパラメーター 関数を SPARQL 関数として利用可能にするための宣言的な仕組みを紹介します。

7.1 一般的なノード式を使用する SPARQL 関数の例

7.2 SPARQL ベースのノード式を使用する SPARQL 関数の例

以下のカスタムリストパラメーター関数は、評価時に「入れ子になった」SPARQL クエリーを使用します。

次の例では、sh:select ノード式を本体として使用します。

7.3 カスタム SPARQL 関数の評価

この文書では、このようなカスタム SPARQL 関数を追加する方法やタイミングについて、厳密な制約を定義していません。 SPARQL エンジンは、提供された任意のシェイプグラフ内の sh:ListParameterExpressionFunction の各SHACL インスタンスに対して関数を登録することが推奨されます(SHOULD)。 同じIRIを持つ関数が、組み込み関数または その他の非カスタム関数としてすでに登録されている場合、 SPARQL エンジンは再定義の試みを無視しなければなりません(MUST)。 登録済みの関数自体が、以前に提供されたシェイプグラフなどに由来する カスタム SPARQL 関数である場合、新しい宣言がそれを置き換えます。 SPARQL エンジンは、SPARQL クエリーの実行中に登録済みの SPARQL 関数を変更してはなりません(MUST NOT)。

カスタム SPARQL 関数の評価

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 関数呼び出しの結果はエラーになります。

注記

SPARQL クエリーの評価中には、専用のフォーカスノードは存在しません。 代わりに、ノード式に基づくカスタム SPARQL 関数に渡される focusNode は、 関数自体のIRIです。

付録

A. SPARQL クエリにおける変数の 事前バインディング

SHACL-SPARQL の一部の機能は、この節で定義する変数の事前バインドという概念に依存します。

(リスクのある機能)課題 1

この機能は「リスクあり」とされており、この分野で現在進行中の 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 など)が含まれることに注意してください。

さらに、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) の 評価として定義されます。

B. 構文規則の要約

この節では、この文書のすべての規範的な構文規則を列挙します。 この節は、この仕様の他の部分から自動的に生成されており、規則の文脈が不明確な場合に本文へ戻れるよう ハイパーリンクが提供されています。 シェイプグラフ内でこれらの規則に違反するノードは不正形式です。

構文規則 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 クエリー(sh:ask、sh:construct、 sh:select および sh:sparqlExpr を介したもの)を含む シェイプ グラフを処理する際、 これらの「MUST」制限のいずれかに違反する場合は、 失敗を報告しなければなりません。 「事前バインドされる可能性のある変数」には、変数 this、 value(ASK クエリーの場合)、 クエリーを使用する制約コンポーネントの パラメーターを表す任意の変数、 およびSPARQL ベースのノード式のスコープ変数を表す変数 (arg0 など)が含まれることに注意してください。

  • SPARQL クエリーには MINUS 句を含めてはなりません(MUST)。
  • SPARQL クエリーには、事前バインドされる可能性のある変数に言及する VALUES 句を 含めてはなりません(MUST)。
  • SPARQL クエリーでは、事前バインドされる可能性のある変数に対して ​​AS ?var という構文形式を 使用してはなりません(MUST)。

さらに、SPARQL クエリーには連合クエリーを含めるべきではありません(SHOULD)。 (SERVICE)。 SERVICE を許可しない実装は、上記のように 失敗を 報告しなければなりません(MUST)。 ただし、一部の SPARQL 実装では SERVICE キーワードを特定の(通常はローカルな)操作の構文として 使用しているため、このキーワードは一般的には禁止されていません。

C. SHACL Core 制約バリデーターの潜在的な SPARQL 定義

この節は非規範的です。

この付録では、制約 コンポーネントおよびターゲットの意味論について、 [shacl12-core] にある非規範的な代替定義で SPARQL 1.2 の一部を使用します。 これらは一部の実装者に役立つ場合がありますが、SHACL コア 言語の実装に SPARQL は必要ありません。

sh:targetClass および sh:class の定義では、 rdfs:subClassOf トリプルを データグラフ内でのみ検索します。 プロセッサーパラメーター subClassOfInShapesGraph が設定されている場合は、 シェイプグラフの rdfs:subClassOf トリプルも 考慮する必要があります。

$マーカーを使用するSPARQL変数は、外部の束縛を表し、これらは事前に束縛されるか、$PATHの場合には、置換される。これらの処理はSPARQLクエリの実行前に行われる(詳しくは3.3 次を用いた検証: SPARQLベースの制約で説明されている)。

C.1 sh:targetClass

次のクエリは、クラスターゲットのSPARQLによる定義の候補を表す。 変数targetClassは、事前束縛され、その対象は指定された sh:targetClassの値となる。 すべての束縛のうち、変数thisについて解から得られるものは、すべてフォーカスノードになる。

SPARQLにおける可能な定義
SELECT DISTINCT ?this    # ?thisはフォーカスノード
WHERE {
	?this rdf:type/rdfs:subClassOf* $targetClass .
}

C.2 sh:targetSubjectsOf

次のクエリーは、SPARQL における主語ターゲットの定義候補を表します。 変数 targetSubjectsOf は、指定された 事前バインドによって sh:targetSubjectsOf の値に結び付けられます。 バインディングのうち、解から得られる変数 this のすべてがフォーカスノードになります。

SPARQLにおける可能な定義
SELECT DISTINCT ?this    # ?thisはフォーカスノード
WHERE {
	?this $targetSubjectsOf ?any .
}

C.3 sh:targetObjectsOf

次のクエリは、オブジェクトターゲットのSPARQLによる定義の候補を表す。 変数targetObjectsOfは、事前束縛され、その対象は指定された sh:targetObjectsOfの値となる。 すべての束縛のうち、変数thisについて解から得られるものは、すべてフォーカスノードになる。

SPARQLにおける可能な定義
SELECT DISTINCT ?this    # ?thisはフォーカスノード
WHERE {
	?any $targetObjectsOf ?this .
}

C.4 sh:class

次のクエリーは、sh:classの SPARQLベースの可能なバリデーターを表す。

SPARQLにおける可能な定義(各値ノード$valueについてtrueと評価されなければならない)
ASK {
	$value rdf:type/rdfs:subClassOf* $class .
}

C.5 sh:nodeKind

次のクエリーは、sh:nodeKindの SPARQLベースの可能なバリデーターを表す。

SPARQLにおける可能な定義(各値ノード$valueについてtrueと評価されなければならない)
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 ) )) .
}

C.6 sh:minExclusive(など)

次のクエリーは、sh:minExclusiveの SPARQLベースの可能なバリデーターを表す。 値ノードを指定された範囲と比較できない場合、たとえば文字列を整数と比較した場合、 SPARQL式はエラーを生成する。 比較を実行できない場合は、検証結果が存在する。 これは、そのようなエラーが暗黙のうちに結果を生成しない通常のSPARQLクエリーなどとは異なる。

SPARQLにおける可能な定義(各値ノード$valueについてtrueと評価されなければならない)
ASK {
	FILTER ($minExclusive < $value)
}

次のものについても同様の定義が可能である。

C.7 sh:minLength

次のクエリーは、sh:minLengthの SPARQLベースの可能なバリデーターを表す。

SPARQLにおける可能な定義(各値ノード$valueについてtrueと評価されなければならない)
ASK {
	FILTER (STRLEN(str($value)) >= $minLength) .
}

C.8 sh:maxLength

次のクエリーは、sh:maxLengthの SPARQLベースの可能なバリデーターを表す。

SPARQLにおける可能な定義(各値ノード$valueについてtrueと評価されなければならない)
ASK {
	FILTER (STRLEN(str($value)) <= $maxLength) .
}

C.9 sh:pattern

次のクエリーは、sh:patternの SPARQLベースの可能なバリデーターを表す。

SPARQLにおける可能な定義(各値ノード$valueについてtrueと評価されなければならない)
ASK {
	FILTER (!isBlank($value) && IF(bound($flags), regex(str($value), $pattern, $flags), regex(str($value), $pattern)))
}

C.10 sh:disjoint

次のクエリーは、sh:disjointの SPARQLベースの可能なバリデーターを表す。

SPARQLにおける可能な定義(指定された$PATHについて結果を返してはならない)
SELECT DISTINCT $this ?value
WHERE {
	$this $PATH ?value .
	$this $disjoint ?value .
}

C.11 sh:lessThan

次のクエリーは、sh:lessThanの SPARQLベースの可能なバリデーターを表す。

SPARQLにおける可能な定義(指定された$PATHについて結果を返してはならない)
SELECT $this ?value
WHERE {
	$this $PATH ?value .
	$this $lessThan ?otherValue .
	BIND (?value < ?otherValue AS ?result) .
	FILTER (!bound(?result) || !(?result)) .
}

C.12 sh:lessThanOrEquals

次のクエリーは、sh:lessThanOrEqualsの SPARQLベースの可能なバリデーターを表す。

SPARQLにおける可能な定義(指定された$PATHについて結果を返してはならない)
SELECT $this ?value
WHERE {
	$this $PATH ?value .
	$this $lessThanOrEquals ?otherValue .
	BIND (?value <= ?otherValue AS ?result) .
	FILTER (!bound(?result) || !(?result)) .
}

D. セキュリティとプライバシーに関する 考慮事項

このセクションは非規範的です。

GRAPH や FROM などの SPARQL キーワードは、データセット内の アクティブデータグラフ以外のグラフへのアクセスを提供する可能性があることに注意してください。 SHACL-SPARQL エンジンは、検証を開始したユーザーがアクセスを許可されていない 名前付きグラフへのアクセスを SPARQL エンジンが提供しないようにすべきです。

SHACL-SPARQL のセキュリティ上の考慮事項には、 SPARQL、 SPARQL Federated Query (SERVICE)、および SHACL Core の すべてのセキュリティ上の考慮事項が含まれます。

E. 謝辞

このセクションは非規範的です。

元の SHACL core 仕様は、RDF Data Shapes Working Group によって作成されました。 Core 仕様の謝辞 セクションおよび Advanced Features 仕様の 謝辞セクションを参照してください。

この節は非規範的です。

G. 参考文献

G.1 規範的参考文献

[owl2-syntax]
OWL 2 Web オントロジー言語の構造 仕様および関数型構文(第 2 版)。Boris Motik; Peter Patel-Schneider; Bijan Parsia。W3C。2012 年 12 月 11 日。W3C 勧告。URL:https://www.w3.org/TR/owl2-syntax/
[rdf12-concepts]
RDF 1.2 の概念と抽象データ モデル。Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin。W3C。2026 年 4 月 7 日。 W3C 勧告候補。URL:https://www.w3.org/TR/rdf12-concepts/
[rdf12-turtle]
RDF 1.2 Turtle。Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk。W3C。2026 年 10 月 7 日。W3C 作業草案。URL:https://www.w3.org/TR/rdf12-turtle/
[REC-xml-names]
XML 1.0 における名前空間(第 3 版)。 Tim Bray; Dave Hollander; Andrew Layman; Richard Tobin; Henry Thompson ほか。W3C。2009 年 12 月 8 日。 W3C 勧告。URL:https://www.w3.org/TR/xml-names/
[RFC2119]
RFC で要件レベルを示すために使用する キーワード。S. Bradner。IETF。1997 年 3 月。現行のベストプラクティス。URL:https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119 のキーワードにおける大文字と小文字の曖昧さ。B. Leiba。IETF。2017 年 5 月。現行のベストプラクティス。URL:https://www.rfc-editor.org/info/rfc8174/
[shacl12-core]
SHACL 1.2 コア。Holger Knublauch; Thomas Bergwinkl; Yousouf Taghzouti; Jesse Wright。W3C。2026 年 10 月 8 日。W3C 作業草案。URL:https://www.w3.org/TR/shacl12-core/
[shacl12-inference-rules]
SHACL 1.2 推論ルール。 Holger Knublauch; Simon Steyskal; Scott Henninger; Livio Robaldo; Matt Goldberg。W3C。2026 年 9 月 17 日。 初回公開作業草案。URL:https://www.w3.org/TR/shacl12-inference-rules/
[shacl12-node-expr]
SHACL 1.2 ノード式。 Robert David; Holger Knublauch; Simon Steyskal。W3C。2026 年 7 月 21 日。W3C 作業草案。URL:https://www.w3.org/TR/shacl12-node-expr/
[sparql12-query]
SPARQL 1.2 クエリー言語。Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon。W3C。2026 年 10 月 8 日。 W3C 作業草案。URL:https://www.w3.org/TR/sparql12-query/
[vc-data-model]
検証可能な資格情報のデータモデル v2.0。Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen。W3C。 2025 年 5 月 15 日。W3C 勧告。URL:https://www.w3.org/TR/vc-data-model-2.0/

G.2 参考情報的参考文献

[shacl12-inf-rules]
SPARQL 1.2 RL。Robert David; David Habgood; Andy Seaborne; Simon Steyskal。W3C。2026 年 10 月 8 日。W3C 作業草案。URL:https://www.w3.org/TR/sparql12-rl/
[shacl12-profiling]
SHACL 1.2 プロファイリング。Nicholas Car; Scott Henninger; Yousouf Taghzouti; Alexander Nelson; Matt Goldberg。W3C。2026 年 7 月 2 日。初回公開作業草案。 URL:https://www.w3.org/TR/shacl12-profiling/
[shacl12-sparql]
SHACL 1.2 SPARQL 関連機能。 Holger Knublauch; Matt Goldberg; Scott Henninger; Livio Robaldo。W3C。2026 年 10 月 10 日。W3C 作業草案。URL:https://www.w3.org/TR/shacl12-sparql/
[shacl12-ui]
SHACL 1.2 ユーザーインターフェイス。Thomas Bergwinkl; Edmond Chuc; Ieben Smessaert; Daniël Beeke。W3C。2026 年 5 月 26 日。初回公開作業草案。URL:https://www.w3.org/TR/shacl12-ui/
[sparql12-federated-query]
SPARQL 1.2 連合 クエリー。Ruben Taelman; Gregory Williams。W3C。2026 年 4 月 23 日。W3C 作業草案。 URL:https://www.w3.org/TR/sparql12-federated-query/