- From: Karen Coyle <kcoyle@kcoyle.net>
- Date: Sun, 12 Jun 2016 03:13:05 -0700
- To: public-data-shapes-wg@w3.org
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
Received on Sunday, 12 June 2016 10:13:31 UTC