SHACL (Shapes Constraint Language) is a language for describing and constraining the contents of RDF graphs. SHACL groups these descriptions and constraints into "shapes", which specify conditions that apply at a given RDF node. Shapes provide a high-level vocabulary to identify predicates and their associated cardinalities, datatypes and other constraints. Additional constraints can be associated with shapes using SPARQL. The vocabulary of SHACL has been designed to support similar extension languages besides SPARQL. These extension languages can also be used to define new high-level vocabulary terms. SHACL shapes can be used to communicate information about data structures associated with some process or interface, generate or validate data, or drive user interfaces. This document defines the SHACL language and its underlying semantics.

Revision History

The detailed list of changes and their diffs can be found in the Git repository.

Document Outline

The sections 2 - 5 cover the SHACL Core Profile and may be read independently from the later sections.

The sections 6 onwards are about the advanced features of the SHACL language, including templates, functions, and execution semantics.

The Appendix provides a Glossary of Key Concepts that may also serve as a quick overview of the language.

The examples in this document use Turtle [[!turtle]]. The reader should be familiar with basic RDF concepts [[!rdf11-concepts]] such as triples and (for the advanced concepts of SHACL) with SPARQL [[!sparql11-overview]].

Introduction

SHACL (Shapes Constraint Language) is a language for describing and constraining RDF graphs. SHACL can be used with RDF graphs that are obtained by any means, e.g. from the file system, HTTP requests, or RDF datasets. SHACL groups descriptive information and constraints that apply to a given data node into shapes. This document defines what it means for an RDF graph, referred to as the "data graph", to conform to a graph containing SHACL shapes, referred to as the "shapes graph". Conformance can be programmatically checked by processors referred to as SHACL validation engines. The process of checking conformance is referred to as validation. A shape may include a scope which defines which nodes in the data graph must conform to it. When a data node is checked for conformance to a shape, that node is referred to as the focus node. The output of the validation process is a validation report which indicates whether or not the data graph conforms to the shapes graph. If any constraints are not satisfied, then the validation report will include one or more violations which indicate the source of the problem.

For example, SHACL can be used to check whether all the nodes in a data graph that have a type link to foaf:Person have a single value for foaf:mbox, and that that value is an IRI. SHACL can also be used to check whether a particular node in a data graph, say the node ex:bug1, has at least one value for ex:reportedBy and all such values have an rdf:type link to foaf:Person.

The simplest interface to a SHACL processor has two inputs:

For example, one might use SHACL to determine whether data graphs that contain information about issues and users conform to the following constraints:

A shapes graph that defines these constraints has two shapes. The first, ex:IssueShape contains the two constraints on issues. The second, ex:UserShape, contains the two constraints on reporters. ex:IssueShape contains scope information which in this case says that its constraints apply to all nodes that have an rdf:type link to either ex:Issue directly or to a (transitive) subclass of ex:Issue following rdf:subClassOf triples.

ex:IssueShape
	a sh:Shape ;
	sh:scopeClass ex:Issue;
	sh:property [
		sh:predicate ex:state ;
		sh:in (ex:unassigned ex:assigned) ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
	] ;
	sh:property [
		sh:predicate ex:reportedBy ;
		sh:valueShape ex:UserShape ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
	] .

ex:UserShape
	a sh:Shape ;
	sh:property [
		sh:predicate foaf:name ;
		sh:datatype xsd:string ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
	] ;
	sh:property [
		sh:predicate foaf:mbox ;
		sh:nodeKind sh:IRI ;
		sh:minCount 1 ;
	] .

The following data graph might be validated against this shapes graph.

inst:Issue1
	a ex:Issue ;
	ex:state ex:unassigned ;
	ex:reportedBy inst:User2 .

inst:User2
	a foaf:Person ;
	foaf:name "Bob Smith" ;
	foaf:mbox <mailto:[email protected]> ;
	foaf:mbox <mailto:[email protected]> .

inst:Issue3
	a ex:Issue ;
	ex:state ex:unsigned ;
	ex:reportedBy inst:User4 .

inst:User4
	a foaf:Person ;
	foaf:name "Bob Smith", "Robert Smith" ;
	foaf:mbox <mailto:[email protected]> ;
	foaf:mbox <mailto:[email protected]> .

The SHACL validation would validate ex:IssueShape against inst:Issue1 and inst:Issue3. Validating the first node would determine that inst:Issue1 satisfies the constraints in ex:IssueShape, along the way determining that inst:User2 satisfies the constraints in ex:UserShape. Validating the second node would determine that inst:Issue3 violates the constraint on values for ex:state, because ex:unsigned is not in the list of allowed values (the correct value is ex:unassigned), and also violates the constraint on values for ex:reportedBy, because inst:User4 violates the ex:UserShape constraint on the maximum number of values for foaf:name.

Relationship between SHACL and RDFS

SHACL uses RDF and RDFS vocabulary (in particular rdf:type, rdfs:Class, rdfs:subClassOf, rdf:Property, rdf:List, rdf:langLiteral, and rdfs:Resource) and notions (notably classes, instances, and subclasses). However, SHACL does not always use this vocabulary or these notions in exactly the way that they are formally defined in RDF and RDFS [[!rdf11-mt]].

When determining subclass and instance relationships SHACL only uses the transitive closure of rdfs:subClassOf, without requiring in particular the RDF axioms, the RDFS meaning of rdfs:Resource, the reflexivity of rdfs:subClassOf, the effect of subproperties of rdfs:subClassOf, and the effects of rdfs:domain and rdfs:range.

Note that rdfs:subClassOf transitivity is not uniformly applied throughout SHACL. It is only used when SHACL explicitly determines type and subclass relationships in the shapes graph and the data. In other places only triples that are explicitly present in the shapes graph or the data are considered. For example, SHACL property constraints on rdf:type and rdfs:subClassOf only utilize triples that are explicitly in the data. Similarly, subproperties of rdfs:label and rdfs:commment and subclasses of rdf:List are not recognized in the shapes graph.

These design decisions mean that SHACL processors do not have to natively support full RDFS inferencing. However, SHACL validation engines may operate on RDF graphs that include entailments - either pre-computed before being submitted to a SHACL processor or performed on the fly as part of SHACL processing. To support on the fly processing of entailments, SHACL includes the property sh:entailment to indicate what kind of inferencing is required by a given shapes graph. SHACL implementations may, but are not required to, support entailment regimes.

In the remainder of this document, the following terminology is used:

Relationship between SHACL and SPARQL

This specification uses parts of SPARQL 1.1 in the normative definition of the semantics of the SHACL Core constraints and scopes. However, SPARQL is not required for the implementation of the SHACL Core language.

SPARQL variables starting with $ represent external values that must be injected in the query before execution.

In some places, the specification assumes that the provided SPARQL engines are preserving the identity of blank nodes, so that repeated invocations of queries consistently identify and communicate the same blank nodes.

The definition of some constraints requires or is simplified through access to the shapes graph during query execution. SHACL validation engines MAY pre-bind the variable $shapesGraph to provide access to the shapes graph. Access to the shapes graph is not a requirement for supporting the SHACL core language. The variable $shapesGraph can also be used in user-defined SPARQL constraints and constraint components . However, such constraints may not be interoperable across different SHACL validation engines or not applicable to remote RDF datasets.

Some SHACL constraints are defined with the use of the sh:hasShape function. SHACL additionally introduces mechanisms to define constraints, scopes and new functions in SPARQL. Implementations that cover only the the SHACL Core features are not required to implement these mechanisms or the sh:hasShape function.

The button below can be used to show or hide the SPARQL definitions.

Namespaces

Within this document, the following namespace prefix bindings are used:

Prefix Namespace
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#

Note that the URI of the graph defining the SHACL vocabulary itself is equivalent to the namespace above, i.e. it includes the #. References to the SHACL vocabulary, e.g. via owl:imports SHOULD include the #.

TODO: We still need to mark non-normative sections.

Part 1: Core Features

Shapes

Shapes are instances of the class sh:Shape and define a group of constraints that a set of focus nodes can be validated against. The set of focus nodes may be defined explicitly in a shape using scopes and filter shapes, or provided by the validation engine as defined in later sections. Shape scopes instruct a SHACL validation engine how to select the focus nodes. Shapes with scopes MAY additionally provide filter shapes. Filter shapes further refine the focus nodes to the ones that conform to a set of filter shapes. The following figure provides a workflow of the scoping and filtering process. SHACL validation engines MAY alter the order of the depicted steps as long as the returned validation results are correct.

Illustration of the scoping and filtering process

Scopes

Scopes define the set of focus nodes for a shape and SHACL provides three scope types:

When multiple scopes are provided in a shape, the scope of a shape is the union of all focus nodes produced by these scopes. Focus nodes produced by scopes may not exist in the data graph.

Node scopes (sh:scopeNode)

Shapes define node scopes with the sh:scopeNode predicate. The value of a node scope can be an IRI or a Literal.

ex:PersonShape
	a sh:Shape ;
	sh:scopeNode ex:Alice .
ex:Alice a ex:Person .
ex:Bob a ex:Person .

Class-based Scopes (sh:scopeClass)

Shapes define class scopes with the sh:scopeClass predicate. The value is an IRI that is assumed to be an instance of rdfs:Class. It is of no concern to SHACL if the IRI is indeed an instance of rdfs:Class or where this definition exists.

A shape with a class-based scope selects all focus nodes that are instances of the class IRI.

ex:PersonShape
	a sh:Shape ;
	sh:scopeClass ex:Person .
ex:Alice a ex:Person .
ex:Bob a ex:Person .
ex:NewYork a ex:Place .
Note that, according to the SHACL instance definition, all the rdfs:subClassOf declarations must exist in the data graph. However, the ex:Person a rdfs:Class triple is not required to exist in either graphs.
ex:Doctor rdfs:subClassOf ex:Person .
ex:Who a ex:Doctor .

Implicit Class Scopes

Shapes and classes are independent concepts in SHACL. In many applications, classes and shapes are separate resources and are therefore given different IRIs. However, some application designers may find it more convenient to tightly couple class and shape information and use the same IRI for both.

If, in the shapes graph, a shape is an instance of both sh:Shape and rdfs:Class the shape must get an implicit class scope of the class IRI and the sh:scopeClass triple MAY be omitted.

ex:Person
	a rdfs:Class, sh:Shape ;
	sh:scopeClass ex:Person .  #this triple can be omitted
TODO: move this to "Non-Validating Constraint" section?
The following paragraph about sh:abstract is not yet approved by the WG. Options include:
  • No support of abstract classes
  • Use sh:abstract entirely for documentation purposes
  • Use sh:abstract also as a constraint check, possibly producing a warning

Classes may be declared to be abstract by setting their property sh:abstract to true. Abstract classes SHOULD not be instantiated directly, i.e. every instance of an abstract class SHOULD also have an rdf:type triple to a non-abstract subclass of the abstract class.

General scopes (sh:scope)

SHACL includes a generic mechanism to select focus nodes. A Shape can point to one or more instances of sh:Scope using the sh:scope predicate. SHACL includes four built-in scope classes: sh:PropertyScope, sh:InversePropertyScope, sh:AllSubjectsScope and sh:AllObjectsScope The full SHACL language defines an additional generic scoping mechanism based on SPARQL.

Property scopes (sh:PropertyScope)

The scope class sh:PropertyScope selects all subjects that have at least one value for a given property sh:predicate. In the following SPARQL query, the variable $predicate is assumed to be substituted with the given value of sh:predicate.

SPARQL DEFINITION
SELECT DISTINCT ?this
WHERE {
	?this $predicate ?any .
}

The following example uses sh:PropertyScope to define a constraint that applies to all resources that have any value for the property ex:property:

ex:PropertyScopeExampleShape
	a sh:Shape ;
	sh:scope [
		a sh:PropertyScope ;
		sh:predicate ex:knows ;
	] .
ex:Alice ex:knows ex:Bob .
ex:Bob ex:livesIn ex:NewYork .
Inverse property scopes (sh:InversePropertyScope)

The scope class sh:InversePropertyScope selects all objects that appear in at least one triple with a given property sh:predicate. In the following SPARQL query, the variable $predicate is assumed to be substituted with the given value of sh:predicate.

SPARQL DEFINITION
SELECT DISTINCT ?this
WHERE {
	?any $predicate ?this .
}
ex:PropertyScopeExampleShape
	a sh:Shape ;
	sh:scope [
		a sh:InversePropertyScope ;
		sh:predicate ex:knows ;
	] .
ex:Alice ex:knows ex:Bob .
ex:Bob ex:livesIn ex:NewYork .
All subjects scopes (sh:AllSubjectsScope)

The scope class sh:AllSubjectsScope selects all subjects in the data graph.

SPARQL DEFINITION
SELECT DISTINCT ?this
WHERE {
	?this ?anyPredicate ?anyObject .
}

The following example uses sh:AllSubjectsScope to define a constraint that shall apply to all subjects in the data graph:

ex:PropertyScopeExampleShape
	a sh:Shape ;
	sh:scope [
		a sh:AllSubjectsScope ;
	] .
ex:Alice ex:knows ex:Bob .
ex:Bob ex:livesIn ex:NewYork .
All objects scopes (sh:AllObjectsScope)

The scope class sh:AllObjectsScope selects all objects in the data graph.

SPARQL DEFINITION
SELECT DISTINCT ?this
WHERE {
	?anySubject ?anyPredicate ?this .
}
ex:PropertyScopeExampleShape
	a sh:Shape ;
	sh:scope [
		a sh:AllObjectsScope ;
	] .
ex:Alice ex:knows ex:Bob .
ex:Bob ex:livesIn ex:NewYork .

Filter Shapes

Filter shapes can further refine the focus nodes produced by a scope. For example, instances of the given class ex:Person that were ex:residentIn the country ex:USA may have a different legal drinking age than others. In order to support such use cases, SHACL includes the concept of filter shapes that act as pre-conditions that all focus nodes need to fulfill before they are being validated. Formally, filter shapes eliminate entries from the collection of focus nodes selected by a shape's scopes, if the focus node produces a validation result with severity sh:Violation or a failure for the given filter shapes.

The following example states that the sh:minCount constraint on ex:email applies on ex:Persons that are ex:members of ex:W3c.

ex:FilteredExampleShape
	a sh:Shape ;
	sh:classScope ex:Person
	sh:filterShape [
		a sh:Shape ; # Optional triple
		sh:property [
			sh:predicate ex:member ;
			sh:hasValue ex:W3c ;
		]
	] ;
	sh:property [
		sh:predicate ex:email ;
		sh:minCount 1 ;
	] .
ex:Alice a ex:Person ;
	ex:member ex:W3c ;
	ex:email <mailto:[email protected]> .
ex:John a ex:Person ;
	ex:member ex:W3c .
ex:Bob a ex:Person ;
	ex:member ex:Acme .
[  a sh:ValidationResult ;
	sh:severity sh:Violation ;
	sh:focusNode ex:John ;
	sh:subject ex:John ;
	sh:predicate ex:email ;
	sh:message "sh:minCount for ex:email is '1'." .
] . 

Alternatively, sh:filterShape can be defined on specific constraints, instead of the whole shape.

ex:FilteredExampleShape
	a sh:Shape ;
	sh:classScope ex:Person
	sh:property [
		sh:predicate ex:email ;
		sh:minCount 1 ;
		sh:filterShape [
			sh:property [
				sh:predicate ex:member ;
				sh:hasValue ex:W3c ;
			]
		] ;
	] .
TODO: say about filters when they are evaluated from sh:valueShape?
TODO: say anything about filters and severities?

Constraints

A shape defines a group of constraints. The SHACL RDF vocabulary defines a class sh:Constraint that serves as the superclass of various constraint types:

Additional types of constraints can be added using the extension mechanism, called native constraints.

Shapes can be linked to their constraints via the following properties.

The values of the three properties above do not require an explicitly stated rdf:type triple of their own. Instead, they may be untyped, and a SHACL processor MUST assume the so-called default value type of the property. The default value type is a type for objects of certain triples that is used whenever the object is untyped. The extension mechanism includes a generic property sh:defaultValueType explained in a later section to encode a default value type.

Constraints can have various properties such as sh:class or sh:minCount which represent parameters of so-called constraint components. A constraint component defines one or more parameter properties and validation instructions (e.g. implemented via SPARQL queries) that can be used to perform the validation for the given focus node and parameter values. The catalog of constraint components in the Core of SHACL is defined in the following section.

The following examples illustrate two ways of using (property) constraints. The first example uses a blank node:

ex:InlinePropertyConstraintExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:name "some property" ;
		sh:description "Description of the role of ex:someProperty (in the context of the constraint)" ;
		sh:minCount 1 ;
		sh:class ex:SomeClass ;
	] .

The second example defines a constraint as an IRI node, allowing it to be more easily referenced and shared across multiple shapes:

ex:StandAlonePropertyConstraintExampleShape
	a sh:Shape ;
	sh:property ex:StandAloneConstraint .

ex:StandAloneConstraint
	a sh:PropertyConstraint ;
	sh:predicate ex:someProperty ;
	sh:defaultValue ex:SomeInstance ;
	sh:minCount 1 ;
	sh:class ex:SomeClass .

Core Constraint Components

The following sections define the constraint components built into the SHACL Core. Compliant SHACL validation engines MUST support all of these constraint components.

The choice of constraint components that are defined by the SHACL Core was made based on the requirements collected by the [[shacl-ucr]] document. Special attention was paid to the balance between trying to cover as many common use cases as possible and keeping the size of the core language under control. Not all use cases (such as describing constraints on members of an rdf:List) can be expressed by the Core Vocabulary alone. Instead, SHACL provides extension mechanisms, such as SPARQL queries, as described in the second part of this specification. It is the expectation of the Working Group that reusable libraries of SHACL extensions will be maintained by third parties.

Note that the textual definitions of the constraint components refer to the Validation Results Vocabulary introduced in a later section. Each constraint component is identified by a URI that is referenced in the validation results via sh:sourceTemplate TODO: this is likely going to be renamed to another property name.

Many constraint components can be used in multiple contexts, e.g. both as a property constraint and an inverse property constraint. The textual descriptions of each component refer to the concept of value nodes which is defined as follows, including rules for the creation of validation results:

The SPARQL definitions in this section may only be written for one of the tree possible contexts, for brevity. Corresponding queries can be formulated for the other cases (such as the inverse direction) easily. The SPARQL definitions also assume the following variable bindings:

Each row in the result set of the SPARQL queries in this document represents one validation result. The other variables in the SELECT clause are mapped to the details of each validation result, e.g. ?object is mapped to sh:object. (Clarify what exact compliance level is required, e.g. do they need to produce focus nodes) If a row in a SPARQL result set produces true as value for the variable ?failure then a failure must be reported.

The SPARQL definitions in this section also assume the existence of a built-in SPARQL function sh:hasShape, which is described in the Appendix.

The following table summarizes the parameters used by the core constraint components. The table clarifies whether these parameters can be used as part of a sh:NodeConstraint (NC, to apply to the focus node itself), a sh:PropertyConstraint (PC, to apply to all values of a given property), or a sh:InversePropertyConstraint (IPC, to apply to all inverse values of a given property).

Parameters NC PC IPC Summary
sh:class, sh:classIn and sh:directType Type, based on rdf:type
sh:datatype and sh:datatypeIn Datatype, for literals
sh:disjoint Property without overlapping values
sh:equals Property with equal values
sh:hasValue A specific required value
sh:in Enumeration of allowed values
sh:lessThan Must have lesser values than another property
sh:lessThanOrEquals Must have lesser or equal values than another property
sh:minCount, sh:maxCount Minimum and maximum cardinality
sh:minLength, sh:maxLength Minimum and maximum string length
sh:maxExclusive Maximum exclusive value (>)
sh:maxInclusive Maximum inclusive value (>=)
sh:minExclusive Minimum exclusive value (<)
sh:minInclusive Minimum inclusive value (<=)
sh:nodeKind Node kind (IRI, blank node, or literal) of all values
sh:pattern Regular expression string matching
sh:uniqueLang No duplicate language tags
sh:valueShape Nested shape of all values
sh:qualifiedValueShape, sh:qualifiedMinCount, sh:qualifiedMaxCount Nested shape of a given minimum/maximum number of values

Value Type Constraint Components

The constraint components in this section have in common that they define restrictions on the type of the nodes.

It is an open issue how to best represent properties that may either take a literal or a non-literal.

sh:class

The property sh:class can be used to verify that each value node is an instance of a given type. The main difference with sh:directType is that sh:class also includes subclasses of the type.

Constraint Component: sh:ClassConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:class rdfs:Resource Type of all values
TEXTUAL DEFINITION
A validation result must be produced for each value node that is either a literal or a non-literal without a matching rdf:type. A non-literal matches a type if it has an rdf:type value that is the given type or one of its (transitive) subclasses, via rdfs:subClassOf.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER NOT EXISTS { ?value rdf:type/rdfs:subClassOf* $class } .
}
ex:ClassExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:class ex:ClassA ;
	] .
ex:InstanceOfClassA
	a ex:ClassA .

ex:ClassExampleValidResource
	ex:someProperty ex:InstanceOfClassA .

sh:classIn

The property sh:classIn can be used to verify that each value node is an instance of a type from a given list. The values of sh:classIn must be lists of resources. sh:classIn is a generalization of sh:class allowing users to state that the values must have at least one out of several types.

Constraint Component: sh:ClassInConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:classIn rdf:List (members: rdfs:Resource) List of types of all values
TEXTUAL DEFINITION
A validation result must be produced for each value node that is either a literal or a non-literal without a matching rdf:type. A non-literal matches a type if it has an rdf:type value that is one of the types from the list or one of its (transitive) subclasses, via rdfs:subClassOf. Each type from the list is tested using the same logic as sh:class.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER (isLiteral(?value) || NOT EXISTS {
			GRAPH $shapesGraph {
				$classIn (rdf:rest*)/rdf:first ?class .
			}
			FILTER NOT EXISTS { ?value rdf:type/rdfs:subClassOf* ?class }
		})
}
ex:ClassInExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:classIn ( ex:ClassA ex:ClassB ) ;
	] .
ex:InstanceOfClassA
	a ex:ClassA .

ex:InstanceOfClassB
	a ex:ClassB .

ex:ClassExampleValidResource
	ex:someProperty ex:InstanceOfClassA ;
	ex:someProperty ex:InstanceOfClassB .

sh:datatype

The property sh:datatype can be used to restrict the datatype of all value nodes. The values of sh:datatype must be resources representing datatypes, such as xsd:string.

Constraint Component: sh:DatatypeConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint

Parameters:
Property Value Type Summary
sh:datatype rdfs:Resource Datatype of all value nodes (e.g., xsd:integer)
TEXTUAL DEFINITION
A validation result must be produced for each value node that is not a literal, or is a literal with a mismatching datatype. A literal matches a datatype if the literal's datatype has the same IRI.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER NOT EXISTS {
		{
			FILTER isLiteral(?value) .
		} .
		BIND (datatype(?value) AS ?valueDatatype) .
		FILTER (?valueDatatype = $datatype) .
	}
}
ex:DatatypeExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:datatype xsd:string ;
	] .
ex:DatatypeShapeExampleValidResource
	ex:someProperty "Some value" .

ex:DatatypeShapeExampleInvalidResource
	ex:someProperty "Value with language tag"@en ;
	ex:someProperty 42 .

sh:datatypeIn

The property sh:datatypeIn can be used to restrict the datatype of all value nodes. The values of sh:datatypeIn must be lists of resources representing datatypes, such as xsd:string. sh:datatypeIn is a generalization of sh:datatype allowing users to state that the values must have one out of several datatypes.

Constraint Component: sh:DatatypeInConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint

Parameters:
Property Value Type Summary
sh:datatype rdf:List (members: rdfs:Resource) Allowed datatypes of all value nodes (e.g., xsd:integer)
TEXTUAL DEFINITION
A validation result must be produced for each value node that is not a literal, or is a literal with a mismatching datatype. A literal matches if the literal's datatype is member of the provided datatypes list.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER (!isLiteral(?value) || NOT EXISTS {
			GRAPH $shapesGraph {
				$datatypeIn (rdf:rest*)/rdf:first ?datatype .
			} 
			BIND (datatype(?value) AS ?valueDatatype) .
			FILTER (?valueDatatype = $datatype) .
		})
	}
}
ex:DatatypeInExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:datatypeIn ( xsd:string rdf:langString ) ;
	] .
ex:DatatypeInShapeExampleValidResource
	ex:someProperty "Value with language tag"@en ;
	ex:someProperty "Some string value" .

ex:DatatypeInShapeExampleInvalidResource
	ex:someProperty 42 .

sh:directType

The property sh:directType can be used to restrict the rdf:type of all value nodes. The main difference with sh:class is that sh:directType does not include subclasses of the type.

Constraint Component: sh:DirectTypeConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:directType rdfs:Resource Type of all value nodes
TEXTUAL DEFINITION
A validation result must be produced for each value node that does not have an rdf:type triple with the given value type as object.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER NOT EXISTS {
		?value a $directType .
	}
}

sh:nodeKind

The property sh:nodeKind can be used to restrict the RDF node kind of all value nodes.

Constraint Component: sh:NodeKindConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:nodeKind sh:NodeKind Node kind (IRI, blank node, literal or combinations of these) of all value nodes

The values of sh:nodeKind must be instances of the class sh:NodeKind. The SHACL system vocabulary defines that sh:NodeKind has exactly 6 instances: sh:BlankNode, sh:IRI and sh:Literal as well as the following instances that represent combinations of the former three instances, i.e. either-or: sh:BlankNodeOrIRI, sh:BlankNodeOrLiteral and sh:IRIOrLiteral.

TEXTUAL DEFINITION
A validation result must be produced for each value node that does not match the given node kind.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER NOT EXISTS {
		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 ) )) .
	}
}
ex:NodeKindExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:nodeKind ex:IRI ;
	] .
ex:NodeKindShapeExampleValidResource
	ex:someProperty ex:SomeIRI .

ex:NodeKindShapeExampleInvalidResource
	ex:someProperty ex:SomeIRI ;
	ex:someProperty "A literal" .

Cardinality Constraint Components

The constraint components in this section can be applied to either a property constraint or an inverse property constraints, to represent restrictions on the number of values that the focus node may have for these properties.

sh:minCount

The property sh:minCount restricts the number of triples involving the focus node and a given predicate.

Constraint Component: sh:MinCountConstraintComponent

Supported Constraint Types: sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:minCount xsd:integer The minimum cardinality. If the value is 0 then this constraint is always satisfied and so may be omitted.
TEXTUAL DEFINITION
A validation result must be produced if the number of value nodes is less than the value of sh:minCount.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate
WHERE {
	{
		SELECT (COUNT(?value) AS ?count)
		WHERE {
			$this $predicate ?value .
		}
	}
	FILTER (?count < $minCount)
}
ex:CountExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:minCount 1 ;
	] .
ex:CountExampleValidResource
	ex:someProperty ex:OneValue .

sh:maxCount

The property sh:maxCount restricts the number of triples involving the focus node and a given predicate.

Constraint Component: sh:MaxCountConstraintComponent

Supported Constraint Types: sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:maxCount xsd:integer The maximum cardinality. If this parameter is omitted then there is no limit on the number of triples.
TEXTUAL DEFINITION
A validation result must be produced if the number of value nodes is greater than the value of sh:maxCount.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate
WHERE {
	{
		SELECT (COUNT(?value) AS ?count)
		WHERE {
			$this $predicate ?value .
		}
	}
	FILTER (?count > $maxCount))
}
ex:CountExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:maxCount 1 ;
	] .
ex:CountExampleValidResource
	ex:someProperty ex:OneValue .

Value Range Constraint Components

The following constraint components represent range restrictions on node that are comparable via operators such as < and >.

sh:minExclusive, sh:minInclusive, sh:maxExclusive, sh:maxInclusive

The properties from the following table restrict the range of objects of triples with the focus node as the subject and the given property as the predicate. The supported datatypes of these properties are xsd:string, xsd:boolean, xsd:dateTime and all numeric datatypes such as xsd:integer.

Constraint Components: sh:MinExclusiveConstraintComponent, sh:MinInclusiveConstraintComponent, sh:MaxExclusiveConstraintComponent, sh:MaxInclusiveConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint

Parameters:
Property Value Type Summary Definition
sh:minExclusive (supported datatypes) The minimum exclusive value <
sh:minInclusive (supported datatypes) The minimum inclusive value <=
sh:maxExclusive (supported datatypes) The maximum exclusive value >
sh:maxInclusive (supported datatypes) The maximum inclusive value >=
TEXTUAL DEFINITION
A validation result must be produced for each value node that does not match the literal range specified by the table above, using the semantics of the SPARQL operators <, <=, > and >=. A validation result must also be produced if the node cannot be compared to the specified range.

Note that if the comparison cannot be performed, for example when someone compares a string with an integer, then the validation engine will produce a validation result. This is different from, say, a plain SPARQL query, in which such failures would silently not lead to any results.

The following SPARQL definition covers sh:minExclusive - the other variations can be derived by replacing the > operator.

SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER (!($value > $minExclusive)) .
}
ex:NumericRangeExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:minInclusive 1 ;
		sh:maxInclusive 10 ;
	] .
ex:NumericExampleValidResource
	ex:someProperty 7 .

ex:NumericExampleInvalidResource1
	ex:someProperty 11 .

ex:NumericExampleInvalidResource2
	ex:someProperty "a string" .

String-based Constraint Components

The constraint components in this section have in common that they are representing restrictions on the string representation of certain nodes.

sh:minLength

The property sh:minLength restricts the string length of value nodes. This can be applied to any type of literal and IRIs, but not for blank nodes.

Constraint Component: sh:MinLengthConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:minLength xsd:integer The minimum length. If the value is 0 then there is no restriction on the string length but this constraint is still violated if the node is a blank node.
TEXTUAL DEFINITION
A validation result must be produced for each value node where the length of its string representation (as defined by the SPARQL str function) is less than the specified minimum length, or if the node is a blank node.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER (isBlank(?value) || STRLEN(str(?value)) < $minLength) .
}

sh:maxLength

The property sh:maxLength restrict the string length of value nodes This can be applied to any type of literal and IRIs, but not for blank nodes.

Constraint Component: sh:MaxLengthConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:maxLength xsd:integer The maximum length. If this constraint is omitted then there is no restriction on the string length and no requirement that the node is a literal or IRI.
TEXTUAL DEFINITION
A validation result must be produced for each value node where the length of its string representation (as defined by the SPARQL str function) is greater than the specified maximum length, or if the node is a blank node.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER (isBlank(?value) || STRLEN(str(?value)) > $minLength) .
}
ex:PasswordExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:password ;
		sh:minLength 8 ;
		sh:maxLength 10 ;
		rdfs:comment "Password must be between 8 and 10 characters long" ;
	] .
ex:PasswordExampleValidResource
	ex:password "password" .

sh:pattern

The property sh:pattern can be used to validate whether all value nodes match a given regular expression. The values of sh:pattern must be valid pattern arguments for the SPARQL REGEX function.

Constraint Component: sh:PatternConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:pattern xsd:string Regular expression that all value nodes must match
sh:flags xsd:string (optional) An optional string of flags, interpreted as in SPARQL 1.1 REGEX
TEXTUAL DEFINITION
A validation result must be produced for each value node where the string representation (as defined by the SPARQL str function) does not match the given regular expression (as defined by the SPARQL REGEX function). If sh:flags is present then this must be interpreted according to the SPARQL REGEX function.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER (isBlank(?value) || IF(bound($flags), !regex(str(?value), $pattern, $flags), !regex(str(?value), $pattern))) .
}
ex:PatternExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:pattern "^Ali" ;
		sh:flags "i" ;       # Ignore case
	] .
ex:PatternShapeExampleValidResource
	ex:someProperty "alice" .

ex:PatternShapeExampleInvalidResource
	ex:someProperty "The Alice" .

sh:uniqueLang

The property sh:uniqueLang can be set to true to specify that no pair of value nodes may use the same language tag. The values of sh:uniqueLang must be xsd:boolean.

Constraint Component: sh:UniqueLangConstraintComponent

Supported Constraint Types: sh:PropertyConstraint

Parameters:
Property Value Type Summary
sh:uniqueLang xsd:boolean true to activate this constraint
TEXTUAL DEFINITION
If sh:uniqueLang is set to true then a validation result must be produced for each non-empty language tag that is used by at least two value nodes.
SPARQL DEFINITION
SELECT DISTINCT $this ($this AS ?subject) $predicate
WHERE {
	{
		FILTER ($uniqueLang) .
	}
	$this $predicate ?value .
	BIND (lang(?value) AS ?lang) .
	FILTER (bound(?lang) && ?lang != "") . 
	FILTER EXISTS {
		$this $predicate ?otherValue .
		FILTER (?otherValue != ?value && ?lang = lang(?otherValue)) .
	}
}
ex:UniqueLangExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:uniqueLang true ;
	] .
ex:UniqueLangShapeExampleValidResource
	ex:someProperty "Me" ;
	ex:someProperty "Me"@en ;
	ex:someProperty "Moi"@fr .

ex:UniqueLangShapeExampleInvalidResource
	ex:someProperty "Me"@en ;
	ex:someProperty "Myself"@en .

Property Pair Constraint Components

The constraint components in this section restrict the sets of values represented by the sh:predicate used in the property constraint, and another property that is specified as the value of the respective parameter such as sh:equals.

The names of the following properties have been the source of confusion and may get renamed.

sh:equals

sh:equals constrains a pair of properties so that the value sets of both properties at a given focus node must be equal.

Constraint Component: sh:EqualsConstraintComponent

Supported Constraint Types: sh:PropertyConstraint

Parameters:
Property Value Type Summary
sh:equals rdfs:Resource Property to compare with
TEXTUAL DEFINITION
A validation result must be produced for each value of sh:predicate that does not exist as value of sh:equals and for each value of sh:equals that does not exist as value of sh:predicate at the given focus node. The produced validation result must have the corresponding values of the existing triple as sh:subject, sh:predicate and sh:object.
SPARQL DEFINITION
SELECT $this ($this AS ?subject) $predicate ?object
WHERE {
	{
		$this $predicate ?object .
		FILTER NOT EXISTS {
			$this $equals ?object .
		}
	}
	UNION
	{
		$this $equals ?object .
		FILTER NOT EXISTS {
			$this $predicate ?object .
		}
	}
}

The following example illustrates the use of sh:equals in a shape to verify that certain nodes must have the same value sets for ex:firstName and ex:givenName.

ex:EqualExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:firstName ;
		sh:equals ex:givenName ;
	] .
ex:ValidInstance1
	ex:firstName "John" ;
	ex:givenName "John" .

sh:disjoint

sh:disjoint constrains a pair of properties so that the value sets of both properties at a given focus node must not share any values.

Constraint Component: sh:DisjointConstraintComponent

Supported Constraint Types: sh:PropertyConstraint

Parameters:
Property Value Type Summary
sh:disjoint rdfs:Resource The property to compare the values with
TEXTUAL DEFINITION
A validation result must be produced for each value of sh:predicate that also exists as value of sh:disjoint at the given focus node. The produced validation result must have the focus node as its sh:subject, the sh:predicate as its sh:predicate and the value as its sh:object.
SPARQL DEFINITION
SELECT $this ($this AS ?subject) $predicate ?object
WHERE {
	$this $predicate ?object .
	$this $disjoint ?object .
}

The following example illustrates the use of sh:disjoint in a shape to verify that certain nodes must not share any values for ex:prefLabel and ex:altLabel.

ex:DisjointExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:prefLabel ;
		sh:disjoint ex:altLabel ;
	] .
ex:ValidInstance1
	ex:prefLabel "USA" ;
	ex:altLabel "United States" .

ex:InvalidInstance1
	ex:prefLabel "Germany" ;
	ex:altLabel "Germany" .

sh:lessThan

sh:lessThan constrains a pair of properties so that the values of the first property must be smaller than the values of the second property at a given focus node.

Constraint Component: sh:LessThanConstraintComponent

Supported Constraint Types: sh:PropertyConstraint

Parameters:
Property Value Type Summary
sh:lessThan rdfs:Resource The property to compare the values with
TEXTUAL DEFINITION
A validation result must be produced for each pair of values of sh:predicate and sh:lessThan at the given focus node, where the first value is not less than the second value, based on SPARQL's < operator. A validation result must also be produced if the two values cannot be compared. The produced validation result must have the focus node as its sh:subject, the sh:predicate as its sh:predicate and the value of sh:predicate as its sh:object.
SPARQL DEFINITION
SELECT $this ($this AS ?subject) $predicate ?object
WHERE {
	$this $predicate ?object .
	$this $lessThan ?object2 .
	FILTER (!(?object < ?object2)) .
}

The following example illustrates the use of sh:lessThan in a shape to verify that all values of ex:startDate must "before" the values of ex:endDate.

ex:LessThanExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:startDate ;
		sh:lessThan ex:endDate ;
	] .

sh:lessThanOrEquals

sh:lessThanOrEquals constrains a pair of properties so that the values of the first property must be smaller than or equal to the values of the second property at a given focus node.

Constraint Component: sh:LessThanOrEqualsConstraintComponent

Supported Constraint Types: sh:PropertyConstraint

Parameters:
Property Value Type Summary
sh:lessThanOrEquals rdfs:Resource The property to compare the values with
TEXTUAL DEFINITION
A validation result must be produced for each pair of values of sh:predicate and sh:lessThanOrEquals at the given focus node, where the first value is not less than or equal to the second value, based on SPARQL's <= operator. A validation result must also be produced if the two values cannot be compared. The produced validation result must have the focus node as its sh:subject, the sh:predicate as its sh:predicate and the value of the first predicate as its sh:object.
SPARQL DEFINITION
SELECT $this ($this AS ?subject) $predicate ?object
WHERE {
	$this $predicate ?object .
	$this $lessThanOrEquals ?object2 .
	FILTER (!(?object <= ?object2)) .
}

Logical Constraint Components

The constraint components implement the common logical operators and, or and not.

There is a proposal to generalize the following components to also allow their values to be constraints, not just shapes.

sh:not

SHACL supports a high-level negation constraint that can be used to verify that the focus node does not have a given shape. This is comparable to a logical "not" operator.

Constraint Component: sh:NotConstraintComponent

Supported Constraint Types: sh:NodeConstraint

Parameters:
Property Value Type Summary
sh:not sh:Shape The shape to negate
TEXTUAL DEFINITION
A validation result must be produced if the focus node produces no validation results with severity sh:Violation for the shape given via sh:not. A failure must be reported if the validation of the shape produces a failure.
SPARQL DEFINITION
SELECT $this ?failure
WHERE {
	BIND (sh:hasShape($this, $not, $shapesGraph) AS ?hasShape) .
	BIND (!bound(?hasShape) AS ?failure) .
	FILTER (?failure || ?hasShape) .
}

The following example illustrates the use of sh:not in a shape to verify that certain nodes cannot have any value of ex:property.

ex:NotExampleShape
	a sh:Shape ;
	sh:constraint [
		sh:not [
			a sh:Shape ;
			sh:property [
				sh:predicate ex:property ;
				sh:minCount 1 ;
			] ;
		]
	] .
ex:InvalidInstance1
  	ex:property "Some value" .

sh:and

SHACL supports a high-level syntax for conjunctive constraints that can be used to test whether the focus node has all out of several shapes. This is comparable to a logical "and" operator.

Constraint Component: sh:AndConstraintComponent

Supported Constraint Types: sh:NodeConstraint

Parameters:
Property Value Type Summary
sh:and rdf:List (members: sh:Shape) List of shapes to validate the focus node against
TEXTUAL DEFINITION
A validation result must be produced if the following condition is false: The validation of the focus node against all of the shapes in the sh:and list produces a validation result with severity sh:Violation for at least one shape. A failure must be produced if the validation of one of the shapes fails.
SPARQL DEFINITION
SELECT $this ?failure
WHERE {
	{
		SELECT (SUM(?s) AS ?count)
		WHERE {
			GRAPH $shapesGraph {
				$and rdf:rest*/rdf:first ?shape .
			}
			BIND (sh:hasShape($this, ?shape, $shapesGraph) AS ?hasShape) .
			BIND (IF(bound(?hasShape), IF(!?hasShape, 1, 0), 'error') AS ?s) .
		}
	}
	BIND (!bound(?count) AS ?failure) .
	FILTER IF(?failure, true, ?count > 0) .
}

Note that although sh:and has an rdf:List of shapes as its value, the order of those shapes does not impact the validation results.

The following example illustrates the use of sh:and in a shape to verify that certain nodes have exactly one value of ex:property. This is achieved via the conjunction of a separate named shape (ex:SuperShape) which defines the minimum count, and a blank node shape that further constrains the maximum count. As shown here, sh:and can be used to implement a specialization mechanism between shapes.

ex:SuperShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:property ;
		sh:minCount 1 ;
	] .

ex:ExampleAndShape
	a sh:Shape ;
	sh:constraint [
		sh:and (
			ex:SuperShape
			[
				sh:property [
					sh:predicate ex:property ;
					sh:maxCount 1 ;
				]
			]
		)
	] .
ex:ValidInstance1
	ex:property "One" .

# Invalid: more than one property
ex:InvalidInstance2
	ex:property "One" ;
	ex:property "Two" .

sh:or

SHACL supports a high-level syntax for disjunctive constraints that can be used to test whether the focus node has at least one out of several shapes. This is comparable to a logical "or" operator.

Constraint Component: sh:OrConstraintComponent

Supported Constraint Types: sh:NodeConstraint

Parameters:
Property Value Type Summary
sh:or rdf:List (members: sh:Shape) List of shapes to validate the focus node against
TEXTUAL DEFINITION
A validation result must be produced if the following condition is false: The validation of the focus node against all of the shapes in the sh:or list produces no validation results with severity sh:Violation for at least one shape. A failure must be produced if the validation of one of the shapes fails.
SPARQL DEFINITION
SELECT $this ?failure
WHERE {
	{
		SELECT (SUM(?s) AS ?count)
		WHERE {
			GRAPH $shapesGraph {
				$or rdf:rest*/rdf:first ?shape .
			}
			BIND (sh:hasShape($this, ?shape, $shapesGraph) AS ?hasShape) .
			BIND (IF(bound(?hasShape), IF(?hasShape, 1, 0), 'error') AS ?s) .
		}
	}
	BIND (!bound(?count) AS ?failure) .
	FILTER IF(?failure, true, ?count = 0) .
}

Note that although sh:or has an rdf:List of shapes as its value, the order of those shapes does not impact the validation results.

The following example illustrates the use of sh:or in a shape to verify that certain nodes have at least one value of ex:exampleProperty1 or at least one value of ex:exampleProperty2.

ex:OrConstraintExampleShape
	a sh:Shape ;
	sh:constraint [
		sh:or (
			[
				sh:property [
					sh:predicate ex:exampleProperty1 ;
					sh:minCount 1 ;
				]
			]
			[
				sh:property [
					sh:predicate ex:exampleProperty2 ;
					sh:minCount 1 ;
				]
			]
		)
	] .
ex:OrConstraintExampleValidResource
	ex:exampleProperty1 ex:someValue .

Shape-based Constraint Components

The constraint components in this section can be used to represent complex restrictions based on applying shape definitions on the property values.

sh:valueShape

The property sh:valueShape can be used verify that all values of the given property must have a given shape. The value type of sh:valueShape is sh:Shape, but the rdf:type triple of those shapes can be omitted.

Constraint Component: sh:ValueShapeConstraintComponent

Supported Constraint Types: sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:valueShape sh:Shape The required shape of all values
TEXTUAL DEFINITION
A validation result must be produced for each value node where validating the value node against the shape specified by sh:valueShape produces any validation results with severity sh:Violation or a failure.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate ?object ?failure
WHERE {
	$this $predicate ?object .
	BIND (sh:hasShape(?object, $valueShape, $shapesGraph) AS ?hasShape) .
	BIND (!bound(?hasShape) AS ?failure) .
	FILTER (?failure || !?hasShape) .
}

According to resolution 2015.12.16/04 shapes graphs with dependency loops are invalid and suitable limitations of this will be explored. Until issue 22 is closed, definitions regarding recursion are not endorsed by the WG.

A shape may refer to itself directly or indirectly via sh:valueShape, sh:filterShape, etc. Such a shape is said to be recursive. The meaning of non-recursive shapes is always well-founded. In contrast, the meaning of a recursive shape may not be well-founded. As a starting point, the SHACL specification only defines the meaning of non-recursive shapes. However, there are use-cases where recursion is valuable, either for its inherent expressive power or because it makes the intension of shapes clearer. The Working Group will therefore explore conditions under which recursive shapes can be assigned a well-defined meaning and will relax the restrictions on recursion accordingly.

In the following example, all values of the property ex:someProperty will validate with no results for the shape specified by a blank node that ensures that the property ex:nestedProperty has at least one value.

ex:ValueShapeExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:valueShape [
			a sh:Shape ;   # Optional
			sh:predicate [
				sh:predicate ex:nestedProperty ;
				sh:minCount 1 ;
			]
		]
	] .
ex:ValueShapeExampleValidResource
	ex:someProperty [
		ex:nestedProperty 42 ;
	] .

sh:qualifiedValueShape, sh:qualifiedMinCount, sh:qualifiedMaxCount

Feature at risk: There is an ongoing proposal (see sh:partition) that strongly overlaps with the QCRs proposed here. The WG may decide to support only one of these options, but not both.

The property sh:qualifiedValueShape can be used verify that a certain number of values of the given property must have a given shape. The value type of sh:qualifiedValueShape is sh:Shape, and it needs to be accompanied by a sh:qualifiedMinCount or a sh:qualifiedMaxCount (both typed xsd:integer), or both. The rdf:type of the value shapes can be omitted.

Constraint Component: sh:QualifiedValueShapeConstraintComponent

Supported Constraint Types: sh:PropertyConstraint

Parameters:
Property Value Type Summary
sh:qualifiedValueShape sh:Shape The required shape of the specified values
sh:qualifiedMinCount xsd:integer The minimum number of values that must have the shape. If this constraint is omitted then there is no minimum number of values required.
sh:qualifiedMaxCount xsd:integer The maximum number of values that can have the shape. If this constraint is omitted then there is no maximum number of values required.
TEXTUAL DEFINITION of sh:qualifiedMinCount
A validation result must be produced if the number of triples that have the focus node as its subject, the sh:predicate as its predicate and where validating the object against the shape specified by sh:qualifiedValueShape produces no validation results with severity sh:Violation or a failure is less than sh:qualifiedMinCount. The produced validation result must have the focus node as its sh:subject, and the sh:predicate as its sh:predicate.
SPARQL DEFINITION of sh:qualifiedMinCount
SELECT $this ($this AS ?subject) $predicate ?failure
WHERE {
	{
		SELECT (SUM(?s) AS ?count)
		WHERE {
			{
				FILTER NOT EXISTS { $this $predicate ?value } .
				BIND (0 AS ?s) .
			}
			UNION
			{
				$this $predicate ?value .
				BIND (sh:hasShape(?value, $qualifiedValueShape, $shapesGraph) AS ?hasShape) .
				BIND (IF(bound(?hasShape), IF(?hasShape, 1, 0), 'error') AS ?s) .
			}
		}
	}
	BIND (!bound(?count) AS ?failure) .
	FILTER IF(?failure, true, ?count < $qualifiedMinCount) .
}
TEXTUAL DEFINITION of sh:qualifiedMaxCount
A validation result must be produced if the number of triples that have the focus node as its subject, the sh:predicate as its predicate and where validating the object against the shape specified by sh:qualifiedValueShape produces no validation results with severity sh:Violation or a failure is greater than sh:qualifiedMaxCount. The produced validation result must have the focus node as its sh:subject, and the sh:predicate as its sh:predicate.
SPARQL DEFINITION of sh:qualifiedMaxCount
SELECT $this ($this AS ?subject) $predicate ?failure
WHERE {
	{
		SELECT (SUM(?s) AS ?count)
		WHERE {
			{
				FILTER NOT EXISTS { $this $predicate ?value } .
				BIND (0 AS ?s) .
			}
			UNION
			{
				$this $predicate ?value .
				BIND (sh:hasShape(?value, $qualifiedValueShape, $shapesGraph) AS ?hasShape) .
				BIND (IF(bound(?hasShape), IF(?hasShape, 1, 0), 'error') AS ?s) .
			}
		}
	}
	BIND (!bound(?count) AS ?failure) .
	FILTER IF(?failure, true, ?count > $qualifiedMaxCount) .
}

In the following example, the property ex:parent must have exactly two values, and at least one of them needs to be female.

ex:QualifiedValueShapeExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:parent ;
		sh:minCount 2 ;
		sh:maxCount 2 ;
		sh:qualifiedValueShape [
			a sh:Shape ;   # Optional
			sh:property [
				sh:predicate ex:gender ;
				sh:hasValue ex:female ;
			]
		] ;
		sh:qualifiedMinCount 1 ;
	] .
ex:QualifiedValueShapeExampleValidResource
	ex:parent ex:John ;
	ex:parent ex:Jane .

ex:John
	ex:gender ex:male .

ex:Jane
	ex:gender ex:female .

sh:partition

This section is one proposal to resolve ISSUE-92.

In some cases a given property may be multi-valued and it may be required that the set of values be partitioned into two or more subsets, each of which satisfies certain constraints.

For example, suppose that in the Library of Congress BIBFRAME (bf:) Cultural Heritage vocabulary each person (bf:Person) must be identified by (bf:identifiedBy) exactly one identifier from id.loc.gov and may have another identifier from viaf.org. No other identifiers are allowed. Thus the set of all identifiers is partitioned into two subsets, the first of which contains exactly one member and the second of which contains zero or one members. The following example shows a snippet of some valid BIBFRAME data.

<bf_Person1>
  	bf:identifiedBy <http://id.loc.gov/authorities/names/n80103961#RWO> ;
 	bf:identifiedBy <https://viaf.org/viaf/268367832/#Knape,_Joachim> .

The following example shows a snippet of some invalid BIBFRAME data.

<bf_Person1>
  	bf:identifiedBy <http://id.loc.gov/authorities/names/n80103961#RWO> ;
 	bf:identifiedBy <https://viaf.org/viaf/268367832/#Knape,_Joachim> ;
	bf:identifiedBy "this is a mistake" . # should be an error

Qualified cardinality constraints provide a basis for expressing this type of partitioning requirement, but using them imposes a burden on the shapes author. In the BIBFRAME example the author would need to express the requirement that the set of all identifiers that are from neither id.loc.gov nor viaf.org is empty, i.e. it has a maximum cardinality of 0. Clearly, as more subsets of values are involved, the burden on the author increases. The sh:partition constraint makes it easier to express this type of requirement than it would be to use multiple qualified cardinality constraints. In effect, sh:partition chains together a sequence of qualified cardinality constraints and removes the set of context nodes matched by each from further consideration. If every context node gets matched in this process, then the sh:partition constraint reports no violations. Otherwise, any context nodes remaining are reported as violations of the constraint. The BIBFRAME example constraint is expressed as follows.

ex:BibframeShape a sh:Shape ;
	sh:property [
		sh:predicate bf:identifiedBy ;
		sh:partition (
			[sh:minCount 1; sh:maxCount 1; sh:pattern "^http://id.loc.gov/"]
			[sh:maxCount 1; sh:pattern "^https://viaf.org/"]
		)
] .

The value of the sh:partition constraint parameter MUST be an rdf:List that contains zero or more resources. Each resource in the list defines conditions on a subset of the context nodes and MAY contain the following parameters:

  • zero or one sh:minCount. This defines the minimum cardinality of the corresponding subset.
  • zero or one sh:maxCount. This defines the maximum cardinality of the corresponding subset.
  • any combination of parameters associated with node validation constraints. A node validation constraint is any constraint defined by a boolean function on nodes. These include the built-in constraints defined by sh:nodeKind, sh:partition, sh:minExclusive, etc. The corresponding subset consists of those remaining nodes for which the boolean function is true.

Note that a resource that contains no parameters matches all nodes. Such a resource is useful as the last member of the list where it acts as a default matching rule in the case where nodes that do not match any of the preceeding constraints are allowed. Note also that a qualified cardinality constraint defined using sh:qualifiedValueShape, sh:qualifiedMinCount, and sh:qualifiedMaxCount is equivalent to a sh:partition constraint that contains two resources with the first one containing the corresponding parameters and the last one being the default matching rule that matches any set of nodes.

Each member of the list is used by the SHACL processor to match a subset of the context nodes. The SHACL processor matches as many nodes as possible and then compares the result with the specified minimum and maximum cardinalities if specified. This is referred to as a greedy matching algorithm. Greedy pattern matching is commonly used with textual regular expressions. Nodes that match are removed from further matching. Thus the set of all context nodes becomes partitioned by the matching algorithm. The following paragraphs define this algorithm more precisely.

Let D be a data graph and let F be a focus node in D. Let S be a shapes graph, let T be a shape in S, and let C be a sh:partition constraint in T. Let N be the set of context nodes for C in D at F. Recall that N depends on how C is related to T.

  • If (T, sh:constraint, C) is in S then N consists of just the node F.
  • If (T, sh:property, C) and (C, sh:predicate, P) are in S then N consists of all the nodes X such that (F, P, X) is in D.
  • If (T, sh:inverseProperty, C) and (C, sh:predicate, P) are in S then N consists of all the nodes X such that (X, P, F) is in D.

Let the value of the sh:partition parameter be the list (Q1, ..., Qn) of resources. The SHACL validator MUST perform the following steps to validate the constraint C at F.

  1. Let R denote the set of remaining context nodes. Initialize R to N.
  2. Repeat the following for Q = Q1, ..., Qn
    1. Let P be the conjunction of all the node validation constraints in Q.
    2. Compute R' to be the set of all nodes in R that satisfy P, i.e. R' = {X in R | P(X) = true}
    3. If Q contains a minimum cardinality mmin and the number of nodes in R' is less than mmin, i.e. mmin > #R', then report a constraint violation and exit the loop.
    4. If Q contains a maximum cardinality mmax and the number of nodes in R' is greater then mmax, i.e. mmax < #R', then report a constraint violation and exit the loop.
    5. Remove R' from R, i.e. set R = R \ R'.
  3. If R is non-empty and no violations have been reported yet then report a violation.

Note that the order of resources within the list is significant. In general, if the members of the list are reordered then different context node sets will be matched and different violation results will be reported.

Other Constraint Components

This section enumerates core constraint components that did not fit into the other categories.

Closed Shapes (sh:closed, sh:ignoredProperties)

The RDF data model offers a huge amount of flexibility. Any resource can in principle have values for any property. However, in some cases it makes sense to restrict which properties can be applied to resources. The SHACL core language includes a property called sh:closed that can be assigned to a shape via the property sh:constraint to indicate that valid resources must only have values for those properties that have been explicitly declared via sh:property.

Constraint Component: sh:ClosedConstraintComponent

Supported Constraint Types: sh:NodeConstraint

Parameters:
Property Value Type Summary
sh:closed xsd:boolean Set to true to close the shape
sh:ignoredProperties rdf:List (members: rdf:Property) Optional list of properties that are also permitted in addition to those explicitly enumerated via sh:property
TEXTUAL DEFINITION
If sh:closed is true then a validation result must be produced for each triple that has the focus node as its subject and a predicate that is not explicitly enumerated as a sh:predicate of the sh:property constraints at the surrounding shape. If the argument sh:ignoredProperties is present then the properties enumerated in this list are also permitted. The produced validation result must have the corresponding values of the triple as sh:subject, sh:predicate and sh:object.

The core vocabulary includes an instance of sh:NodeConstraint called sh:Closed that can be used in places where no other arguments such as sh:ignoredProperties are needed.

SPARQL DEFINITION
SELECT $this ($this AS ?subject) ?predicate ?object
WHERE {
	{
		FILTER $closed .
	}
	$this ?predicate ?object .
	FILTER (NOT EXISTS {
		GRAPH $shapesGraph {
			$currentShape sh:property/sh:predicate ?predicate .
		}
	} && (!bound($ignoredProperties) || NOT EXISTS {
		GRAPH $shapesGraph {
			$ignoredProperties rdf:rest*/rdf:first ?predicate .
		}
	}))
}

The following example illustrates the use of sh:closed in a shape to verify that certain nodes only have values for ex:exampleProperty1 and ex:exampleProperty2. The "ignored" property rdf:type would also be allowed.

ex:ClosedShapeExampleShape
	a sh:Shape ;
	sh:constraint [
		sh:closed true ;
		sh:ignoredProperties (rdf:type) ;
	] ;
	sh:property [
		sh:predicate ex:exampleProperty1 ;
	] ;
	sh:property [
		sh:predicate ex:exampleProperty2 ;
	] .
ex:ClosedShapeExampleValidResource
	ex:exampleProperty1 ex:someValue .

ex:ClosedShapeExampleInvalidResource
	ex:exampleProperty2 ex:someValue ;
	ex:someOtherProperty 42 .

The next example illustrates a more compact syntax using the built-in instance sh:Closed. In this form, no ignored properties can be specified.

ex:ClosedShapeExampleShape
	a sh:Shape ;
	sh:constraint sh:Closed ;
	sh:property [
		sh:predicate ex:exampleProperty1 ;
	] ;
	sh:property [
		sh:predicate ex:exampleProperty2 ;
	] .

sh:hasValue

The property sh:hasValue can be used to verify that the focus node has a given RDF node among the values of the given predicate.

Constraint Component: sh:HasValueConstraintComponent

Supported Constraint Types: sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:hasValue any A specific required value
TEXTUAL DEFINITION
A validation result must be produced if the sh:hasValue is not among the value nodes.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate
WHERE {
	FILTER NOT EXISTS {
		$this $predicate $hasValue .
	}
}
ex:HasValueExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:property ;
		sh:hasValue ex:Green ;
	] .
ex:HasValueExampleValidResource
	ex:property ex:Green .

sh:in

The property sh:in exclusively enumerates the value nodes that a property may have. When specified, each value of the given property must be a member of the specified list.

Constraint Component: sh:InConstraintComponent

Supported Constraint Types: sh:NodeConstraint, sh:PropertyConstraint, sh:InversePropertyConstraint

Parameters:
Property Value Type Summary
sh:in rdf:List Enumeration of allowed values
TEXTUAL DEFINITION
The values of sh:in must be well-formed instances of rdf:List. The members of that rdf:List must not be blank nodes. A validation result must be produced for every value node that is not a member of the given list. Matching of literals needs to be exact, e.g. "04"^^xsd:byte does not match "4"^^xsd:integer.
SPARQL DEFINITION (for property constraints)
SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
	$this $predicate ?value .
	FILTER NOT EXISTS {
		GRAPH $shapesGraph {
			$in (rdf:rest*)/rdf:first ?value .
		}
	}
}
ex:AllowedValuesExampleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:someProperty ;
		sh:in ( ex:Value1 ex:Value2 ex:Value3 ) ;
	] .
ex:InExampleValidResource
	ex:someProperty ex:Value2 .

Non-Validating Constraint Characteristics

While the previous sections introduced properties that represent validation conditions, this section covers properties that are ignored by SHACL validation engines. The use of these properties is entirely optional and not subject to formal interpretation contracts. They may be used for purposes such as form building, predictable printing of RDF files, etc.

Property constraints may have one or more values for sh:name to provide human-readable labels for the property in the scope where it appears. If present, tools SHOULD prefer those locally defined labels over globally defined labels at the rdf:Property itself. For example, if a form displays a resource that is in the scope of a given shape, and the shape defines a sh:property constraint with an sh:name, then the tool SHOULD use the provided name. Similarly, property constraints may have an sh:description to provide a description of the property in the given context. Both sh:name and sh:description may have multiple values, but SHOULD only have one value per language tag.

Property constraints may have one value for the property sh:order to indicate the relative order of the property constraint for purposes such as form building. The values of sh:order must be decimals. sh:order is not used for validation purposes. If present, the recommended use of sh:order is to sort the property constraints in an ascending order, for example so that properties with smaller order are placed above (or to the left) of properties with larger order.

Property constraints may link to an instance of the class sh:PropertyGroup using the property sh:group to indicate that the constraint belongs to a group of related property constraints. Each group may have additional triples that serve application purposes, such as an rdfs:label for form building. Groups may also have an sh:order property to indicate the relative ordering of groups within the same form.

Property constraints may have a single value for sh:defaultValue. The default value does not have fixed semantics in SHACL, but MAY be used by user interface tools to pre-populate input widgets. The value type of the sh:defaultValue SHOULD align with the specified sh:datatype, sh:directType or sh:class of the same constraint.

The following example illustrates the use of these various features together.

ex:PersonFormShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:firstName ;
		sh:name "first name" ;
		sh:description "The person's given name(s)" ;
		sh:order 0 ;
		sh:group ex:NameGroup ;
	] ;
	sh:property [
		sh:predicate ex:lastName ;
		sh:name "last name" ;
		sh:description "The person's last name" ;
		sh:order 1 ;
		sh:group ex:NameGroup ;
	] ;
	sh:property [
		sh:predicate ex:streetAddress ;
		sh:name "street address" ;
		sh:description "The street address including number" ;
		sh:order 11 ;
		sh:group ex:AddressGroup ;
	] ;
	sh:property [
		sh:predicate ex:locality ;
		sh:name "locality" ;
		sh:description "The suburb, city or town of the address" ;
		sh:order 12 ;
		sh:group ex:AddressGroup ;
	] ;
	sh:property [
		sh:predicate ex:postalCode ;
		sh:name "postal code" ;
		sh:name "zip code"@en-US ;
		sh:description "The postal code of the locality" ;
		sh:order 13 ;
		sh:group ex:AddressGroup ;
	] .

ex:NameGroup
	a sh:PropertyGroup ;
	sh:order 0 ;
	rdfs:label "Name" .

ex:AddressGroup
	a sh:PropertyGroup ;
	sh:order 1 ;
	rdfs:label "Address" .

A form building application may use the information above to display instances as follows:

Name
first name: John
last name: Doe
Address
street address: 123 Silverado Ave
locality: Cupertino
zip code: 54321

Validation and Graphs

A SHACL validation engine takes two RDF graphs as input, a shapes graph and a data graph, and validates the data graph against the shapes graph as described herein.

VALIDATION DEFINITION
  • A node validates against a shape iff either it does not validate against some filter of the shape or none of the constraints in the shape produce a validation result with severity sh:Violation for the node.
  • A data graph validates against a shape iff each node that is in any of the scopes of the shape validates against the shape.
  • A data graph validates against a shapes graph iff the data graph validates against each shape in the shapes graph.

The validation process returns a results graph containing all validation results. By default, the results graph contains validation results of all severity levels but the user can request validation results with a custom minimum severity (i.e. sh:Warning). According to the definition of validation, a results graph may contain validation results but as long as none is of severity sh:Violation the data graph is considered valid. For simpler validation scenarios, SHACL validation engines should provide an additional validation interface that returns only VALID or INVALID.

During validation, the data graph and the shapes graph must remain unchanged, i.e. both graphs at the end of the validation must be identical to the graph at the beginning of validation.

A SHACL validation engine MUST implement all constructs in the core of SHACL (Sections 2, 3, 5). A SHACL engine MAY not implement the other parts of SHACL.
TODO sections 2 and 5 are implied by definition

Shapes Graph

The shapes graph contains shape definitions that a data graph can be tested against. Shape definitions can be reusable validation components. For example, a set of shapes can target data under a specific schema (i.e. SKOS) and validate different data graphs that use this schema. It is considered as a best practice to modularize shape definitions into separate graphs and import them at validation time. Importing multiple shape graphs can be achieved with the predicate predicate owl:imports. SHACL validation engines SHOULD transitively follow all owl:imports to other graphs and use the resulting union graph as shapes graph to the validation process.

In addition to shape definitions, the shapes graph may contain additional information for the validation engine such as entailment directives, namespace declarations, TODO ns declarations is an open issue, others?

Invalid Shapes Graphs

SHACL validation engines MUST reject shapes graphs that are invalid, according to the following rules. No validation results must be produced, but instead a system error reported by other means.

The classes sh:NodeConstraint, sh:PropertyConstraint and sh:InversePropertyConstraint are pairwise disjoint, i.e. it is illegal to have shape definitions that use nodes that are instances of two or more of these classes - either explicitly stated via rdf:type or implicitly via their default value type.

The values of sh:property, sh:inverseProperty and sh:constraint must have a valid type for these properties (either explicitly or via their default value type). It is not valid to only use instances of subclasses of the three system constraint classes (e.g. sh:PropertyConstraint). For example, if a value of sh:property has any declared rdf:type triples, then sh:PropertyConstraint must be one of them.

The values of sh:constraint may be instances of any subclass of sh:Constraint. If a SHACL validation engine encounters a value of sh:constraint that it does not know how to handle (e.g. because it does not support a certain extension language), it MAY produce an error or a warning, but MAY also silently ignore such constraints.

Data Graph

The data graph contains the RDF data that a SHACL engine can validate. SHACL treats it as a general RDF graph and makes no assumption if it is e.g. an RDF dataset, an in memory graph or a named graph in a remote SPARQL endpoint.

The data graph SHOULD include all the ontology axioms related to the data and especially all the rdfs:subClassOf triples in order for SHACL to correctly identify class scopes and core SHACL constraints. If such triples are missing, the validation could report false violations or miss to report some violations.

A data graph can autonomously suggest one or more shapes graph to a SHACL validation engine with the predicate sh:shapesGraph. Every value of this property is an IRI representing a shapes graph that should be used to validate the data graph. A SHACL validation engine MAY use such suggestions to determine which shapes graph to use for validating a data graph.

In the following example, a tool may use the union of ex:graph-shapes1 and ex:graph-shapes2 graphs (and their owl:imports) as the shapes graph when validating the given graph.

[] sh:shapesGraph ex:graph-shapes1 ;
	sh:shapesGraph ex:graph-shapes2 .

Results Graph

TODO talk about the results in a higher level than sec 5

Validation Results Vocabulary

The output of a SHACL constraint validation process is a set of validation results. SHACL includes an RDF vocabulary to represent such results together with structural information that may provide guidance on how to fix a violation, as well as human-readable messages.

The validation results produced by a standards-compliant SHACL validation engine MUST be the product of validation of the data graph only. Some engines MAY also report errors in the shapes graph, but those errors MUST NOT be mixed with the data validation results using the same results vocabulary.

The following code snippet represents a syntactically correct result that may have been produced by a constraint validation engine:

ex:ExampleConstraintViolation
	a sh:ValidationResult ;
	sh:severity sh:Violation ;
	sh:focusNode ex:MyCurrentNode ;
	sh:subject ex:MyCurrentNode ;
	sh:predicate ex:someProperty ;
	sh:object ex:someInvalidValue ;
	sh:message "Incorrect value: expected something else here." .

Validation results must be instances of the class sh:ValidationResult. Its superclass sh:AbstractResult defines the properties described in the following sub-sections. SHACL implementations may produce instances of other subclasses of sh:AbstractResult, for example to report successfully completed constraint checks or accumulated results.

sh:focusNode

Validation results may have a single value for the property sh:focusNode to point to an IRI or blank node that has caused the result. This represents the focus node that was validated when the validation result was produced.

sh:subject, sh:predicate and sh:object

Validation results are often caused by a single RDF triple, or a predicate in the context of a given subject or object. This information can be encoded via the properties sh:subject, sh:predicate and sh:object, each of which can have at most one value. sh:predicate can only be present if either sh:subject or sh:object have also been specified. If sh:object is unspecified, then the interpretation is that the result is caused by the subject/predicate combination. If sh:subject is unspecified, then the interpretation is that the result is caused by the object/predicate combination.

sh:sourceConstraint, sh:sourceShape and sh:sourceTemplate

Validation results may link to one sh:Constraint that has caused the result, specified via the property sh:sourceConstraint, and at the sh:Shape defining the constraint, via sh:sourceShape. Validation results that were produced by a template call may link to the sh:ConstraintTemplate that caused the result.

sh:detail

The property sh:detail may link a (parent) result with one or more other (child) results that provide further details about the cause of the (parent) result. Depending on the capabilities of the constraint validation engine, this may include failures of nested constraints that have been evaluated via sh:valueShape.

sh:message

Validation results may have values for the property sh:message to communicate additional textual details to humans. While sh:message may have multiple values, there SHOULD not be two values with the same language tag.

sh:severity

Each validation result must have exactly one of the following values for the property sh:severity.

Severity Description
sh:Info An informative message, not a violation.
sh:Warning A non-critical constraint violation indicating a warning.
sh:Violation A constraint violation that should be fixed.

Declaring the Severity of a Constraint

Constraints can specify their severity level using the property sh:severity, which must link to one of the severity types. sh:Violation is the default if unspecified. Constraints based on templates use the sh:severity declared at the template itself unless overridden at the constraint. The following example clarifies this.

ex:MyShape
	a sh:Shape ;
	sh:property [
		# Violations of either minCount and datatype are produced as warnings
		sh:predicate ex:myProperty ;
		sh:minCount 1 ;
		sh:datatype xsd:string ;
		sh:severity sh:Warning ;
	] ;
	sh:property [
		# Violation of maxCount are produced as sh:Violations (which is the default severity for sh:maxCount)
		sh:predicate ex:myProperty ;
		sh:maxCount 1 ;
	] ;
.

Part 2: Advanced Features

Part 1 of this specification has introduced features that are built into the Core of SHACL. The goal of this Core was to provide a high-level vocabulary for common use cases to describe shapes. However, SHACL also provides mechanisms to go beyond the Core vocabulary and represent constraints and scopes with greater flexibility. These mechanisms are described in the sections of Part 2.

Native Constraints

The property sh:constraint provides the most general mechanism to associate a constraint with a shape. The values of this property must be constraints - instances of the class sh:Constraint. Note that the property sh:property SHOULD be used instead of sh:constraint if the constraint is a sh:PropertyConstraint. The property sh:inverseProperty SHOULD be used instead of sh:constraint if the constraint is a sh:InversePropertyConstraint.

SHACL supports two types of general constraints:

The following sub-sections are about the latter, while templates are covered at a later stage.

An Example Native Constraint

For the sake of this example, we assume a data graph containing the following instances:

ex:ValidCountry
	a ex:Country ;
	ex:germanLabel "Spanien"@de .
  
ex:InvalidCountry
	a ex:Country ;
	ex:germanLabel "Spain"@en .

The following example illustrates the definition of a native constraint based on a SPARQL query. The value of the property sh:sparql is a SELECT query as explained in a later section.

ex:LanguageExampleShape
	a sh:Shape ;
	sh:scopeClass ex:Country ;
	sh:constraint [
		sh:message "Values must be literals with German language tag." ;
		sh:sparql """
			SELECT $this ($this AS ?subject) (ex:germanLabel AS ?predicate) (?value AS ?object)
			WHERE {
				$this ex:germanLabel ?value .
				FILTER (!isLiteral(?value) || !langMatches(lang(?value), "de"))
			}
			""" ;
	] .

The scope of the shape includes all instances of ex:Country. For those instances (represented by the variable $this), the SPARQL query walks through the values of ex:germanLabel and verifies that they are literals with a German language code. The output of the graph validation for the instances above is shown in the next example:

[
	a sh:ValidationResult ;
	sh:severity sh:Violation ;
	sh:focusNode ex:InvalidCountry ;
	sh:subject ex:InvalidCountry ;
	sh:predicate ex:focusNode ;
	sh:object "Spain"@en ;
	sh:sourceShape ex:LanguageExampleShape ;
	...
]

The SPARQL query returns result set rows for all bindings of ?value that violate the constraint. A validation result is produced for each row in that result set, using $this as the sh:focusNode and sh:subject, ex:germanLabel as sh:predicate and the violating value as sh:object.

In the example above, it is assumed that the existing SHACL validation engine is capable of evaluating native constraints using SPARQL, as described in the following section. Additional executable languages such as JavaScript may be provided based on other sets of properties like ex:javaScript, but that is outside of the scope of this specification.

SPARQL-based Native Constraints

Native SPARQL constraints are instances of sh:SPARQLConstraint, which is a subclass of sh:NativeConstraint, which in turn is a subclass of sh:Constraint. Native SPARQL constraints must have one value for the property sh:sparql. The SPARQL queries linked to a constraint via sh:sparql must be string literals that can be parsed into legal SPARQL 1.1 queries of the query form SELECT. Before parsing, a SHACL processor must prepend PREFIX statements for all namespace prefixes defined in the current shapes graph.

Pre-bound Variables in SPARQL Constraints ($this, $shapesGraph, $currentShape)

The following table enumerates variables that have special meaning in SPARQL constraints. When SPARQL constraints are executed, the validation engine must pre-bind values for these variables. The effect of this pre-binding is that all occurrences of these variables in the query will have the provided values, similar to doing a variable substitution in the query but also supporting blank nodes. A formal definition of pre-binding can be found in the Appendix.

Variable Interpretation
$this The focus node.
$shapesGraph Can be used to query the shapes graph as in GRAPH $shapesGraph { ... }. If the shapes graph is a named graph in the same dataset as the data graph then it is the IRI of the shapes graph in the dataset. Otherwise a SHACL validation engine would need to provide alternative binding to enable such querying of the shapes graph. Not all SHACL validation engines need to support this variable. Processors that do not support $shapesGraph MUST report an error if they encounter a query that references this variable. Use of GRAPH $shapesGraph { ... } should be handled with extreme caution. It may result in constraints that are not interoperable across different SHACL validation engines and that may not run on remote RDF datasets.
$currentShape The currently validated shape. Typically used in conjunction with $shapesGraph.

Mapping of Result Variables to Validation Results

Each row of the result set produced by a SELECT query must be converted into one validation result resource. The properties of those resources are derived by the following rules, through a combination of result variables and the properties linked to the constraint itself. The production rules are meant to be executed from top to bottom, so that the first bound value will be used.

Property Production Rules
sh:severity
  1. For template constraints, the value of sh:severity of the constraint node (template instance)
  2. The value of sh:severity of the subject of the sh:sparql triple
  3. sh:Violation as default
sh:focusNode
  1. The value of the variable $this
sh:subject
  1. The value of the variable ?subject
sh:predicate
  1. The value of the variable ?predicate
sh:object
  1. The value of the variable ?object
sh:message
  1. The value of the variable ?message
  2. The values of sh:message of the subject of the sh:sparql triple. These values may reference any variable from the SELECT result variables via {?varName}. If the constraint is a template constraint, then the template's argument variables can also be used. The {?varName} blocks SHOULD be substituted with suitable string representations of the values of said variables.
sh:sourceConstraint
  1. The constraint that was validated against
sh:sourceShape
  1. The shape that was validated against

Injecting Annotation Properties into Validation Results

It is possible to inject additional annotation properties into the validation result resources created for each row of the SELECT result sets. Any such property needs to be declared via a value of sh:resultAnnotation at the subject holding the sh:sparql triple. The values of sh:resultAnnotation must be IRIs or blank nodes with the following properties:

Property Value type Count Description
sh:annotationProperty rdf:Property 1 (mandatory) The annotation property that shall be set
sh:annotationVarName xsd:string 0..1 The name of the SPARQL variable to take the values from
sh:annotationValue 0..unlimited Constant nodes that shall be used as default values

For each row of a SELECT result set, a SHACL processor must walk through the declared result annotations. The mapping from result annotations to SPARQL variables uses the following rules:

  1. If a sh:resultAnnotation defines a sh:annotationVarName then the validation engine must look for the variable named after the sh:annotationVarName
  2. Otherwise, the validation engine must derive a variable name from the value of sh:annotationProperty using the same local name mechanism as described earlier

If a variable name could be determined, then the validation engine must copy the bindings for the given variable into the constructed validation results for the current row. If the variable has no binding in the result set row, then the value of sh:annotationValue must be used, if present.

The values of sh:annotationProperty must not be from the SHACL namespace, to avoid clashes with variables that are already produced by other means.

Here is a slightly complex example, illustrating the use of result annotations.

ex:ShapeWithPathViolationExample
	a sh:Shape ;
	sh:scopeNode ex:ExampleRootResource ;
	sh:constraint [
		a sh:SPARQLConstraint ;
		sh:resultAnnotation [
			sh:annotationProperty ex:time ;
			sh:annotationVarName "time"
		] ;
		sh:sparql """
			SELECT $this ?subject (ex:property2 AS ?predicate) (?first AS ?object) ?message ?time
			WHERE {
				$this ex:property1 ?first .
				?subject ex:property2 ?first .
				FILTER isBlank(?value) .
				BIND (CONCAT("The ", "message.") AS ?message) .
				BIND (NOW() AS ?time) .
			}
			""" ;
	] .
ex:ExampleRootResource
	ex:property1 ex:ExampleIntermediateResource .

ex:ExampleValueResource
	ex:property2 ex:ExampleIntermediateResource .

Which produces the following validation result resource:

[
	a sh:ValidationResult ;
	sh:severity sh:Violation ;
	sh:focusNode ex:ExampleRootResource ;
	sh:subject ex:ExampleValueResource ;
	sh:predicate ex:property2 ;
	sh:object ex:ExampleIntermediateResource ;
	sh:message "The message." ;
	sh:sourceConstraint [ the blank node of the sh:constraint above ] ;
	sh:sourceShape ex:ShapeWithPathViolationExample ;
	ex:time "2015-03-27T10:58:00"^^xsd:dateTime ;  # Example
] .

Template Constraints

Native constraints in a language like SPARQL as introduced in the previous section typically provide a lot of flexibility. However, SPARQL-based constraints may also be hard to understand for some people, and may be repetitive. Templates can be used to encapsulate and parameterize such native queries. Constraint templates can be instantiated anywhere where a native constraint may appear (in particular, at sh:constraint). Scope templates can be instantiated anywhere where a native scope may appear, at sh:scope. All of the constraint and scope types built into the SHACL Core are also represented as templates in the SHACL RDF vocabulary. Such templates form a high-level vocabulary that may also be directly interpreted ("hard-coded") without reliance on the fact that they are templates.

Constraint templates are represented as IRI nodes that are instances of the class sh:ConstraintTemplate. Scope templates are represented as IRI nodes that are instances of the class sh:ScopeTemplate. SHACL also includes a more general superclass sh:Template that may be used for other kinds of templates (rules, stored queries etc). Well-defined, non-abstract templates must provide at least one body using a property such as sh:sparql.

An Example Template Constraint

The following example illustrates the definition of a constraint template based on a SPARQL query. It is a variation of the native example constraint from the previous section. That SPARQL query included two constants: the specific property ex:germanLabel and the language tag de. Templates make it possible to generalize such scenarios, so that constants get substituted with arguments. This allows the query logic to be reused in multiple places, without having to write any new SPARQL.

ex:LanguageConstraint
	a sh:ConstraintTemplate ;
	rdfs:label "Language constraint" ;
	rdfs:subClassOf sh:TemplateConstraint ;
	sh:argument [
		sh:predicate ex:predicate ;
		sh:class rdf:Property ;
		sh:name "predicate" ;
		sh:description "The property to validate the values of." ;
    ] ;
	sh:argument [
		sh:predicate ex:lang ;
		sh:datatype xsd:string ;
		sh:name "language" ;
		sh:description "The language tag, e.g. \"de\"." ;
	] ;
	sh:labelTemplate "Values of {?predicate} must be literals with language \"{?lang}\"" ;
	sh:message "Values must be literals with language \"{?lang}\"" ;
	sh:sparql """
		SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
		WHERE {
			$this $predicate ?value .
			FILTER (!isLiteral(?value) || !langMatches(lang(?value), $lang))
		}
		""" .

Once a template has been defined, it can be instantiated as a constraint, as illustrated in the following example:

ex:TemplateLanguageExampleShape
	a sh:Shape ;
	sh:scopeClass ex:Country ;
	sh:constraint [
		a ex:LanguageConstraint ;
		ex:predicate ex:germanLabel ;
		ex:lang "de" ;
	] ;
	sh:constraint [
		a ex:LanguageConstraint ;
		ex:predicate ex:englishLabel ;
		ex:lang "en" ;
	] .

The example shape above specifies that all values of ex:germanLabel must carry the language tag de while all values of ex:englishLabel must have en as their language. These details are specified via two instances of ex:LanguageConstraint that provide values for the arguments required by the template.

The following sections introduce the properties that constraint templates may have. All of these properties except for sh:sparql are independent of SPARQL-based execution and apply to constraint templates based on other languages such as JavaScript too. A later section provides additional details for SPARQL-based SHACL templates.

Template Arguments

The arguments of a template are linked via the property sh:argument. Each argument must be an instance of sh:Argument, but the rdf:type triples of these instances can be omitted.

Each sh:Argument must have exactly one value for the property sh:predicate. The values of sh:predicate must be IRIs. The local name of a IRI is defined as the longest NCNAME at the end of the IRI, not immediately preceeded by the first colon in the IRI. The local names of the values of sh:predicate must fulfill the following conditions (to ensure a correct mapping from arguments into SPARQL variables is possible):

An sh:Argument may have its property sh:optional set to true to indicate that the argument is not mandatory.

An sh:Argument may declare a default value via sh:defaultValue. For non-optional arguments, the validation engine must use the declared default value for template instances that do not define a value for this argument. Template instances can have at most one value for each argument predicate.

An sh:Argument may declare one value for the property sh:class or one value for sh:datatype, similar to their counterparts in property constraints. Likewise, an sh:Argument may specify a sh:NodeKind via sh:nodeKind. This can be used to communicate the expected value type of the argument in template instances. Some implementations MAY use this information to prevent the execution of a template with invalid arguments.

Template Instantiation

sh:Template is subclass of rdfs:Class, which means that templates can be instantiated via rdf:type. Such template instances can be used as values of sh:constraint, among others, as demonstrated in an example above.

Template instances are called complete when they have values for all non-optional arguments. Only template instances that are complete will be used - incomplete templates will be (silently) ignored during constraint validation.

Constraint templates may be placed in a rdfs:subClassOf relationship with other templates. The implication of doing this is that when an instance of the superclass template is validated, then all (transitive) superclass templates will also be validated, assuming their arguments are complete.

sh:labelTemplate

The property sh:labelTemplate can be used to suggest how instances of the template shall be rendered to humans. The sh:labelTemplate must be a string that can reference the arguments using the syntax {?varName}, where varName is the name of the SPARQL variable that corresponds to the argument. At display time, these {?...} blocks SHOULD be substituted with the actual values used in the template instance.

Property Constraint Templates

Some constraints are about a specific property only, and SHACL provides the system properties sh:property and sh:inverseProperty for those cases. In order to define constraints that can be used similar to the built-in Core constraint properties such as sh:minCount, a SHACL template needs to declared to be a subclass of sh:PropertyConstraint (for sh:property) or sh:InversePropertyConstraint (for sh:inverseProperty). Such templates "inherit" the argument sh:predicate. This is illustrated in the following example.

ex:LanguagePropertyConstraint
	a sh:ConstraintTemplate ;
	rdfs:subClassOf sh:PropertyConstraint ;
	sh:argument [
		sh:predicate ex:lang ;
		sh:datatype xsd:string ;
		sh:name "language" ;
		sh:description "The language tag, e.g. \"de\"." ;
	] ;
	sh:labelTemplate "Values of {?predicate} must be literals with language \"{?lang}\"" ;
	sh:message "Values must be literals with language \"{?lang}\"" ;
	sh:sparql """
		SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
		WHERE {
			$this $predicate ?value .
			FILTER (!isLiteral(?value) || !langMatches(lang(?value), $lang))
		}
		""" .

ex:TemplateLanguageWithPropertyConstraintExampleShape
	a sh:Shape ;
	sh:scopeClass ex:Country ;
	sh:property [
		a ex:LanguagePropertyConstraint ;
		sh:predicate ex:germanLabel ;
		sh:datatype rdf:langString ;
		sh:maxCount 1 ;
		ex:lang "de" ;
	] .

As shown above, shapes can instantiate such templates via sh:property and mix custom constraint properties such as ex:lang with those from the SHACL Core vocabulary, such as sh:maxCount.

Templates with a sh:validationFunction

Constraint templates that are instances of sh:PropertyValueConstraintTemplate or sh:InversePropertyValueConstraintTemplate (which are subclasses of sh:ConstraintTemplate) do not require an executable body (such a sh:sparql) if they instead link to a sh:Function via the property sh:validationFunction. These so called validation functions must take an argument with the predicate sh:value as its first argument and return either true or false. This validation function must be used by a constraint validation engine to construct a procedure that iterates over all values of the (possibly inverse) property, and then runs a filter test using the function. If the filter returns false then a validation result must be produced. Validation functions may take additional arguments, and the validation engine must fill them with the matching arguments from the surrounding template. The SHACL system vocabulary contains several examples of such validation functions, e.g. sh:AbstractDatatypePropertyConstraint.

The following example defines a constraint template using a validation function from a later section.

ex:LanguageConstraint
	a sh:PropertyValueConstraintTemplate ;
	rdfs:label "Language constraint" ;
	rdfs:subClassOf sh:TemplateConstraint ;
	sh:argument [
		sh:predicate ex:predicate ;
		sh:class rdf:Property ;
		sh:name "predicate" ;
		sh:description "The property to validate the values of." ;
    ] ;
	sh:argument [
		sh:predicate ex:lang ;
		sh:datatype xsd:string ;
		sh:name "language" ;
		sh:description "The language tag, e.g. \"de\"." ;
	] ;
	sh:labelTemplate "Values of {?predicate} must be literals with language \"{?lang}\"" ;
	sh:message "Values must be literals with language \"{?lang}\"" ;
	sh:validationFunction ex:hasLanguage .

SPARQL-based Constraint Templates

If a sh:Template has a value for sh:sparql, then the corresponding instances need to follow the same execution rules as outlined for SPARQL-based Constraints and SPARQL-based Scopes. The only difference is that the SPARQL queries need to be executed with additional pre-bound variables, derived from the arguments of the template. The names of those variables must match the local name of the argument predicates, including the arguments defined by any (transitive) superclasses of the template. For example, if an argument is represented with the predicate ex:myArgument then the variable ?myArgument must be pre-bound with the value of the argument in the template instance.

If a sh:PropertyValueConstraintTemplate has a value for sh:validationFunction, then the validation engine needs to produce a SPARQL query equivalent to the following pattern:

SELECT $this ($this AS ?subject) $predicate ?object
WHERE {
	$this $predicate ?object .
	FILTER (!{validationFunction}(?object, {+ other matching arguments})) .
}

If a sh:InversePropertyValueConstraintTemplate has a value for sh:validationFunction, then the validation engine needs to produce a SPARQL query equivalent to the following pattern:

SELECT $this ?subject $predicate ($this AS ?object)
WHERE {
	?subject $predicate $this .
	FILTER (!{validationFunction}(?subject, {+ other matching arguments})) .
}

General Scopes (sh:scope)

In addition to the scope classes introduced in the core section, such as sh:PropertyScope, SHACL provides facilities to define custom scopes. Similar to constraints, scopes may either be native scopes or be an instance of sh:TemplateScope. All this is analogous to how constraints work, but with the additional restrictions:

SPARQL-based Scopes

SPARQL-based scopes must be instances of sh:SPARQLScope, which is a subclass of sh:NativeScope. The SPARQL queries linked to a scope via sh:sparql must be of the query form SELECT. The SELECT queries must project to the result variable ?this. The resulting scope consists of all distinct bindings for the variable ?this.

The SELECT queries must also be executable when converted to an ASK query and with a pre-bound value for ?this. The set of bindings for ?this that return true for such ASK queries must be identical to the set produced by the SELECT query. This constraint makes sure that validation engines can validate whether a given shape applies to a given focus node.

The following example illustrates a well-formed SPARQL-based scope that produces all persons born in the USA:

ex:USCitizenShape
	a sh:Shape ;
	sh:scope [
		a sh:SPARQLScope ;
		sh:sparql """
			SELECT ?this
			WHERE {
				?this a ex:Person .
				?this ex:bornIn ex:USA .
			}
			""" ;
	] ;
	sh:constraint ...

Functions

SHACL functions define operations that produce an RDF node based on zero or more arguments and an input RDF Graph (or dataset). Functions can be called within SPARQL queries to encapsulate complex logic of other SPARQL queries, or executable logic in other languages such as JavaScript. However, the general declaration mechanism for SHACL functions is independent from SPARQL and may also be exploited by other environments.

Functions must be declared as instances of the class sh:Function. Well-defined, non-abstract functions must provide at least one body property such as sh:sparql.

An Example Function

The following example illustrates the definition of a function based on a SPARQL query.

ex:exampleFunction
	a sh:Function ;
	rdfs:comment "Computes the sum of its two arguments ?arg1 and ?arg2." ;
	sh:returnType xsd:integer ;
	sh:argument [
		sh:predicate sh:arg1 ;
		sh:datatype xsd:integer ;
		sh:description "The first operand" ;
	] ;
	sh:argument [
		sh:predicate sh:arg2 ;
		sh:datatype xsd:integer ;
		sh:description "The second operand" ;
	] ;
	sh:sparql """
		SELECT ($arg1 + $arg2 AS ?result)
		WHERE {
		}
		""" .

Based on the declaration above, SPARQL engines with full SHACL support can install a new SPARQL function based on the SPARQL 1.1 Extensible Value Testing mechanism. Such engines are then able to handle expressions such as ex:exampleFunction(40, 2), producing 42, as illustrated in the following SPARQL query.

SELECT ?subject
WHERE {
	?subject ex:myProperty ?value .
	FILTER (ex:exampleFunction(?value, 2) = 42) .
}

The following sections introduce the properties that all such functions may have. A later section provides additional details for SPARQL-based SHACL functions.

Function Arguments

The arguments of a function are linked to its sh:Function via the property sh:argument. Each argument must be an instance of sh:Argument, but their rdf:type triple can be omitted.

Each sh:Argument must have exactly one value for the property sh:predicate. The values of sh:predicate must be IRIs, and follow the same restrictions outlined for Template Arguments. Arguments are "inherited" from the superclasses of the function. For example if a superclass already declares sh:arg1 then subclasses may only define sh:arg2 etc.

Arguments are ordered, corresponding to the notation of function calls in SPARQL such as ex:exampleFunction(?arg1, ?arg2). The ordering of function arguments (e.g. for printing in SPARQL strings) is determined by their index. For each function, the indices must be 0, 1, 2 etc. The index of each declared sh:Argument is determined as follows:

  1. The index of the built-in argument predicates sh:arg1, sh:arg2 etc is their numeric name part minus 1, e.g. sh:arg1 has index 0.
  2. The index of other argument predicates is the value of the property sh:order at the surrounding sh:Argument.
  3. Arguments that are neither of the form sh:argX nor have an sh:order are place at the end, whereby arguments that have sh:optional set to true get a higher index than non-optional arguments.

Each sh:Argument may have its property sh:optional set to true to indicate that the argument is not mandatory. If an argument has been declared optional, then all succeeding arguments must also be declared optional.

Similar to Property Constraints, each sh:Argument may declare one value for the property sh:datatype or one value for the property sh:class. This can be used to communicate the expected value type of the argument in function calls. Some implementations MAY use this information to prevent the execution of a function with invalid arguments.

sh:returnType

A function may declare a single return type via sh:returnType. This information may serve for documentation purposes, only. However, in some execution languages such as JavaScript, the declared sh:returnType may inform a processor how to cast a native value into an RDF value type.

Validation Functions

It is a common design pattern for functions to take a value as input and validate whether that value fulfills certain conditions or not. In support of this pattern, SHACL supports validation functions, which are instances of sh:Function that are also subclasses of sh:ValidationFunctions. From that superclass, these functions "inherit" the (first) argument sh:value. Validation functions may define additional arguments with sh:order values larger than 1. The following example illustrates a validation function for the running example of the section on constraint templates.

ex:hasLanguage
	a sh:Function ;
	rdfs:subClassOf sh:ValidationFunctions ;
	sh:argument [
		sh:predicate ex:lang ;
		sh:datatype xsd:string ;
		sh:order 1 ;
		sh:name "language" ;
		sh:description "The language to match against, e.g. \"de\"." ;
	] ;
	sh:returnType xsd:boolean ;
	sh:sparql """
  		ASK {
  			FILTER (isLiteral($value) && langMatches(lang($value), $lang)) .
		}
		""" .

An example invocation of the function above is: ex:hasLanguage("Spain"@en, "en"), producing true.

SPARQL-based Functions

If a sh:Function has a value for sh:sparql then it can be regarded as a SPARQL-based function. In the SPARQL query, the SPARQL processor needs to pre-bind variables based on the provided arguments of the function call. The SPARQL query must be of type ASK or SELECT. For ASK queries, the function's return value is the result of the ASK query execution. For SELECT queries, the function's return value is the first binding of the first result variable in the result set. Since all other bindings will be ignored, such SELECT queries SHOULD only return a single result variable and at most one row.

According to resolution 2015.12.16/04 shapes graphs with dependency loops are invalid and suitable limitations of this will be explored. Until issue 22 is closed, definitions regarding recursion are not endorsed by the WG.

Recursive use of functions is undefined: If a SPARQL-based function contains calls to other functions so that the same function with the same combination of arguments would be visited twice then the result of the function call is undefined. An implementation may either return no result (unbound) or terminate the surrounding SPARQL query with an error.

Some validation engines may ignore the specified sh:sparql query and rely on an alternative (possibly native) implementation instead, as long as the functions return the same values as the specified sh:sparql query. This can be used to optimize frequently needed functions. Some processors may even use the sh:sparql query to rewrite other SPARQL queries via inlining techniques.

Derived Values Constraints

It is a common scenario that certain property values are derived from other values. For example, the area of a rectangle must be the product of width and height, or an uncle of a person is a male sibling of a parent. SHACL includes a property sh:derivedValues that can be used with property and inverse property constraints, to define such constraints. The values of sh:derivedValues must be instances of the class sh:DerivedValuesTemplate, although the rdf:type triple of those instances is optional. Each sh:DerivedValuesTemplate must include execution instructions such as a SPARQL query or a JavaScript snippet, that produce the values that the property is expected to have. This is illustrated in the following example.

ex:RectangleShape
	a sh:Shape ;
	sh:property [
		sh:predicate ex:width ;
		sh:datatype xsd:integer ;
	] ;
	sh:property [
		sh:predicate ex:height ;
		sh:datatype xsd:integer ;
	] ;
	sh:property [
		sh:predicate ex:area ;
		sh:datatype xsd:integer ;
		sh:derivedValues [
			sh:sparql """
				$this ex:width ?width .
				$this ex:height ?height .
				BIND (?width * ?height AS ?value) .
				""" ;
		] ;
	] .

For SHACL processors supporting SPARQL, a sh:DerivedValuesTemplate can have a value of sh:sparql. The values of sh:sparql must be SPARQL fragments that can be turned into a valid SPARQL query by surrounding it with the prefix declarations from the shapes graph and SELECT ?value WHERE { ... }. These fragments can access the current focus node via the variable $this and must produce bindings for the variable ?value for all derived values. In the example above, all values of the property ex:area must be all products of ex:width and ex:height.

TEXTUAL DEFINITION
Let S be the set of nodes produces by the derived values template for the focus node. A validation result must be produced for every value of the given property sh:predicate that is not in S, and for every member of S that is not a property value. The produced validation result must have the focus node as its sh:subject, the sh:predicate as its sh:predicate, and the missing or extra value as its sh:object. (The same definition applies in the inverse direction if sh:derivedValues is used in an inverse property constraint.)

Validation of shapes graphs and the sh:defaultValueType property

The SHACL system vocabulary itself is using shapes, allowing SHACL constraint validation to be executed on shapes graphs, e.g. to validate the syntax of shape definitions. However, some system properties such as sh:property, sh:filterShape and sh:argument may have untyped blank nodes or IRIs as their values. If, for example, a value of sh:property is a blank node that does not have any rdf:type, then the assumption is that the blank node has type sh:PropertyConstraint. Unless these implicit triples are present in the data graph, constraint validation will not apply the constraints defined for sh:PropertyConstraint.

If a validation engine intends to validate the syntax of a SHACL shapes graph itself, it should (temporarily) add the missing rdf:type triples. The SHACL system vocabulary includes some helper triples using the predicate sh:defaultValueType to specify the default rdf:type for certain properties. For example, the default value type of sh:property is sh:PropertyConstraint. These triples can be queried by a pre-processor to construct the missing type triples for the affected nodes. SHACL includes a template sh:DefaultValueTypeRule which encapsulates a SPARQL query that can be used for that purpose:

CONSTRUCT {
	?node a ?defaultValueType .
}
WHERE {
	?predicate sh:defaultValueType ?defaultValueType .
	?anySubject ?predicate ?node .
	FILTER (NOT EXISTS { ?node a ?anyType }) .
}

The operations in this section assume that these default value types are present in the shapes graph, e.g. simplifying the test whether a given node is a sh:PropertyConstraint.

Entailment

By default, SHACL does not assume any entailment regime [[!sparql11-entailment]] to be activated on the data graph. However, the property sh:entailment can be used to instruct a SHACL validation engine to ensure that a given entailment is activated. The values of sh:entailment must be IRIs, with common use cases covered by [[!sparql11-entailment]].

SHACL validation engines are not required to support any entailment regimes. If an entailment regime is provided in the data graph which is not supported by the engine, the validation must produce a failure.

Appendix

Glossary of Key Concepts

Shape

Constraint

Constraint Validation

Focus Node

Scope

Filter Shape

Template

Function

The Function sh:hasShape

The following definition is under discussion.

SHACL implementations with full support of the SHACL SPARQL extension mechanism must implement a function sh:hasShape, which takes the following arguments:

Argument Value Type Summary
focusNode rdfs:Resource The focus node to validate.
shape rdfs:Resource The shape to validate the focus node against.
shapesGraph rdfs:Resource The IRI of the current shapes graph.

An example call of this function is

				BIND (sh:hasShape(ex:JohnDoe, ex:PersonShape, $shapesGraph) AS ?hasShape)
			

None of the arguments can be unbound. The result of the sh:hasShape function is either true, false or undefined:

Note that any validation results produced inside of the sh:hasShape function are temporary, i.e. they are not added to the results graph of the surrounding execution environment. However, some implementations may add those nested validation results as annotations to the surrounding validation results, via sh:detail.

Pre-binding of Variables in SPARQL Queries

The following definition of what pre-binding means has not been approved by the WG yet, and is work in progress.

Some features of the SPARQL-based extension mechanism of SHACL rely on the concept of pre-binding of variables. Although this concept is supported by several existing SPARQL implementations, there is no formal definition of pre-binding in the SPARQL 1.1 specifications. The goal of this section is to illustrate the effect of pre-binding to users and implementers. Note however that the following definition is not meant to serve as recommendation for an actual implementation strategy.

pre-binding a variable with a value means that, prior to evaluating a query, the SHACL processor needs to substitute all occurrences of the variable in the query (including inner scopes and nested SELECT queries) with the provided value. When such a substitution is made, two additional considerations need to be made, as covered by the following sub-sections.

Handling of Invalid Syntax

If variables are substituted in certain expressions, then the expressions may violate the syntax rules of SPARQL. The following adjustments need to be made to the query to accommodate those. Note that the variable ?var is assumed to be a pre-bound variable in the following code snippets.

Handling of Blank Nodes

Blank nodes are assumed to have a consistent identity, i.e. they are not treated as variables when pre-bound. However, the SPARQL standard does not include an official syntax to represent such identities in textual form. In order to implement pre-binding, SPARQL processors may apply techniques such operating on Algebra level or representing blank nodes via special IRIs (such as urn:x-bnode:ID) which are translated back to corresponding blank nodes at execution time.

Acknowledgements

Many people contributed to this specification, including members of the RDF Data Shapes Working Group. We especially thank the following:

Arnaud Le Hors (chair), Iovka Boneva, Karen Coyle, Richard Cyganiak, Michel Dumontier, Holger Knublauch, Dimitris Kontokostas, Jose Labra, Peter Patel-Schneider, Eric Prud'hommeaux, Arthur Ryman (who also served as a co-editor until Feb 2016), Harold Solbrig, Simon Steyskal, Ted Thibodeau