- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Thu, 18 Feb 2016 14:33:05 -0800
- To: RDF Data Shapes Working Group <public-data-shapes-wg@w3.org>
The following data graph
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ex: <http://example.org/> .
ex:l1 rdf:first ex:l2 .
ex:l1 rdf:rest ex:l1 .
ex:l1 rdf:rest ex:l2 .
currently validates against
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ex: <http://example.org/> .
ex:s1 a sh:Shape ;
sh:scopeNode ex:l1 ;
sh:constraint [ a sh:Constraint ; sh:class rdf:List ] .
This special cases rdf:List, but in a way that is not useful at all, as it
validates something that should not be considered to be a list. If lists
are to be treated specially, SHACL should do something reasonable for them.
A reasonable approach to supporting lists is to have a special constraint
construct for lists whose elements validate against a shape, as in
ex:personList a sh:Shape ;
sh:constraint [ a sh:Constraint ;
sh:list [ a sh:Shape;
sh:constraint [ a sh:Constraint; sh:class ex:Person ] ] ] .
The shape here is true of a node if it is a single-tailed finite RDF list
and each of the list elements validates against the embedded shape. This is
the case for a node precisely when the transitive-reflexive closure of
rdf:next from the node contains rdf:nil and for each node in the closure it
must be the case that either the node is rdf:nil and it has no outgoing
rdf:next or rdf:first edges or if it is not rdf:nil then the node has
precisely one outgoing rdf:next edge and precisely one outgoing rdf:first
edge and the object of the outgoing rdf:first edge has SHACL type ex:Person.
This construct can validate lists that have different kinds of conditions,
such as lists of blank nodes
ex:blankList a sh:Shape ;
sh:constraint [ a sh:Constraint ;
sh:list [ a sh:Shape;
sh:constraint [ a sh:Constraint; sh:nodeKind sh:BlankNode ] ] ] .
or lists of childless people
ex:childlessList a sh:Shape ;
sh:constraint [ a sh:Constraint ;
sh:list [ a sh:Shape;
sh:constraint [ a sh:Constraint; sh:class ex:Person ] ;
sh:property [ a sh:PropertyConstraint;
ex:predicate ex:child; ex:maxCount 0 ] ] ] .
It can even validate lists that have no conditions on their elements, but
just must be well-formed lists
ex:anyList a sh:Shape ;
sh:constraint [ a sh:Constraint ; sh:list [ a sh:Shape ] ] .
Received on Thursday, 18 February 2016 22:33:34 UTC