Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 SHACL Shapes Constraint Language의 SPARQL 관련 확장을 정의합니다. SHACL의 Core 부분이 shapes의 기본 구문과 SHACL에서 지원되는 가장 일반적인 constraint components를 정의하는 반면, SPARQL 관련 확장은 SPARQL을 통해 Core의 표현력을 확장하는 기능을 다룹니다. 특히 이 문서는 constraints와 constraint components를 SPARQL을 사용하여 정의하는 방법과 SPARQL 기반 node expressions를 정의합니다.
이 절은 이 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물과 이 기술 보고서의 최신 개정 목록은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.
이 문서는 Data Shapes Working Group에서 Recommendation 트랙을 사용하여 Working Draft로 발행했습니다.
Working Draft로 발행되었다고 해서 W3C와 그 회원들이 이를 승인한다는 의미는 아닙니다.
이 문서는 초안 문서이며 언제든지 다른 문서로 업데이트, 대체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절합니다.
이 문서는 W3C Patent Policy에 따라 운영되는 그룹에서 작성했습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허 공개를 위한 지침도 포함되어 있습니다. 개인이 해당 개인이 Essential Claim(s)를 포함한다고 믿는 특허에 대해 실제로 알고 있는 경우, Essential Claim(s) 해당 정보를 W3C Patent Policy의 6절에 따라 공개해야 합니다.
이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받습니다.
이 명세는 SHACL 1.2 명세군의 일부입니다. 이에 대한 더 자세한 소개는 SHACL 1.2 개요를 참조하세요.
명세는 다음과 같습니다.
작업 초안:
Working Group Note 초안:
구현자는 위 명세들에 대한 적합성 수준을 SHACL 1.2 test suite의 테스트 케이스를 성공적으로 통과함으로써 부분적으로 확인할 수 있습니다. 그러나 test suite의 모든 테스트를 통과한다고 해서 명세에 대한 완전한 적합성을 의미하지는 않습니다. 이는 구현이 test suite에서 테스트한 측면에 적합하다는 것만을 의미합니다.
이 문서는 SHACL(Shapes Constraint Language)의 SPARQL 관련 기능을 명시합니다.
이 문서 전체에서 다음 용어가 사용됩니다.
이 문서에서 정의하는 SHACL SPARQL Extensions는 때때로 SHACL-SPARQL이라고 합니다.
RDF 1.2 Concepts and Abstract Syntax의 일부에 링크된 용어는 그곳에서 정의된 대로 SHACL-SPARQL에서 사용됩니다. SPARQL 1.2 Query Language의 일부에 링크된 용어는 그곳에서 정의된 대로 SHACL-SPARQL에서 사용됩니다. SHACL 1.2 Core의 일부에 링크된 용어는 그곳에서 정의된 대로 SHACL-SPARQL에서 사용됩니다. 특정 용어가 이 문서에서 나타나는 모든 경우에 대해 정의를 제공하려면 한 번의 링크로 충분합니다.
정의는 이 문서 안에서 완결됩니다. 즉, 이 문서 안에서 어떤 상황을 참으로 만드는 규칙이 없다면 그 상황은 거짓입니다.
SHACL의 구문은 RDF입니다. 이 문서의 예제는 Turtle [rdf12-turtle]을 사용합니다. RDF/XML과 같은 다른 RDF 직렬화도 실제로 사용될 수 있습니다. 독자는 triples와 같은 기본 RDF 개념 [rdf12-concepts] 및 SPARQL [sparql12-query]에 익숙해야 합니다.
이 문서에서는 다음 namespace prefix bindings가 사용됩니다.
| Prefix | Namespace |
|---|---|
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# |
이 문서에서는 다음 JSON-LD context가 사용됩니다.
{
"@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#"
}
}
SHACL vocabulary 자체를 정의하는 graph의 URI는 위 namespace와 동일합니다.
즉, #를 포함합니다.
예를 들어 owl:imports를 통한 SHACL vocabulary 참조는 #를 포함해야 합니다.
문서 전체에서 Turtle의 RDF graphs를 포함하는 색상 구분 상자가 나타납니다. 이러한 Turtle 문서 조각은 위에 제시된 prefix bindings를 사용합니다.
SHACL Definitions는 파란색 상자에 나타납니다.
# This box contains SPARQL or textual definitions.
이와 같은 회색 상자는 shapes graph에 적용되는 구문 규칙을 포함합니다.
$ marker를 사용하는 SPARQL variables는 SPARQL query 실행 전에
pre-bound되거나,
$PATH의 경우 substituted되는 외부
bindings를
나타냅니다
(3.3 SPARQL 기반
Constraint Components를 사용한 검증에서 설명함).
true는 RDF term "true"^^xsd:boolean을 나타냅니다.
false는 RDF term "false"^^xsd:boolean을 나타냅니다.
비규범으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 도표, 예제 및 참고는 비규범입니다. 이 명세의 그 밖의 모든 내용은 규범적입니다.
이 문서의 핵심어 MAY, MUST, 그리고 SHOULD는 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 합니다.
이 문서는 SHACL Core를 확장하는 SHACL-SPARQL 언어를 정의합니다. 이 명세는 다음에 대한 적합성 기준을 설명합니다.
또한 SHACL Core의 적합성 절에서 well-formedness에 관한 논의도 참조하세요.
SHACL-SPARQL은 SPARQL SELECT query에 기반한 제한을 표현하는 데 사용할 수 있는 constraint component를 지원합니다.
Constraint Component IRI: sh:SPARQLConstraintComponent
| 속성 | 요약 |
|---|---|
sh:sparql |
평가할 SPARQL query를 선언하는 SPARQL 기반 constraint. |
SPARQL 기반 constraints의 구문 규칙과 검증 과정은 이 절의 나머지 부분에서 정의됩니다.
이 절은 비규범입니다.
다음 예제는 SPARQL 기반 constraint의 구문을 보여 줍니다.
SPARQL query는 constraint를 위반하는 value variable의 모든 bindings에 대해 result set
solutions를 반환합니다.
해당 result set의 각 solution마다 하나의 validation result가 있으며,
이는 뒤에서 설명하는 mapping rules를 적용합니다.
이 예제에서 각 validation result는
this variable에 대한 binding을
sh:focusNode로,
ex:germanLabel을 sh:resultPath로, 그리고 위반하는 값을
sh:value로 갖게 됩니다.
다음 예제는 위와 유사한 시나리오를 보여 주지만, property shape를 사용합니다.
{
"@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"
}
}
]
}
Shapes는
sh:sparql property에 대한 values를 가질 수 있으며,
이러한 values는 IRIs 또는
blank
nodes입니다.
이러한 values를 SPARQL 기반 constraints라고 합니다.
SPARQL 기반 constraints는
sh:select property에 대해 정확히 하나의 value를 갖습니다.
sh:select의 value는
datatype xsd:string의 literal입니다.
class sh:SPARQLConstraint는 SHACL vocabulary에서 정의되며,
이러한 constraints의 type으로 사용할 수 있습니다
(하지만 type이 필수는 아닙니다).
prefix 처리 규칙을 사용하여, sh:select의 value는
유효한 SPARQL 1.2 SELECT query입니다.
sh:select의
value에서
파생된 SPARQL query는 SELECT clause에서 variable
this를 projects합니다.
다음 두 properties는 shapes에서의 사용과 유사합니다.
SPARQL 기반
constraints는 sh:message property에 대한 values를 가질 수 있으며,
이들은 datatype
xsd:string, rdf:dirLangString, rdf:langString, 또는
rdf:HTML을 가진 literals입니다.
같은 language tag를 가진 sh:message value가 둘 이상 있거나,
datatype xsd:string의 value가 여러 개 있어서는 안 됩니다.
SPARQL 기반
constraints는 sh:deactivated property에 대해 최대 하나의 value를 가질 수 있습니다
그리고 이 value는 true 또는 false입니다.
SPARQL 기반 constraints는
sh:severity property에 대해 최대 하나의 value를 가질 수 있으며,
이 value는 IRI입니다.
property
shapes의 맥락에서 사용되는
SELECT queries는 shape가 사용하는 path의 placeholder로 PATH라는 특수 variable을 사용합니다.
SPARQL 기반
constraints
및 SELECT 기반 validators의 SPARQL queries에서
variable PATH의 유일한 적법한 사용은
triple pattern의
predicate
position입니다.
variable PATH를 다른 position에서 사용하는 query는 ill-formed입니다.
shapes graph는 namespace prefixes의 선언을 포함할 수 있으며, 이를 통해 같은 shapes graph에서 파생된 SPARQL queries를 축약하는 데 이러한 prefixes를 사용할 수 있습니다. 이러한 prefix declarations의 구문은 다음 예제로 설명됩니다.
{
"@id": "http://example.com/ns#",
"@type": "sh:ShapesGraph",
"owl:imports": {
"@id": "http://www.w3.org/ns/shacl#"
},
"sh:declare": [
{
"sh:namespace": {
"@type": "xsd:anyURI",
"@value": "http://example.com/ns#"
},
"sh:prefix": "ex"
},
{
"sh:namespace": "http://schema.org/",
"sh:prefix": "schema"
}
]
}
sh:prefix와 sh:namespace 모두에 대해
values를 가진
IRIs 또는 blank
nodes를
prefix declarations라고 합니다.
SHACL vocabulary는 class sh:PrefixDeclaration를 이러한 prefix
declarations의 type으로 포함하지만,
이들에 대해 rdf:type triple이 필수는 아닙니다.
Prefix declarations는
sh:prefix property에 대해 정확히 하나의 value를 갖습니다.
sh:prefix의 values는 datatype
xsd:string의 literals입니다.
Prefix declarations는
sh:namespace property에 대해 정확히 하나의 value를 갖습니다.
sh:namespace의 values는 datatype
xsd:anyURI 또는 xsd:string의 literals입니다.
이러한 values의 쌍은 prefix에서 namespace로의 단일 mapping을 지정합니다.
property sh:declare의 values는
prefix declarations입니다.
sh:declare의 values에 권장되는
subject는
prefixes를 사용하는 shapes를 포함하는
named graph의 IRI입니다.
이러한 IRIs는 종종 sh:ShapesGraph 또는
owl:Ontology의 instance로 선언되지만, 필수는 아닙니다.
Prefix declarations는
SPARQL 기반 constraints,
SPARQL 기반 constraint components의
validators,
그리고 SHACL extensions에서 정의한 유사한 기능에서 사용할 수 있습니다.
이러한 nodes는 sh:prefixes property를 사용하여 prefix mappings 집합을 지정할 수 있습니다.
sh:prefixes property의 사용 예는 위의
예제에서 확인할 수 있습니다.
sh:prefixes의 values는 IRIs 또는 blank nodes입니다.
SHACL processor는
SPARQL 기반 constraint 또는 validator의
SPARQL property path
sh:prefixes/(^owl:versionIRI?/owl:imports)*/sh:declare의
values인
모든 개별 prefix mappings의 합집합으로 prefix mappings 집합을 수집합니다.
^owl:versionIRI? 요소는
owl:versionIRI로
import된 graphs를 지원하며,
추가 owl:imports를 따라가기 전에 version IRI에서 shapes graph IRI로 이동합니다.
그러한 prefix declarations의 collection이 같은
sh:prefix value에 대해
서로 다른 namespaces를 여러 개 포함하면,
shapes
graph는 ill-formed입니다.
(SHACL processors는 도달하지 않는 prefix declarations를 MAY ignore할 수 있음에 유의하세요).
SPARQL query가 sh:prefixes에 대한 value를 갖지 않는 경우,
system은 sh:ShapesGraph의
SHACL
instance에서 sh:declare의
values인
prefix declarations를
shapes
graph에서 사용합니다.
SHACL processor는 모든 prefix mappings에 대한
PREFIX declarations를 앞에
붙여
sh:select의 values(및 sh:ask와 같은 유사한 properties)를
SPARQL로 변환합니다.
sh:prefix의 각 value는 PNAME_NS가 되고,
sh:namespace의 각 value는 PREFIX declaration의
IRIREF가 됩니다.
위 예제 shapes graph의 경우, SHACL-SPARQL processor는
PREFIX ex: <http://example.com/ns#>와 같은 줄을 생성할 것입니다.
결과 query string을 유효한 SPARQL 1.2 query로 parse할 수 없는 경우,
SHACL-SPARQL processor는 failure를 MUST produce해야 합니다.
이 문서의 나머지 부분에서는 간결성을 위해 sh:prefixes statements가 생략되었을 수 있습니다.
이 절은 sh:SPARQLConstraintComponent의
validator를 설명합니다.
이 validator는 가능한 구현 전략 하나만을 설명하며,
SHACL processors는 결과가 동등한 한 대안적 접근 방식을 선택할 수 있음에 유의하세요.
$sparql을 sh:sparql의 value라고 하자.
SPARQL 기반 constraint가
property sh:deactivated에 대해 true를 value로 가지는 경우,
validation
results는 없습니다.
그렇지 않으면 2.3.1 SPARQL
Constraints의
사전 바인딩된 variable $this에 설명된 대로 variable this를
pre-binding하여
SPARQL 기반 constraint $sparql로 지정된
SPARQL query를 실행합니다.
shape가
property
shape인 경우, 실행 전에
substitute the variable PATH where it appears in the predicate
position of a triple pattern
with a valid SPARQL surface syntax string of the SHACL property path
specified via sh:path at the property shape.
failure variable의
binding으로 true를 갖지 않는 각
solution마다 하나의 validation result가
있습니다.
이러한 validation results는 2.3.2 Solution
Bindings를 Result Properties로 매핑에서 설명한 property values를 MUST
have합니다.
$sparql이 sh:severity에 대한 value를 가지면,
validation result는
해당 value를 자신의 유일한 sh:resultSeverity로 MUST have합니다.
solutions 중 하나가
failure에 대한 binding으로 true를 갖는 경우에만, 그리고 그 경우에만
failure가
MUST be produced합니다.
SPARQL 기반 constraints의
SPARQL queries와
SPARQL 기반 constraint components의
validators가
processed될 때,
SHACL-SPARQL processor는 variable $this의 values를 현재
focus node에
pre-binds합니다.
validation result nodes의 property values는 result solutions와 constraint 자체의 values의 조합을 통해 다음 규칙으로부터 파생됩니다. 규칙은 위에서 아래로 실행되도록 되어 있으므로, 첫 번째 bound value가 사용됩니다.
| 속성 | 생성 규칙 |
|---|---|
sh:focusNode |
|
sh:resultPath |
|
sh:value |
|
sh:resultMessage |
이러한 message literals는
{?varName} 또는 {$varName}을 통해
SELECT result variables의 이름을 포함할 수 있습니다.
constraint가 SPARQL 기반
constraint component에 기반하는 경우, component의
parameter names도 사용할 수 있습니다.
이러한 {?varName} 및 {$varName} blocks는 해당 variables의 값에 대한
적절한 문자열 표현으로 SHOULD replace되어야 합니다.
|
sh:sourceConstraint |
|
SPARQL 기반 제약은 많은 유연성을 제공하지만, 일부 사람에게는 이해하기 어렵거나 반복을 초래할 수 있습니다. 이 절에서는 SPARQL의 복잡성을 추상화하고 Core 제약 컴포넌트와 유사한 고수준의 재사용 가능한 컴포넌트를 선언하는 방법으로 SPARQL 기반 제약 컴포넌트를 소개합니다. 이러한 제약 컴포넌트는 SHACL RDF vocabulary를 사용하여 선언할 수 있으므로 공유하고 재사용할 수 있습니다.
이 절은 비규범입니다.
다음 예제는 SHACL-SPARQL 언어를 사용하여 새로운 제약 컴포넌트를 지정하는 데 SPARQL을
어떻게 사용할 수 있는지 보여 줍니다.
이 예제는 각 value
node가 주어진 regular
expression과 일치하는지 검증하기 위해
sh:pattern과
sh:flags를
SPARQL ASK query를 사용하여 구현합니다.
이는 예제 구현일 뿐이며 규범적인 것으로 간주해서는 안 됩니다.
{
"@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": "Value does not match pattern {$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"
}
}
]
}
제약 컴포넌트는 validation engine에게 shape 안의
제약을
식별하고 검증하는 방법에 대한 지침을 제공합니다.
일반적으로 shape
S가 property p에 대한
value를 가지고,
p를 parameter로 지정하는
constraint
component
C가 있으며, S가 C의 모든 mandatory
parameters에 대한 값을 가지고 있다면,
이러한 parameter values의 집합(optional parameters 포함)은
제약을 선언하고,
validation engine은 이 제약의 검증을 수행하기 위해 C에서 적절한
validator를 사용합니다.
위 예제에서 sh:PatternConstraintComponent는 mandatory parameter
sh:pattern,
optional parameter sh:flags,
그리고 node shapes
또는 property
shapes에 대해
검증을 수행하는 데 사용할 수 있는
validator를
선언합니다.
SPARQL 기반 제약 컴포넌트는
IRI이며,
shapes graph
안에서
sh:ConstraintComponent라는
SHACL type을
가집니다.
이 문서에서 새로운 제약 컴포넌트를 선언하는 메커니즘은 SPARQL에 기반한 것들로 제한됩니다. 그러나 parameters와 validators를 선언하는 일반 구문은 JavaScript와 같은 다른 extension languages에도 작동하도록 설계되었습니다.
parameters of a
constraint component는
property sh:parameter를 통해 선언됩니다.
sh:parameter의 values를 parameter
declarations라고 합니다.
class sh:Parameter는 type of parameter declarations로 사용할 수 있지만,
그러한 triple은 필수가 아닙니다.
각
parameter declaration은
property sh:path에 대해 정확히 하나의 value를 가집니다.
parameter
declarations에서
sh:path의 value는
IRI입니다.
IRI의
local name은
IRI 끝에 있는 가장 긴
NCNAME으로 정의되며,
이때 IRI 안의 첫 번째
colon 바로 뒤에 있으면 안 됩니다.
parameter declaration의
parameter name은
sh:path의 local name of the value로 정의됩니다.
parameters를 SPARQL variables로 올바르게 매핑할 수 있도록 다음 구문 규칙이 적용됩니다.
모든 parameter name은 유효한
SPARQL VARNAME입니다.
Parameter names는 다음 중 하나여서는 안 됩니다.
this, path, PATH, value.
두 개 이상의
parameter declarations가
같은 parameter names를 사용하는 constraint component는
ill-formed입니다.
sh:optional의 values는 datatype xsd:boolean을 가진 literals여야 합니다.
parameter declaration은
property sh:optional에 대해 최대 하나의 value를 가질 수 있습니다.
true로 설정되면 parameter declaration은
optional
parameter를 선언합니다.
모든 constraint
component는
적어도 하나의 non-optional parameter를 가집니다.
class sh:Parameter는
sh:PropertyShape의 SHACL subclass로 정의되며,
property shapes에 적용 가능한 모든 properties를 parameters에도 사용할 수 있습니다.
여기에는 sh:name 및 sh:description과 같은 descriptive properties뿐 아니라
sh:class와 같은 constraint parameters도 포함됩니다.
parameters에
대해 선언된 constraints에 conform하지 않는 shapes는
ill-formed입니다.
일부 구현은 유효하지 않은 parameter values로 constraint components가 실행되는 것을 막기 위해 이러한
constraint parameters를 사용할 MAY 있습니다.
property sh:labelTemplate는 어떤
constraint component에서도
constraints를
사람에게 어떻게 렌더링할 수 있는지
제안하는 데 사용할 수 있습니다.
sh:labelTemplate의 values는 strings(가능하면 language tag 포함)입니다 그리고
이를 label templates라고 합니다.
이 절의 나머지는 비규범입니다.
Label templates는 constraint component에 대해 선언된
parameters의 이름을 포함할 수 있으며,
{?varName} 또는 {$varName} 구문을 사용합니다.
여기서 varName은 parameter name의 이름입니다.
표시 시점에는 이러한 {?varName} 및 {$varName} blocks가
실제 parameter values로 대체되어야 합니다.
같은 subject에 대해 여러 label templates가 있을 수 있지만, 같은 language tags를 가져서는 안 되며,
datatype xsd:string을 가진 template가 둘 이상 있어서는 안 됩니다.
지원되는 각 shape type(즉, property shape 또는 node shape)마다 constraint component는 적절한 validator를 선언합니다. 주어진 constraint에 대해 validator는 다음 규칙을 순서대로 사용하여 constraint component에서 선택됩니다.
sh:nodeValidator의 values 중 하나를 사용합니다.sh:propertyValidator의 values 중 하나를 사용합니다.sh:validator의 values 중 하나를 사용합니다.
적절한 validator를 찾을 수 없으면 SHACL-SPARQL processor는 constraint를 무시합니다.
SHACL-SPARQL은 두 가지 유형의 validators를 포함합니다. sh:nodeValidator 및
sh:propertyValidator용
SPARQL
SELECT 기반 validators와
sh:validator용
SPARQL ASK queries 기반 validators입니다.
sh:SPARQLSelectValidator라는
SHACL
type을 가진
Validators를
SELECT 기반 validators라고 합니다.
sh:nodeValidator의 values는 SELECT 기반 validators여야 합니다.
sh:propertyValidator의 values는 SELECT 기반 validators여야 합니다.
SELECT 기반 validators는
property sh:select에 대해 정확히 하나의
value를
가집니다.
sh:select의 value는 앞서 언급한 prefix handling rules를 사용하는
유효한 SPARQL SELECT query입니다.
sh:select의 value에서 파생된 SPARQL query는 SELECT clause에서 variable
this를 projects합니다.
이 절의 나머지는 비규범입니다.
다음 예제는 SPARQL SELECT query를 기반으로 한 constraint component의 선언을 보여 줍니다.
이는 2.1 SPARQL 기반
제약의 예에서 나온 예제의 일반화된 변형입니다.
그 SPARQL query에는 특정 property ex:germanLabel과
language tag de라는 두 개의 constants가 포함되어 있었습니다.
constraint components는 이러한 시나리오를 일반화하여 constants가
pre-bound with parameters되도록 할 수 있습니다.
이를 통해 새로운 SPARQL을 작성하지 않고도 query logic을 여러 곳에서 재사용할 수 있습니다.
{
"@id": "ex:LanguageConstraintComponentUsingSELECT",
"@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:propertyValidator": {
"@type": "sh:SPARQLSelectValidator",
"sh:message": "Values are literals with language \"{?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"
}
}
constraint component가 (shapes graph 안에서) 선언되면, 그 parameters는 다음 예제와 같이 사용할 수 있습니다.
{
"@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"
}
}
위 example shape는 ex:germanLabel의 모든 values가 language tag
de를 가져야 하고,
ex:englishLabel의 모든 values는 language로 en을 가져야 한다는 조건을 지정합니다.
이러한 세부 사항은 constraint component가 요구하는
ex:lang parameter의 values를 가진 두 property shapes를 통해 지정됩니다.
많은 constraint components는 모든 value nodes를 어떤 boolean condition에 대해 개별적으로 테스트하는 형태입니다. 이를 위해 SELECT queries를 작성하는 것은 번거로워지며, 특히 constraint component가 property shapes와 node shapes 모두에 사용될 수 있는 경우 더욱 그렇습니다. SHACL-SPARQL은 ASK queries 기반 validators를 위한 대안적인 더 간결한 구문을 제공합니다.
sh:SPARQLAskValidator라는
SHACL
type을 가진
Validators를
ASK
기반 validators라고 합니다.
sh:validator의 values는 ASK 기반
validators여야 합니다.
ASK 기반 validators는
property sh:ask에 대해 정확히 하나의 value를 가집니다.
sh:ask의 value는 datatype xsd:string을 가진 literal이어야 합니다.
sh:ask의 value는
앞서 언급한 prefix
handling rules를 사용하는 유효한 SPARQL ASK query여야 합니다.
이 절의 나머지는 비규범입니다.
ASK queries는 주어진 value node
(value라는 pre-bound variable로 표현됨)가 constraint에 conform하는 경우에만
true를 반환합니다.
다음 예제는 ASK query를 사용하는 constraint component를 선언합니다.
{
"@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 query가 구현하는 validation condition은 SELECT counterpart와 "반대 방향"이라는 점에 유의하세요.
ASK queries는 constraint에 conform하는 value nodes에 대해 true를 반환하는 반면,
SELECT queries는 conform하지 않는 value nodes를 반환합니다.
이 절은 SPARQL 기반 제약 컴포넌트의 validator를 정의합니다. 이 validator는 가능한 구현 전략 하나만을 설명하며, 결과가 동등한 한 SHACL processors가 대안적 접근 방식을 선택할 수 있음에 유의하세요.
첫 번째 단계로, 3.2.3 Validators에 개요가 제시된 규칙에 따라 validator가 MUST 선택되어야 합니다. 그런 다음 다음 규칙이 적용되어 SPARQL queries의 solutions 집합을 생성합니다.
v를 variable value에
pre-bound한 상태에서 false를 반환하는 각
value
node v에 대해,
($this, focus node)와
($value, v)의 bindings로 구성된 하나의
solution을 생성합니다.
QS를 이러한 solutions의 목록이라고 합니다.
PATH where it appears in
the predicate
position of a triple pattern
with a valid SPARQL surface syntax string of the SHACL property path
specified via sh:path at the property shape.
QS를 SPARQL query를 실행하여 생성된 solutions라고 합니다.
위 SPARQL query executions는 2.3.1 SPARQL Constraints의 사전 바인딩된 variable $this에 설명된 대로
variable this를 pre-bind해야 MUST 합니다.
또한 constraint 안의
constraint
component의
parameter에 대한
각 value는
그 이름으로 parameter name을 갖는 variable로
pre-bound되어야 MUST 합니다.
validation
results에 대한
production rules는 위에서 생성된 QS solutions를 사용하여
SPARQL 기반 constraints에 대한 것과 동일합니다.
이 절은 SPARQL 기반 constraints 또는 constraint components를 사용하여 validation results를 생성하는 일반 mechanism을 확장합니다.
이 기능을 지원하는 구현은 SPARQL 기반
constraint 또는 constraint
component의
SELECT queries가 생성한 각 solution에 대해 만들어지는
validation
result nodes에
annotation
properties를 주입할 수 있게 합니다.
그러한 annotation property는 sh:select 또는 sh:ask
triple의
subject에서
sh:resultAnnotation의
value를 통해 선언되어야 합니다.
sh:resultAnnotation의
values를
result annotations라고 하며,
이는 IRIs 또는 blank
nodes입니다.
Result annotations는 다음 properties를 가집니다.
| Property | 요약 및 구문 규칙 |
|---|---|
sh:annotationProperty |
설정되어야 하는 property입니다.
각 result annotation은
property sh:annotationProperty에 대해 정확히 하나의
value를 가지며,
이 value는 IRI입니다.
|
sh:annotationVarName |
annotation values를 가져올 SPARQL variable의 이름입니다.
각 result annotation은
property sh:annotationVarName에 대해 최대 1개의
value를 가지며,
이 value는
xsd:string
datatype을 가진
literal입니다.
|
sh:annotationValue |
기본값으로 사용되어야 하는 constant RDF terms입니다. |
SELECT result set의 각 solution에 대해, annotations를 지원하는 SHACL processor는
선언된 result annotations를 순회합니다.
result annotations에서 SPARQL variables로의 mapping은 다음 규칙을 사용합니다.
sh:annotationVarName의
value를 사용합니다
sh:annotationProperty의
value의
local
name을 variable name으로 사용합니다.
variable name을 결정할 수 있으면, SHACL processor는 주어진 variable에 대한
binding을
sh:annotationProperty를 사용하여 지정된 property의 value로 복사하여,
현재 solution에 대해 생성 중인
validation
result에 넣습니다.
result set solution에서 variable에
binding이 없으면,
존재하는 경우 sh:annotationValue의
values가 사용됩니다.
다음은 result annotations의 사용을 보여 주는 예제입니다.
ex:AnnotationExample
a sh:NodeShape ;
sh:targetNode ex:ExampleResource ;
sh:sparql [ # _:b1
sh:resultAnnotation [
sh:annotationProperty ex:time ;
sh:annotationVarName "time" ;
] ;
sh:select """
SELECT $this ?message ?time
WHERE {
BIND (CONCAT("The ", "message.") AS ?message) .
BIND (NOW() AS ?time) .
}
""" ;
] .
검증은 다음 validation report를 생성합니다.
[ a sh:ValidationReport ;
sh:conforms false ;
sh:result [
a sh:ValidationResult ;
sh:focusNode ex:ExampleResource ;
sh:resultMessage "The message." ;
sh:resultSeverity sh:Violation ;
sh:sourceConstraint _:b1 ;
sh:sourceConstraintComponent sh:SPARQLConstraintComponent ;
sh:sourceShape ex:AnnotationExample ;
ex:time "2015-03-27T10:58:00"^^xsd:dateTime ; # Example
]
] .
이 절은 SPARQL 기반 node expression functions를 소개합니다.
sh:select에 대한
value를 가진
node
expression을
function name
sh:SelectExpression을 가진
select
expression이라고 합니다.
RDF graph의
node는 blank
node이며,
predicate
sh:select에
대해 정확히 하나의
value를 가지고,
이 value가
xsd:string
datatype을 가진
literal인
경우,
well-formed
select expression입니다.
well-formed
select expression은
property sh:prefixes에 대해 최대 하나의
value를 가질 수 있으며,
이 value는 IRI 또는 blank node일
수 있습니다.
prefix handling
rules를 사용하면, sh:select의 value는 유효한 SPARQL 1.2 SELECT query입니다.
sh:select의 value에서 파생된 SPARQL
query는
SELECT clause에서 정확히 하나의 variable을
projects합니다.
select expression의
output
nodes는 query가
focus
graph에 대해 평가될 때,
SELECT clause에서 projected된 (유일한) variable의 bindings만으로 정확히 구성된
목록 resultNodes입니다.
focusNode의 value는 SPARQL variable this의 value로
pre-bound됩니다.
각 scope variable의 value는 같은 이름과 value를 가진 SPARQL variable로
pre-bound됩니다.
scope variables 중 하나가 this라고 불리는 경우
failure가
생성됩니다.
evalExpr(expr, focusGraph, focusNode, scope) -> resultNodes
이 절의 나머지는 비규범입니다.
다음은 select expression 사용 예로,
property "full name"에 대한 property shape의 values를
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"
}
}
]
}
이 예제는 또한 parsing 전에 query의 시작 부분에 PREFIX declarations를 삽입하기 위해
sh:prefixes를 사용하는 방법을 보여 줍니다.
query는 현재 focus
node가 variable
this에 pre-bound된 상태로 실행된다는 점에 유의하세요.
다음은 select expression 사용 예로,
shape의 target nodes를 ex:age가 18보다 작은
ex:Person의 모든 instances로 계산합니다.
{
"@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"
}
}
다음 data graph에서 ex:Benjamin만 target node입니다.
{
"@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에 대한
value를 가진
node
expression을
function name
sh:SPARQLExprExpression을 가진
SPARQL expr
expression이라고 합니다.
RDF graph의 node는
blank
node이며,
predicate
sh:sparqlExpr에 대해 정확히 하나의
value를 가지고,
그 value가
xsd:string
datatype을 가진
literal인
경우,
well-formed
SPARQL expr expression입니다.
well-formed
SPARQL expr expression은
property sh:prefixes에 대해 최대 하나의
value를 가질 수 있으며,
이 value는 IRI 또는 blank
node입니다.
$EXPR$를
sh:eval의 value라고 하고,
$PREFIXES$를 sh:prefixes의 value를 사용하여
prefix handling rules에서 나온 SPARQL prefixes block이라고 하면,
select는 $EXPR$와
$PREFIXES$가 다음에 삽입된 문자열로 정의됩니다.
$PREFIXES$ SELECT ($EXPR$ AS ?result) WHERE {}
select는 유효한 SPARQL 1.2 SELECT
query입니다.
SPARQL expr expression의
output
nodes는 query가
focus graph에
대해 평가될 때,
위에서 정의한 select query의 SELECT clause에서 projected된
(유일한) variable의 bindings만으로 정확히 구성된 목록
resultNodes입니다.
focusNode의 value는 SPARQL variable this의 value로
pre-bound됩니다.
각 scope variable의 value는 같은 이름과 value를 가진 SPARQL variable로
pre-bound됩니다.
scope variables 중 하나가 this라고 불리는 경우
failure가
생성됩니다.
evalExpr(expr, focusGraph, focusNode, scope) -> resultNodes
이 절의 나머지는 비규범입니다.
다음은 SPARQL expr expression 사용 예로, property "uri length"에 대한 property shape의 values를 focus node의 IRI 길이로 계산합니다.
{
"@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를 가진 focus node에 적용하면 결과는
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"
}
}
query는 현재 focus
node가 variable
this에 pre-bound된 상태로 실행된다는 점에 유의하세요.
SHACL-SPARQL의 일부 기능은 이 절에서 정의하는 variables의 사전 바인딩 개념에 의존합니다.
이 기능은 "at risk"이며, 이 영역에서 현재 진행 중인 RDF 및 SPARQL 1.2 작업과 맞추기 위해 변경될 수 있습니다(제거되지는 않음). 원래 Issue 647로 논의되었습니다.
SHACL에서 사용하는 pre-binding의 정의는 SPARQL queries에 대해 다음 제한을 요구합니다.
SHACL-SPARQL processors는 sh:select 및 sh:ask를 통해
이러한 "MUST" 제한 중 하나라도 위반하는 SHACL-SPARQL queries를 포함하는
shapes graph를
처리할 때 failure를
MUST 보고해야 합니다.
잠재적으로 pre-bound된 variables라는 용어에는 this,
value(ASK queries의 경우),
그리고 query를 사용하는 constraint
component의 parameters를 나타내는 모든 variables가 포함됩니다.
MINUS clause를 포함해서는 MUST 안 됩니다VALUES clause를 포함해서는
MUST 안 됩니다
AS ?var syntax form을 사용해서는
MUST 안 됩니다
또한 SPARQL queries는 federated query(SERVICE)를 포함하지 않는 것이
SHOULD입니다.
SERVICE를 허용하지 않는 구현은 위에서 언급한 것처럼 failure를
MUST 보고해야 합니다.
그러나 일부 SPARQL 구현이 SERVICE keyword를
특정(일반적으로 local) 작업을 위한 syntax로 사용한다는 점이 인정되므로,
이 keyword가 일반적으로 금지되는 것은 아닙니다.
solution mapping μ에 대해, Table(μ)를
μ에서 형성된 multiset으로 정의합니다.
Table(μ) = { μ }
Card[μ] = 1
Values Insertion 함수 Replace(X, μ)를
X 안에 있는
Basic Graph
Pattern,
Property Path
Expression,
Graph(Var, pattern)의
각 발생 Y를 join(Y, Table(μ))로 바꾸는 것으로 정의합니다.
pre-bound variables μ를 가진
SPARQL Query
Q = (E, DS, QF)의 평가는 SPARQL query
Q' = (Replace(E, μ), DS, QF)의 평가로 정의됩니다.
이 절은 SHACL의 모든 규범적 구문 규칙을 열거합니다. 이 절은 이 명세의 다른 부분에서 자동으로 생성되며, 규칙의 맥락이 불명확한 경우 본문으로 돌아가는 hyperlinks가 제공됩니다. shapes graph에서 이러한 규칙을 위반하는 nodes는 ill-formed입니다.
| Syntax Rule Id | Syntax Rule Text |
|---|---|
| sparql-nodeKind | Shapes는 property sh:sparql에 대한 values를 가질 수 있으며,
이러한 values는 IRIs 또는
blank
nodes입니다.
|
| SPARQLConstraint-select-count | SPARQL 기반 constraints는
property sh:select에 대해 정확히 하나의 value를 가집니다 |
| SPARQLConstraint-select-datatype | sh:select의 value는 datatype
xsd:string의 literal입니다.
|
| select-query-valid | prefix handling rules를 사용하면, sh:select의 value는
유효한 SPARQL 1.2 SELECT query입니다. |
| select-query-this | sh:select의 value에서 파생된 SPARQL query는 SELECT clause에서 variable
this를 projects합니다.
|
| SPARQLConstraint-message-datatype | SPARQL 기반 constraints는
property sh:message에 대한 values를 가질 수 있으며,
이들은 datatype
xsd:string, rdf:dirLangString, rdf:langString, 또는
rdf:HTML을 가진 literals입니다.
같은 language tag를 가진 sh:message value가 둘 이상 있거나,
datatype xsd:string의 value가 여러 개 있어서는 안 됩니다.
|
| SPARQLConstraint-deactivated-maxCount | SPARQL 기반 constraints는
property sh:deactivated에 대해 최대 하나의 value를 가질 수 있습니다 |
| SPARQLConstraint-severity | SPARQL 기반 constraints는
property sh:severity에 대해 최대 하나의 value를 가질 수 있으며,
이 value는 IRI입니다.
|
| PATH-position | SPARQL 기반 constraints
및 SELECT 기반 validators의 SPARQL queries에서
variable PATH의 유일한 적법한 사용은
triple pattern의
predicate
position입니다.
|
| prefix-count | Prefix declarations는
property sh:prefix에 대해 정확히 하나의 value를 가집니다 |
| prefix-datatype | sh:prefix의 values는 datatype
xsd:string의 literals입니다.
|
| namespace-count | Prefix declarations는
property sh:namespace에 대해 정확히 하나의 value를 가집니다. |
| namespace-datatype | sh:namespace의 values는 datatype
xsd:anyURI 또는 xsd:string의 literals입니다.
|
| declare-nodeKind | property sh:declare의 values는
prefix declarations입니다
|
| prefixes-nodeKind | sh:prefixes의 values는 IRIs 또는 blank nodes입니다. |
| prefixes-duplicates | SHACL processor는
SPARQL 기반 constraint 또는 validator의
SPARQL
property path
sh:prefixes/(^owl:versionIRI?/owl:imports)*/sh:declare의
values인
모든 개별 prefix mappings의 합집합으로 prefix mappings 집합을 수집합니다.
^owl:versionIRI? element는
owl:versionIRI로
import된 graphs를 지원하며,
추가 owl:imports를 따르기 전에 version IRI에서 shapes graph IRI로 이동합니다.
이러한 prefix declarations collection이 같은
sh:prefix value에 대해
서로 다른 namespaces를 여러 개 포함하면,
shapes
graph는 ill-formed입니다.
|
| ConstraintComponent | SPARQL 기반 constraint component는
IRI이며,
shapes graph
안에서
sh:ConstraintComponent라는
SHACL type을
가집니다.
|
| Parameter-predicate-count | 각 parameter declaration은
property sh:path에 대해 정확히 하나의 value를 가집니다 |
| Parameter | parameter declarations에서
sh:path의 value는
IRI입니다.
|
| parameter-name-VARNAME | 모든 parameter name은 유효한 SPARQL VARNAME입니다. |
| parameter-name-not-in | Parameter names는 다음 중 하나여서는 안 됩니다.
this, path, PATH, value.
|
| parameter-name-unique | 두 개 이상의 parameter declarations가 같은 parameter names를 사용하는 constraint component는 ill-formed입니다. |
| optional-datatype | sh:optional의 values는 datatype xsd:boolean을 가진 literals여야 합니다. |
| optional-maxCount | parameter declaration은
property sh:optional에 대해 최대 하나의 value를 가질 수 있습니다. |
| ConstraintComponent-parameter | 모든 constraint component는 적어도 하나의 non-optional parameter를 가집니다. |
| Parameter-conformance | parameters에 대해 선언된 constraints에 conform하지 않는 shapes는 ill-formed입니다. |
| labelTemplate-datatype | sh:labelTemplate의 values는 strings(가능하면 language tag 포함)입니다 |
| nodeValidator-class | sh:nodeValidator의 values는 SELECT 기반
validators여야 합니다. |
| propertyValidator-class | sh:propertyValidator의 values는 SELECT 기반
validators여야 합니다. |
| SPARQLSelectValidator-select-count | SELECT 기반 validators는
property sh:select에 대해 정확히 하나의
value를 가집니다.
|
| validator-class | sh:validator의 values는 ASK 기반
validators여야 합니다. |
| ask-count | ASK 기반 validators는
property sh:ask에 대해 정확히 하나의 value를 가집니다 |
| ask-datatype | sh:ask의 value는 datatype xsd:string을 가진 literal이어야 합니다. |
| ask-sparql | sh:ask의 value는 앞서 언급한
prefix handling rules를 사용하는 유효한 SPARQL ASK query여야 합니다.
|
| resultAnnotation-nodeKind | sh:resultAnnotation의
values를
result annotations라고 하며,
이는 IRIs 또는 blank
nodes입니다
|
| annotationProperty | 각 result annotation은
property sh:annotationProperty에 대해 정확히 하나의
value를 가지며,
이 value는 IRI입니다.
|
| annotationVarName | 각 result annotation은
property sh:annotationVarName에 대해 최대 1개의
value를 가지며,
이 value는
xsd:string
datatype을 가진
literal입니다.
|
| SelectExpression-syntax | RDF graph의 node는 blank node이며,
predicate
sh:select에
대해 정확히 하나의
value를 가지고,
이 value가
xsd:string
datatype을 가진
literal인
경우,
well-formed
select expression입니다.
|
| SelectExpression-syntax-prefixes | well-formed
select expression은
property sh:prefixes에 대해 최대 하나의
value를 가질 수 있으며,
이 value는 IRI 또는 blank node일
수만 있습니다.
|
| SelectExpression-query-valid | prefix handling rules를 사용하면, sh:select의 value는
유효한 SPARQL 1.2 SELECT query입니다. |
| SelectExpression-query-output-nodes | sh:select의 value에서 파생된 SPARQL query는 SELECT clause에서 정확히 하나의 variable을
projects합니다.
|
| SPARQLExprExpression-syntax-eval | RDF graph의 node는
blank
node이며,
predicate
sh:sparqlExpr에 대해 정확히 하나의
value를 가지고,
그 value가
xsd:string
datatype을 가진
literal인
경우,
well-formed
SPARQL expr expression입니다.
|
| SPARQLExprExpression-syntax-prefixes | well-formed
SPARQL expr expression은
property sh:prefixes에 대해 최대 하나의
value를 가질 수 있으며,
이 value는 IRI 또는 blank
node입니다.
|
| SPARQLExprExpression-template | $EXPR$를 sh:eval의
value라고 하고,
$PREFIXES$를 sh:prefixes의 value를 사용하여
prefix handling rules에서 나온 SPARQL prefixes block이라고 하면,
select는 $EXPR$와
$PREFIXES$가 다음에 삽입된 문자열로 정의됩니다.
$PREFIXES$ SELECT ($EXPR$ AS ?result) WHERE {} |
| SPARQLExprExpression-query-valid | select는 유효한 SPARQL 1.2 SELECT query입니다. |
| pre-binding-limitations |
SHACL에서 사용하는 pre-binding의 정의는 SPARQL queries에 대해 다음 제한을 요구합니다.
SHACL-SPARQL processors는
또한 SPARQL queries는 federated query
( |
이 절은 비규범입니다.
이 부록은 [shacl12-core]의 constraint components 및 targets의 의미론에 대한 비규범적 대안 정의에서 SPARQL 1.2의 일부를 사용합니다. 이것들이 일부 구현자에게 도움이 될 수는 있지만, SHACL Core language 구현에 SPARQL이 필요한 것은 아닙니다.
$ marker를 사용하는 SPARQL variables는 SPARQL query 실행 전에
pre-bound되거나,
$PATH의 경우 substituted되는 외부
bindings를
나타냅니다
(3.3 SPARQL 기반
Constraint Components를 사용한 검증에서 설명함).
다음 query는 class targets의 잠재적 정의를 SPARQL로
표현합니다.
variable targetClass는
sh:targetClass의 주어진 value에
pre-bound됩니다.
solutions에서 나온 variable this의 모든
bindings는
focus nodes가 됩니다.
SELECT DISTINCT ?this # ?this is the focus node
WHERE {
?this rdf:type/rdfs:subClassOf* $targetClass .
}
다음 query는 subjects-of targets의 잠재적
정의를
SPARQL로 표현합니다.
variable targetSubjectsOf는
sh:targetSubjectsOf의 주어진 value에
pre-bound됩니다.
solutions에서 나온 variable this의 모든
bindings는
focus nodes가 됩니다.
SELECT DISTINCT ?this # ?this is the focus node
WHERE {
?this $targetSubjectsOf ?any .
}
다음 query는 objects-of targets의 잠재적 정의를
SPARQL로 표현합니다.
variable targetObjectsOf는
sh:targetObjectsOf의 주어진 value에
pre-bound됩니다.
solutions에서 나온 variable this의 모든
bindings는 focus nodes가 됩니다.
SELECT DISTINCT ?this # ?this is the focus node
WHERE {
?any $targetObjectsOf ?this .
}
다음 query는 sh:class에 대한 잠재적 SPARQL 기반 validator를 표현합니다.
ASK {
$value rdf:type/rdfs:subClassOf* $class .
}
다음 query는 sh:nodeKind에 대한 잠재적 SPARQL 기반 validator를 표현합니다.
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 ) )) .
}
다음 query는 sh:minExclusive에 대한 잠재적 SPARQL 기반 validator를 표현합니다. SPARQL expression은 예를 들어 누군가 문자열을 정수와 비교하는 경우처럼 value node를 지정된 범위와 비교할 수 없으면 error를 생성합니다. 비교를 수행할 수 없으면 validation result가 있습니다. 이는 예를 들어 일반 SPARQL query에서 그러한 errors가 조용히 어떤 results도 만들지 않는 것과 다릅니다.
ASK {
FILTER ($minExclusive < $value)
}
다음에 대해서도 유사한 정의가 가능합니다.
다음 query는 sh:minLength에 대한 잠재적 SPARQL 기반 validator를 표현합니다.
ASK {
FILTER (STRLEN(str($value)) >= $minLength) .
}
다음 query는 sh:maxLength에 대한 잠재적 SPARQL 기반 validator를 표현합니다.
ASK {
FILTER (STRLEN(str($value)) <= $maxLength) .
}
다음 query는 sh:pattern에 대한 잠재적 SPARQL 기반 validator를 표현합니다.
ASK {
FILTER (!isBlank($value) && IF(bound($flags), regex(str($value), $pattern, $flags), regex(str($value), $pattern)))
}
다음 query는 sh:disjoint에 대한 잠재적 SPARQL 기반 validator를 표현합니다.
SELECT DISTINCT $this ?value
WHERE {
$this $PATH ?value .
$this $disjoint ?value .
}
다음 query는 sh:lessThan에 대한 잠재적 SPARQL 기반 validator를 표현합니다.
SELECT $this ?value
WHERE {
$this $PATH ?value .
$this $lessThan ?otherValue .
BIND (?value < ?otherValue AS ?result) .
FILTER (!bound(?result) || !(?result)) .
}
다음 query는 sh:lessThanOrEquals에 대한 잠재적 SPARQL 기반 validator를 표현합니다.
SELECT $this ?value
WHERE {
$this $PATH ?value .
$this $lessThanOrEquals ?otherValue .
BIND (?value <= ?otherValue AS ?result) .
FILTER (!bound(?result) || !(?result)) .
}
이 절은 비규범입니다.
GRAPH 및 FROM과 같은 SPARQL key words는 dataset 안에서
active data graph가 아닌 graphs에 대한 접근을 제공할 수 있음에 유의하세요.
SHACL-SPARQL engine은 SPARQL engine이 validation을 트리거한 user에게 접근이 허용되지 않은
named graphs에 대한 접근을 제공하지 않도록 보장해야 합니다.
SHACL-SPARQL의 보안 고려사항에는
SPARQL,
SPARQL Federated Query
(SERVICE) 및
SHACL Core의
모든 보안 고려사항이 포함됩니다.
이 절은 비규범입니다.
원래 SHACL core specifications는 RDF Data Shapes Working Group에서 작성했습니다. Core specification의 Acknowledgements section과 Advanced Features specification의 Acknowledgements section을 참조하세요.
이 절은 비규범입니다.
sh:SelectExpression 추가, Issue 288 참조
sh:SPARQLExprExpression 추가, Issue 315 참조
shapesGraph 및
currentShape 지원 제거, Issue 426
참조
sh:severity를 직접 지정할 수 있음, Issue 573 참조sh:prefixes가 없으면 system은
어떤 sh:ShapesGraph에서든 선언된
sh:prefix/sh:namespace 쌍을 사용함, Issue 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:
Referenced in: