- From: Holger Knublauch <holger@topquadrant.com>
- Date: Mon, 24 Aug 2020 09:32:03 +1000
- To: public-shacl@w3.org
- Message-ID: <019fe309-1233-050e-759c-746c969bee84@topquadrant.com>
I think your observations are correct. sh:and and sh:or say that each
value node must conform to all, resp one of the provided shapes. Those
shapes may either be property shapes or nodes shapes. So
[
sh:path ex:info ;
sh:or ([ sh:hasValue "blue" ; ] [ sh:hasValue "red" ; ] [ sh:hasValue "purple" ; ] ) ;
]
is quite different from
[
sh:or (
[ sh:path ex:info ; sh:hasValue "blue" ; ]
[ sh:path ex:info ; sh:hasValue "red" ; ]
[ sh:path ex:info ; sh:hasValue "purple" ; ]
)
]
because sh:hasValue is typically only used for property shapes, not node
shapes.
Holger
On 21/08/2020 06:09, Håvard Ottestad wrote:
> 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 Sunday, 23 August 2020 23:32:18 UTC