Re: scopeNode and scopeClass

My proposal to have constraint components all work on all of node constraints,
property constraints, and inverse property constraints does not help here.
sh:maxCount on a node constraint is rather silly, as there is only one value
node in a node constraint.

My proposal from a little while ago to refactor the SHACL syntax does allow
for shapes that limit the cardinality of classes, however.

peter


On 06/12/2016 10:01 AM, Irene Polikoff wrote:
> maxCount works with a specified predicate. It counts a number of distinct triples with the focus node as a subject and predicate provided in the constraint. This is its semantics.
> 
> maxCount can be used with the class scope, but this wouldn't give the desired effect because if we use RDF:type as a predicate (and what else would one use?), it would count all statements that have focus nodes as subjects and type as a predicate, irrespective of what the object is. And since a resource can be of multiple types, it is a problem.
> 
> Peter's proposals make no difference here, as far as I can tell.
> 
> Holger's solution is entirely consistent, but as Dmitris mentioned it doesn't do transitive closure of subclasses.
> 
> A constraint that would do this, would have a different semantics from maxCount and, if we wanted to include it in the core, it should have a different name.
> 
> 
> 
> Sent from my iPhone
> 
>> On Jun 12, 2016, at 12:30 PM, Karen Coyle <kcoyle@kcoyle.net> wrote:
>>
>> Dimitris, thanks, but I wasn't suggesting to use node scope or node constraint. The example with node constraint is what Holger supplied. My use case is related to classes. classScope is defined as: "A class scope for class $scopeClass is defined as the set of all SHACL instances of $scopeClass in the data graph." Key here is that it is *all SHACL instances of $scopeClass*. However, the current spec does not allow one to use minCount or maxCount with scopeClass. That is what I was questioning. With Peter's proposal of having all constraints be usable with all scope types, I believe that one should be able to use counts with classes in scope. In any case, I think that the use case "n instances of classA" is a legitimate use case, and should logically be coded as a classScope since a user will think of it as relating to a class.
>>
>> Honestly, I think the spec is getting more obscure in its meaning, or maybe it is just that the more I read it the less sense it makes.
>>
>> kc
>>
>>> On 6/12/16 6:45 AM, Dimitris Kontokostas wrote:
>>> 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
>>> <mailto: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
>>>                <mailto: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 <mailto:kcoyle@kcoyle.net>
>>>                    http://kcoyle.net
>>>                    m: 1-510-435-8234
>>>                    skype: kcoylenet/+1-510-984-3600 <tel:%2B1-510-984-3600>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>    --
>>>    Karen Coyle
>>>    kcoyle@kcoyle.net <mailto:kcoyle@kcoyle.net> http://kcoyle.net
>>>    m: 1-510-435-8234
>>>    skype: kcoylenet/+1-510-984-3600 <tel:%2B1-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
>>>
>>
>> -- 
>> Karen Coyle
>> kcoyle@kcoyle.net http://kcoyle.net
>> m: 1-510-435-8234
>> skype: kcoylenet/+1-510-984-3600
>>
> 

Received on Sunday, 12 June 2016 19:48:45 UTC