W3C home > Mailing lists > Public > public-rdf-shapes@w3.org > June 2017

Re: compiling ShEx oneOf to SHACL

From: Eric Prud'hommeaux <eric@w3.org>
Date: Mon, 5 Jun 2017 14:48:36 -0400
To: Irene Polikoff <irene@topquadrant.com>
Cc: public-rdf-shapes@w3.org
Message-ID: <20170605184833.GD1427@w3.org>
* Irene Polikoff <irene@topquadrant.com> [2017-06-05 10:54-0400]
> You can use sh:xone instead of sh:or, then you will not need any NOT statements

sh:xone works for disjuncts with a single property in them but if
you have more, as in foaf:givenName and foaf:familyName, it doesn't
prevent complete matches of one disjunct with partial matches of
another.
[[
For each value node v let N be the number of the shapes that are
members of $xone where v conforms to the shape.
]]
(What's "$xone"?)

To illustrate this, <F_extraGiven> and <F_extraFamily> pass the shape
below:

<P_name>        foaf:name "Bob Smith".
<P_givenFamily>                         foaf:givenName "Bob" ; foaf:familyName "Smith" .
<F_missing>     <p> <o> .
<F_extraBoth>   foaf:name "Bob Smith" ; foaf:givenName "Bob" ; foaf:familyName "Smith" .
<F_extraGiven>  foaf:name "Bob Smith" ; foaf:givenName "Bob" .
<F_extraFamily> foaf:name "Bob Smith" ;                        foaf:familyName "Smith" .


> http://w3c.github.io/data-shapes/shacl/#XoneConstraintComponent <http://w3c.github.io/data-shapes/shacl/#XoneConstraintComponent>
> 
> 
> > On Jun 5, 2017, at 7:02 AM, Eric Prud'hommeaux <eric@w3.org> wrote:
> > 
> > I'm considering the feasibility of compiling ShEx to SHACL. Is there a
> > shorter way to compile this ShEx oneOf:
> > 
> > <NameShape> {
> >    foaf:name LITERAL
> >  | foaf:givenName LITERAL ; foaf:familyName LITERAL
> > }
> > 
> > than this SHACL?:
> > 
> > :UserShape
> >  sh:or (
> >    [ sh:and (
> >      [ sh:property
> >        [ sh:path foaf:name; sh:minCount 1; sh:maxCount 1 ] ]
> >      [ sh:not [
> >         sh:property
> >           [ sh:path foaf:givenName; sh:minCount 1; sh:maxCount 1 ] ] ]
> >      [ sh:not [
> >         sh:property
> >           [ sh:path foaf:familyName; sh:minCount 1; sh:maxCount 1 ] ] ] ) ]
> >    [ sh:and (
> >      [ sh:not [ sh:property
> >        [ sh:path foaf:name; sh:minCount 1; sh:maxCount 1 ] ] ]
> >      [ sh:property
> >        [ sh:path foaf:givenName; sh:minCount 1; sh:maxCount 1 ] ]
> >      [ sh:property
> >        [ sh:path foaf:familyName; sh:minCount 1; sh:maxCount 1 ] ] ) ] ) .
> > 
> > -- 
> > -ericP
> > 
> > office: +1.617.599.3509
> > mobile: +33.6.80.80.35.59
> > 
> > (eric@w3.org)
> > Feel free to forward this message to any list for any purpose other than
> > email address distribution.
> > 
> > There are subtle nuances encoded in font variation and clever layout
> > which can only be seen by printing this message on high-clay paper.
> > 
> 

-- 
-ericP

office: +1.617.599.3509
mobile: +33.6.80.80.35.59

(eric@w3.org)
Feel free to forward this message to any list for any purpose other than
email address distribution.

There are subtle nuances encoded in font variation and clever layout
which can only be seen by printing this message on high-clay paper.
Received on Monday, 5 June 2017 18:48:44 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 17:02:50 UTC