Re: Interaction between minCount and hasValue

Jose,

My reading of the spec is that sh:hasValue is an existential
qualifier. The graph MUST have one triple that has the value.
Therefore the graph would be invalid if your optional property was
missing.

I believe you can express your constraint by saying:

1. maxCount is 1
2. use a qualified cardinality constraint with maxCount 1 for the desired value

-- Arthur

On Thu, Nov 5, 2015 at 3:45 AM, Jose Emilio Labra Gayo
<jelabra@gmail.com> wrote:
> Thanks, however, although the previous example can be defined using
> filterShape, the question remains about what is the expected behaviour of a
> SHACL processor that encounters "sh:minCount 0" and "sh:hasValue" at the
> same time.
>
> For example, if we have:
>
> :UserShape
>    a sh:Shape ;
>     sh:property [
>         sh:predicate :role ;
>         sh:hasValue :User ;
>         sh:minCount 0 ;
>         sh:maxCount 1 ;
>     ]    .
>
> :u1 sh:nodeShape :UserShape ; :role :User .
> :u2 sh:nodeShape :UserShape.
>
> What should a SHACL processor do?
>
> 1.- Validate the graph because both :u1 and :u2 satisfy the :UserShape
> constraints
> 2.- Complain that :u2 doesn't satisfy the sh:hasValue constraint
> 3.- Raise an error because the :UserShape is not well formed
>
> Best regards, Jose Labra
>
> On Thu, Nov 5, 2015 at 6:55 AM, Holger Knublauch <holger@topquadrant.com>
> wrote:
>>
>> Hi Jose,
>>
>> I think you can use a sh:filterShape to limit when your constraint
>> applies.
>>
>> Untested:
>>
>> :UserShape
>>    a sh:Shape ;
>>     sh:property [
>>         sh:predicate :role ;
>>         sh:hasValue :User ;
>>         sh:filterShape [
>>             sh:property [
>>                 sh:predicate :role ;
>>                 sh:minCount 1 ;
>>             ] ;
>>         ]
>>     ]    .
>>
>> The intention of the above is to say that the hasValue constraint only
>> applies to instances where :role has at least one value.
>>
>> Holger
>>
>>
>>
>> On 11/5/2015 15:47, Jose Emilio Labra Gayo wrote:
>>
>> I would like to model optional properties which can appear or not, but in
>> case that they appear have a fixed value.
>>
>> For example, in ShEx, I can define the following shape:
>>
>> <UserShape> {
>>    rdfs:label xsd:string,
>>    ex:role ex:User ?
>> }
>>
>> where ex:role is an optional property with a fixed value. If it appears,
>> it must be ex:User.
>>
>> My first thought is that the previous example could be represented in
>> Shacl as:
>>
>> :UserShape
>>    a sh:Shape ;
>>    sh:property [
>>         sh:predicate rdfs:label ;
>>         sh:datatype xsd:string ;
>>         sh:minCount 1 ;
>>         sh:maxCount 1 ;
>>     ] ;
>>     sh:property [
>>         sh:predicate :role ;
>>         sh:hasValue :User ;
>>         sh:minCount 0 ;
>>         sh:maxCount 1 ;
>>     ]    .
>>
>> However,reading the spec, I am not sure about the interaction between
>> sh:minCount and sh:hasValue.
>>
>> It appears that if we include sh:minCount 0, the spec says: "If the value
>> is 0 then this constraint is always satisfied and so may be omitted."
>>
>> However, the definition of sh:hasValue says: "A validation result must be
>> produced if there is no triple that has the focus node as its subject, the
>> sh:predicate as its predicate and the sh:hasValue as its object." and the
>> SPARQL query seems to raise an error in that case, which means that the
>> following instance data woud not be valid:
>>
>> :user1 rdfs:label "Student 2" .
>>
>> Is is possible to combine optional properties with fixed values as in the
>> previous example or is there another way to define it?
>>
>> --
>> -- Jose Labra
>>
>>
>
>
>
> --
> -- Jose Labra
>

Received on Thursday, 5 November 2015 17:11:36 UTC