Re: scopeNode and scopeClass

Hi Karen,

I think there is some confusion here on the role of scope and node
constraints

when we put the constraint in the node (nodeConstraints) the node
constraint does not apply on all the focus nodes together but on the focus
nodes one by one, as it does on the property constraints.

let's take the example you had in mind
ex:MyShape
    a sh:Shape ;
    sh:scopeNode foaf:Person ;
    sh:constraint [
        sh:maxCount 2 ;
    ] .

with data
ex:Bob a foaf:Person
ex:Alice a foaf:Person
ex:Carol a foaf:Person

in this case the sh:maxCount argument is applied separately for ex:Bob,
ex:Alice and ex:Carol and it is always valid.
The reason this shape is always valid for any graph because each focus node
always has count = 1 when it is evaluated
(this goes with the discussion that some constraints does not make sense in
certain contexts)

if you want to limit the number of Persons inside a data graph, Holgers
example would do the trick but doesn't take SHACL instances into account,
only direct types

Dimitris

On Sun, Jun 12, 2016 at 1:13 PM, Karen Coyle <kcoyle@kcoyle.net> wrote:

> Sorry my last note was abrupt - was in an airport and my flight was
> called. Here's my summary of this issue:
>
> - min/maxCount are defined only for predicate-based constraints
> - maxCount "n" instances of classA cannot be a class-based constraint
> - the validation requirement "n instances of classA" must be done as:
>
>  ex:MyShape
>      a sh:Shape ;
>      sh:scopeNode foaf:Person ;
>      sh:inverseProperty [
>          sh:predicate rdf:type ;
>          sh:maxCount 2 ;
>      ] .
>
> My response is that
>
> 1) this is inconsistent. If there is a need to count instances of a class
> it should be done with scopeClass as with all other class-based validation
> requirements
> 2) this is not clear in the SHACL document. (I would be interested to hear
> from others on the list whether this was obvious to them.)
>
> I don't think we should accept this kind of inconsistency in the standard.
>
> kc
>
>
> On 6/9/16 10:10 PM, Holger Knublauch wrote:
>
>> Karen,
>>
>> I am a bit lost about what you are referring to. This discussion started
>> about using scopeNode to represent number of instances in a graph, and
>> then we added scopeClass into the mix. So I assume you are probably
>> referring to the examples in sections 2.1.1 and 2.1.2. The scopeNode
>> example in 2.1.1 has nothing to do with rdf:type. For class-based
>> scopes, 2.1.2 already has two different data graphs - the first one with
>> Alice and Bob is showing "direct" instances, while the ex:Who a
>> ex:Doctor example already demonstrates how rdfs:subClassOf triples are
>> used.
>>
>> Or are you looking for a mechanism to count instances of a given class
>> within the data graph, also taking subclasses into consideration?
>>
>> Could you clarify?
>>
>> Holger
>>
>> PS: I have changed the subject line of this email to reflect the drift
>> in topic
>>
>>
>> On 10/06/2016 14:08, Karen Coyle wrote:
>>
>>> It isn't a question of switching them. I find that the examples do not
>>> show the difference between class-defined nodes and predicate-defined
>>> node that uses rdf:type as the predicate. Since all rdf:type/s must be
>>> explicitly defined, these are either the same, or they are different,
>>> and if they are different, that needs to be made clear.
>>>
>>> kc
>>>
>>> On 6/9/16 9:26 AM, Irene Polikoff wrote:
>>>
>>>> Examples in the spec would not have the same result if scopeNode and
>>>> scopeClass were switched. They look pretty clear to me as they all
>>>> identify what focus nodes would be selected.
>>>>
>>>> May be the following will help:
>>>>
>>>> Let¹s say there is a graph like so:
>>>>
>>>> ex:Person rdfs:label ŒPerson¹.
>>>> ex:Person rdfs:label ŒHuman Being¹.
>>>> ex:Alice rdf:type ex:Person.
>>>> ex:Alice rdfs:label ŒAlice¹.
>>>> ex:Alice rdfs:label ŒAlice Jones¹.
>>>> ex:Bob rdf:type ex:Person.
>>>> ex:Joe rdf:type ex:Person.
>>>> ex:Joe rdfs;label ŒJoe¹.
>>>>
>>>> And a shape
>>>>
>>>> ex:Shape1
>>>>      a sh:Shape ;
>>>>      sh:scopeNode ex:Person ;
>>>>      sh:property [
>>>>          sh:predicate rdfs:label ;
>>>>          sh:maxCount 1 ;
>>>>      ] .
>>>>
>>>>
>>>> The node in focus is ex:Person and there will be a violation because it
>>>> has two labels. No other nodes are in focus, no other violations.
>>>>
>>>> If there was a different shape
>>>>
>>>> ex:Shape2
>>>> a sh:Shape ;
>>>> sh:scopeClass ex:Person ;
>>>> sh:property [
>>>> sh:predicate rdfs:label ;
>>>> sh:maxCount 1 ;
>>>> ] .
>>>>
>>>>
>>>> Then, three nodes are in scope - ex:Alice, ex:Bob and ex:Joe. There will
>>>> be one violation for ex:Alice.
>>>>
>>>> Lets look at the shape Holger has below. This shape demonstrates, among
>>>> other things, that the validation can look at triples with the focus
>>>> nodes
>>>> as objects by using sh:inverseProperty
>>>>
>>>> ex:MyShape
>>>>      a sh:Shape ;
>>>>      sh:scopeNode ex:Person ;
>>>>      sh:inverseProperty [
>>>>          sh:predicate rdf:type ;
>>>>          sh:maxCount 2 ;
>>>>      ] .
>>>>
>>>> The focus node is ex:Person and there will be a violation since there
>>>> are
>>>> three triples that follow the {?x rdf:type ex:Person} pattern.
>>>>
>>>>
>>>> Irene
>>>>
>>>>
>>>>
>>>> On 6/9/16, 1:33 AM, "Karen Coyle" <kcoyle@kcoyle.net> wrote:
>>>>
>>>> Holger, that still doesn't explain what the difference is. What is the
>>>>> quality of a SHACL class that is different to a triple with a predicate
>>>>> of rdf:type? Are you saying that scopeClass implies/allows subclass
>>>>> relationships to be included? If so, that must be said in the
>>>>> specification, and it should be illustrated in the examples. As it is,
>>>>> the examples given would have the same result using either predicate.
>>>>>
>>>>> Also, the section that introduces scopeNode does not say that it
>>>>> applies
>>>>> only to the subject of a triple. If that is the case, then it needs to
>>>>> specify that.
>>>>>
>>>>> kc
>>>>>
>>>>> On 6/8/16 9:44 PM, Holger Knublauch wrote:
>>>>>
>>>>>>
>>>>>> On 9/06/2016 14:40, Karen Coyle wrote:
>>>>>>
>>>>>>> sh:scopeClass <foaf:Person> and sh:scopeNode <foaf:Person> appear to
>>>>>>> identify the same focus node(s) in the data graph.
>>>>>>>
>>>>>>
>>>>>> sh:scopeNode means "the (class) node itself".
>>>>>> sh:scopeClass means "all SHACL instances of the class".
>>>>>>
>>>>>> So they do not identify the same focus nodes.
>>>>>>
>>>>>> Holger
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> ***shape1***
>>>>>>> ex:MyShape
>>>>>>>     a sh:Shape ;
>>>>>>>     sh:scopeNode foaf:Person ;
>>>>>>>     sh:inverseProperty [
>>>>>>>         sh:predicate rdf:type ;
>>>>>>>         sh:maxCount 2 ;
>>>>>>>     ] .
>>>>>>>
>>>>>>> ***shape2***
>>>>>>> ex:PersonShape
>>>>>>>     a sh:Shape ;
>>>>>>>     sh:scopeClass ex:Person .
>>>>>>>
>>>>>>> ***data graph***
>>>>>>>
>>>>>>> ex:Alice a ex:Person .
>>>>>>> ex:Bob a ex:Person .
>>>>>>> ex:NewYork a ex:Place .
>>>>>>>
>>>>>>> Where does the spec address the reason for this?
>>>>>>>
>>>>>>> kc
>>>>>>>
>>>>>>> On 6/7/16 10:09 PM, Holger Knublauch wrote:
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On 8/06/2016 14:57, Karen Coyle wrote:
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 6/7/16 7:38 PM, Holger Knublauch wrote:
>>>>>>>>>
>>>>>>>>>> Yes and SHACL should implement the same policy, because
>>>>>>>>>> sh:maxCount
>>>>>>>>>> also
>>>>>>>>>> only makes sense for predicate-based constraints and not node
>>>>>>>>>> constraints.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Does this then rule out a constraint like "n things of type x"? For
>>>>>>>>> example, if you want to limit the number of foaf:Person nodes?
>>>>>>>>>
>>>>>>>>
>>>>>>>> No. To express "A graph must have at most 2 instances of
>>>>>>>> foaf:Person"
>>>>>>>> you would write
>>>>>>>>
>>>>>>>> ex:MyShape
>>>>>>>>     a sh:Shape ;
>>>>>>>>     sh:scopeNode foaf:Person ;
>>>>>>>>     sh:inverseProperty [
>>>>>>>>         sh:predicate rdf:type ;
>>>>>>>>         sh:maxCount 2 ;
>>>>>>>>     ] .
>>>>>>>>
>>>>>>>> In other words "there must be at most 2 triples that have
>>>>>>>> foaf:Person
>>>>>>>> as
>>>>>>>> object and rdf:type as predicate".
>>>>>>>>
>>>>>>>> Peter's suggested use of sh:maxCount at node constraints would mean
>>>>>>>>
>>>>>>>> "Verify that the set of value nodes is not larger than two. Oh, and
>>>>>>>> regardless of the actual data, I already know that this set of value
>>>>>>>> nodes has size 1, because it always consists of the focus node only.
>>>>>>>> So
>>>>>>>> actually I only need to test whether the value of sh:maxCount > 0."
>>>>>>>>
>>>>>>>> which is a rather useless construct. You have just confirmed that
>>>>>>>> misusing sh:maxCount as node constraints will likely confuse users.
>>>>>>>>
>>>>>>>> Is this difference clearer now, or what else could I clarify?
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Holger
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>> --
>>>>> Karen Coyle
>>>>> kcoyle@kcoyle.net http://kcoyle.net
>>>>> m: 1-510-435-8234
>>>>> skype: kcoylenet/+1-510-984-3600
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>>
> --
> Karen Coyle
> kcoyle@kcoyle.net http://kcoyle.net
> m: 1-510-435-8234
> skype: kcoylenet/+1-510-984-3600
>
>


-- 
Dimitris Kontokostas
Department of Computer Science, University of Leipzig & DBpedia Association
Projects: http://dbpedia.org, http://rdfunit.aksw.org,
http://aligned-project.eu
Homepage: http://aksw.org/DimitrisKontokostas
Research Group: AKSW/KILT http://aksw.org/Groups/KILT

Received on Sunday, 12 June 2016 13:46:46 UTC