- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Sun, 12 Jun 2016 12:48:15 -0700
- To: Irene Polikoff <irene@topquadrant.com>, kcoyle@kcoyle.net
- Cc: Dimitris Kontokostas <kontokostas@informatik.uni-leipzig.de>, public-data-shapes-wg <public-data-shapes-wg@w3.org>
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