- From: Håvard Ottestad <hmottestad@gmail.com>
- Date: Thu, 20 Aug 2020 22:09:42 +0200
- To: Public Shacl W3C <public-shacl@w3.org>
- Message-Id: <0C655F17-5435-4047-94CA-E0D89A17B812@gmail.com>
Hi,
I’ve received some questions about how the RDF4J SHACL implementation handles sh:or. These have lead me down a path of trying to figure out how things are supposed to work, and now I’m wondering a bit about why.
The main issue is how using the logical operators introduce a new contextual level.
Essentially how:
ex:shape1
a sh:NodeShape ;
sh:targetClass ex:Test ;
sh:property [
sh:path ex:info ;
sh:and ([ sh:hasValue "blue" ; ] ) ;
] ;
.
is different from:
ex:shape1
a sh:NodeShape ;
sh:targetClass ex:Test ;
sh:property [
sh:path ex:info ;
sh:hasValue "blue" ;
] ;
.
The first says: “if there is a node of type ex:Test and it happens to have a value for ex:info, then all those values must be “blue””.
The second says: “if there is a node of type ex:Test, then it must have “blue” as a value for ex:info and by extension at least one value for ex:info”.
I remember the discussion that lead to the introduction of dash:hasValueIn, where we used sh:or ( [ sh:hasValue V1 ] [ sh:hasValue V2 ] ) as a simplification for dash:hasValueIn. But this was obviously wrong, since using the sh:or means that each value must be either V1 or V2.
Essentially this use of sh:or is equivalent to sh:in. As in that:
sh:or ([ sh:hasValue "blue" ; ] [ sh:hasValue "red" ; ] [ sh:hasValue "purple" ; ] ) ;
is the same as
sh:in ("blue" "red" "purple");
Am I understanding all this correctly?
Cheers,
Håvard
Received on Thursday, 20 August 2020 20:09:58 UTC