- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Sun, 07 Dec 2014 16:30:36 -0800
- To: Eric Prud'hommeaux <eric@w3.org>
- CC: Holger Knublauch <holger@topquadrant.com>, public-data-shapes-wg@w3.org
Summary: ShEx doesn't provide qualified cardinality restrictions
On 12/06/2014 01:28 AM, Eric Prud'hommeaux wrote:
> * Peter F. Patel-Schneider <pfpschneider@gmail.com> [2014-12-05 15:57-0800]
>> Even if shape constraints on the same property are supposed to be
>> unioned, I don't think that this provides qualified cardinality
>> constraints.
>>
>> A qualified cardinality constraint is something like
>>
>> HappyParent <= [2-4] child Professional |
>> [2-3] child (exists spouse)
>
> I wrote up this example below.
>
>> meaning that a happy parent either has between two and four children
>> who belong to the class Professional or has between two and three
>> children who have a spouse.
>>
>> This is different from having between two and four children and all
>> of their children belonging to Professional OR having between two
>> and three children and all of their children having a spouse.
>
> There are certainly multiple ways to interpret it;
Umm. What I provided *is* the way that qualified cardinality restrictions are
defined.
> we just need to
> find one which optimizes for some weighting of utility, generality
> and intuitiveness.
It is certainly possible to define other things, and they may perhaps be of
more utility or intuitiveness, but they wouldn't necessarily cover qualified
cardinality restrictions.
> Let's start by assuming we want general algebraics
> like ((N | (G & F)) & M)
>
> [[
> <UserShape> { # A User has
> (foaf:name xsd:string # either a foaf:name
> | foaf:givenName xsd:string+, # or 1+ givenNames
> foaf:familyName xsd:string), # and a family name
> foaf:mbox IRI # and an mbox.
> }
> ]]
>
> [[
> PREFIX rs:<http://open-services.net/ns/core#>
> PREFIX se:<http://www.w3.org/2013/ShEx/Definition#>
>
> <UserShape> a rs:ResourceShape ; # A User has
> se:choice [
> rs:property [ # either a foaf:name
> rs:name "name" ;
> rs:propertyDefinition foaf:name ;
> rs:valueType xsd:string ;
> rs:occurs rs:Exactly-one ;
> ] ;
> se:ruleGroup [
> rs:property [ # or 1+ givenNames
> rs:name "givenName" ;
> rs:propertyDefinition foaf:givenName ;
> rs:valueType xsd:string ;
> rs:occurs rs:One-or-many ;
> ] ;
> rs:property [ # and a family name
> rs:name "familyName" ;
> rs:propertyDefinition foaf:familyName ;
> rs:valueType xsd:string ;
> rs:occurs rs:Exactly-one ;
> ] ;
> ] ;
> ] ;
> rs:property [ # and an mbox.
> rs:name "mbox" ;
> rs:propertyDefinition foaf:mbox ;
> rs:valueType rs:Resource ;
> rs:occurs rs:Exactly-one ;
> ] .
> ]]
>
> If we have that, then also interpreting
>
> ex:child @<IsProfessional>{2,4},
> ex:child @<HasSpouse>{2,3}
>
> as a disjunction is redundant against
>
> ex:child @<IsProfessional>{2,4} |
> ex:child @<HasSpouse>{2,3}
Well, sure, if there are general algebraics, then uniformly interpreting
top-level sequences as conjunction is the way to go.
> . So what do we do with two rules with overlapping predicates? If we
> want simplicity, we can say "don't do that".
I don't think that that would gain simplicity at all. If you allow the use of
named shapes, then forbidding overlapping predicates would become intuitive.
> If we want to meet more
> use cases, we can say that they are QCRs.
>
>
> <http://w3.org/brief/NDIz> models your happy parent example:
>
> <HappyParent> {
> ex:child { a (ex:Professional) }{2,4}
> | ex:child { ex:spouse .+ }{2,3}
> }
Does it? My understanding is that the meaning this would be either between 2
and 4 children and all children are professionals OR between two and 3
children and all children have a spouse. This is not qualified cardinality
restrictions.
>
> In the validation messages (green-blue box), we see that <Bif> isn't a
> happy parent 'cause he has too many kids.
Sure, <Bob> ex:child [ a ex:Professional ], [ a ex:Professional ], [ a
ex:Student ].
also satisfies the qualified cardinality restriction, but not the ShEx shape.
>
> Note also that the '|' in ShExC (se:choice in the RDF represention) is
> *exclusive* like in XML Schema (or DTDs). That's another design choice
> or another email.
>
>
>> peter
>>
>>
peter
>> On 12/05/2014 01:53 PM, Eric Prud'hommeaux wrote:
>>> * Peter F. Patel-Schneider <pfpschneider@gmail.com> [2014-12-05 10:18-0800]
>>>> Do ShEx or ShExC or Shape Expressions actually have qualified cardinalities?
>>>>
>>>> http://www.w3.org/Submission/shex-defn/ appears to indicate that a
>>>> shape expression of the form <p1> @<foo> ? only matches when there
>>>> are zero or one p1's *and* all of the p1's belong to foo.
>>>
>>> When drafting the Submission, the intent was to respect only
>>> unqualified cardinalities (though arbitrary cardinalities, not just 0
>>> or 1): <http://www.w3.org/Submission/shex-defn/#x1-9002x1>. It wasn't
>>> until the F2F that I got the idea that intent for Resource Shapes was
>>> that multiple rules about a particular predicate to be unioned.
>>>
>>>
>>>> peter
>>>>
>>>>
>>>> On 12/05/2014 07:39 AM, Eric Prud'hommeaux wrote:
>>>>> * Holger Knublauch <holger@topquadrant.com> [2014-12-05 08:29+1000]
>>>>>> On 12/5/2014 5:08, Arthur Ryman wrote:
>>>>>>> All values must satisfy the shape pointed to by oslc:valueShape.
>>>>>>> OSLC has no way to specify that some values must satisfy the
>>>>>>> shape.
>>>>>>
>>>>>> Ok thanks Arthur for clarifying this. So Resource Shapes doesn't
>>>>>> seem to have a notion of Qualified Cardinalities, while ShEx seems
>>>>>> to have that (correct me if I am wrong, Eric).
>>>>>
>>>>> Yes, hmm, I guess. The story is this: I wasn't sure what the Resource
>>>>> Shapes semantics were so I documented my best guess in the ShEx
>>>>> Submission. I conservatively assumed that for any given shape, only
>>>>> one oslc:Property could have a given oscl:propertyDefinition. The
>>>>> Lille folks called this "single occurance" (Iovka, correct me if I'm
>>>>> wrong). The semantics for ShExC were intended to expand Resource
>>>>> Shapes in a few ways, but I'd intended to respect "single occurance".
>>>>>
>>>>> During the F2F, I asked what happens if more than one oslc:Property
>>>>> has the same oslc:propertyDefinition and I recall Arthur saying that
>>>>> all of the definitions would be permitted. I was kind of psyched
>>>>> because it allowed me to meet a bunch of use cases around generic
>>>>> containers. In OWL, these end up looking like QCRs which on their own
>>>>> don't really help validation because nothing is invalid.
>>>>>
>>>>> In a closed world, one says "if I haven't explicitly allowed it, it's
>>>>> not allowed." This makes QCRs useful again because something like
>>>>>
>>>>> ShExC:
>>>>> <X> { <p1> @<Foo>? , <p1> @<Bar>* }
>>>>>
>>>>> Resource Shapes:
>>>>> <X> a rs:ResourceShape ;
>>>>> rs:property [
>>>>> rs:name "<p1>" ;
>>>>> rs:propertyDefinition <p1> ;
>>>>> rs:valueShape <Foo> ;
>>>>> rs:occurs rs:Zero-or-one ;
>>>>> ] ;
>>>>> rs:property [
>>>>> rs:name "<p1>" ;
>>>>> rs:propertyDefinition <p1> ; # <-- same property
>>>>> rs:valueShape <Bar> ;
>>>>> rs:occurs rs:Zero-or-many ;
>>>>> ] .
>>>>>
>>>>> can mean "any <p1> that's neither a <Foo> nor a <Bar> is invalid."
>>>>> I had assumed from what Arthur said during the F2F that this was his
>>>>> intention, but we may have misunderstood each other.
>>>>>
>>>>> This introduces complexity but it opens up a lot of use cases where
>>>>> folks have used generic properties or generic containers. It might
>>>>> be worth the work.
>>>>>
>>>>>
>>>>>> To create a solution that covers all use cases I believe it would be
>>>>>> helpful to (explicitly) distinguish between
>>>>>>
>>>>>> a) structural declarations "which properties are relevant for a
>>>>>> resource/class"
>>>>>> b) arbitrary constraints "which additional conditions must be met"
>>>>>>
>>>>>> The information from a) would be easy to interpret to drive user
>>>>>> interfaces, e.g. it would contain the general cardinality and the
>>>>>> valueType so that suitable input widgets can be selected.
>>>>>>
>>>>>> The information from b) would be tested in the background, e.g. to
>>>>>> validate an input form before it gets submitted.
>>>>>>
>>>>>> With this categorization, oslc:valueType would be a single value in
>>>>>> category a) while there can be any number of valueShapes in category
>>>>>> b).
>>>>>>
>>>>>> In my current prototyping, I have split spin:constraint into two
>>>>>> different properties (:property and :constraint) to distinguish
>>>>>> between those two categories. This also means that there would be
>>>>>> something like
>>>>>
>>>>> (Holger's later text from
>>>>> <http://www.w3.org/mid/54817076.2060803@topquadrant.com> is prefixed
>>>>> with '+'s inline)
>>>>>
>>>>>> ex:Person
>>>>>> :property [
>>>>>> :predicate ex:parent ;
>>>>>> :valueType ex:Person ;
>>>>>> :minCount 2 ;
>>>>>> :maxCount 2 ;
>>>>>> ] ;
>>>>>> :constraint [
>>>>>> a :ShapeConstraint ;
>>>>> + :predicate ex:parent ;
>>>>>> :shape ex:MalePerson ;
>>>>>> :minCount 1 ;
>>>>>> :maxCount 1 ;
>>>>>> ] ;
>>>>>> :constraint [
>>>>>> a :ShapeConstraint ;
>>>>> + :predicate ex:parent ;
>>>>>> :shape ex:FemalePerson ;
>>>>>> :minCount 1 ;
>>>>>> :maxCount 1 ;
>>>>>> ] ;
>>>>>>
>>>>>> which means that every Person must have two (biological) parents,
>>>>>> one male and one female. This distinction between the "global"
>>>>>> cardinality of 2 from the local qualified cardinalities would allow
>>>>>> us to represent QCRs in a relatively clean way.
>>>>>>
>>>>>> Eric, what do you think?
>>>>>
>>>>> That's effectively what I've implemented, with the added constraint
>>>>> that any ex:parent that's neither an ex:MalePerson nor ex:FemalePerson
>>>>> is invalid. <http://w3.org/brief/NDIy> If you change one of the
>>>>> genders, it'll whine. If you plan to do much editing, unclick ☑
>>>>> colorized (if you don't want to play "where's my cursor?").
>>>>>
>>>>>
>>>>>> Holger
>>>>>>
>>>>>>
>>>>>
>>>
>
Received on Monday, 8 December 2014 00:31:08 UTC