- From: Irene Polikoff <irene@topquadrant.com>
- Date: Mon, 5 Jun 2017 17:09:21 -0400
- To: Eric Prud'hommeaux <eric@w3.org>
- Cc: public-rdf-shapes@w3.org
- Message-Id: <62A57D1D-4669-4065-83D4-FE2B74B2E7DD@topquadrant.com>
I think you could do
sh:xone (
[
sh:property [ sh:path foaf:name ; sh:minCount 1 ;];
sh:property [ sh:path foaf:familyName ; sh:maxCount 0 ; ];
sh:property [sh:path foaf:givenName ; sh:maxCount 0 ; ]
]
[
sh:property [sh:path foaf:familyName ;sh:minCount 1 ;] ;
sh:property [sh:path ex:givenName ; sh:minCount 1 ;];
sh:property [ sh:path foaf:name ; sh:maxCount 0 ;]
]
)
Or you could skip the use of maxCount=0 in the sh:xone and instead create separate “co-occurance” shapes that say that certain properties should be used together - by using subjectsOf target e.g.
ex:MustHaveGivenName sh:targetSubjectsOf foaf:familyName ;
sh:property [sh:path foaf:givenName ; sh:minCount 1 ;]
ex:MustHaveFamilyName sh:targetSubjectsOf foaf:givenName ;
sh:property [sh:path foaf:familyName ; sh:minCount 1 ;]
It may make sense to create a re-usable co-occurance constant component as part of an extension library, so one didn’t have to create a shape for each predicate in the pair (or more) of predicates that are used together.
> On Jun 5, 2017, at 2:48 PM, Eric Prud'hommeaux <eric@w3.org> wrote:
>
> * 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 21:09:57 UTC