- From: Simon Steyskal <simon.steyskal@wu.ac.at>
- Date: Tue, 01 Sep 2015 07:58:44 +0200
- To: Holger Knublauch <holger@topquadrant.com>
- Cc: public-data-shapes-wg@w3.org
> Minor tweak here: to avoid having to misuse ?predicate and ?object you
> can simply return ?minCount and ?maxCount as SELECT variables:
ah sure, forgot to refactor the final template ;)
> Maybe we should have a general policy to always make all template
> argument values visible in the sh:messages?
+1 from my side
cheers,
simon
---
DDipl.-Ing. Simon Steyskal
Institute for Information Business, WU Vienna
www: http://www.steyskal.info/ twitter: @simonsteys
Am 2015-09-01 07:55, schrieb Holger Knublauch:
> On 9/1/2015 15:49, Simon Steyskal wrote:
>> Hi!
>>
>> Just as a small proof of concept, following ConstraintTemplate (and
>> helper function) is able to check whether X instances of type
>> ex:person exist (tested with TopBraid 5.0).
>>
>> So such constraints are in general expressible.. If we want to
>> natively support those by respective ConstraintTemplates is another
>> question though ;)
>>
>> # instance data & shape
>> # ----------------------
>> ex:Person rdf:type rdfs:Class .
>> ex:Enrico rdf:type ex:Person . ex:Diego rdf:type ex:Person .
>> ex:Alessandro rdf:type ex:Person . ex:Sergio rdf:type ex:Person .
>> ex:John rdf:type ex:Person . ex:Maurizio rdf:type ex:Person .
>>
>> ex:MyShape
>> a sh:Shape ;
>> sh:scope [
>> a sh:PropertyScope ;
>> sh:predicate rdf:type ;
>> ] ;
>> sh:constraint [
>> a ex:ClassMembershipCountTemplateConstraint ;
>> ex:type ex:Person ;
>> sh:minCount 7 ;
>> sh:maxCount 7 ;
>> ] .
>>
>>
>> # constraint template & helper function
>> # ---------------------------------------
>> ex:ClassMembershipCountConstraintTemplate
>> a sh:ConstraintTemplate ;
>> rdfs:subClassOf sh:TemplateConstraint ;
>> rdfs:label "Example Template" ;
>> rdfs:comment "Enforces a constraint on the cardinality of the
>> number of occurrences of instances of a given type using minCount and
>> maxCount. By default, given graph may have 0 to unlimited number of
>> instances of a given type" ;
>> sh:argument [
>> sh:predicate ex:type ;
>> sh:valueClass rdfs:Resource ;
>> ] ;
>> sh:argument [
>> sh:predicate sh:minCount ;
>> sh:defaultValue 0 ;
>> sh:optional true ;
>> sh:datatype xsd:integer ;
>> rdfs:label "min count" ;
>> rdfs:comment "The minimum number of instances of defined type
>> required. Defaults to 0." ;
>> ] ;
>> sh:argument [
>> sh:predicate sh:maxCount ;
>> sh:optional true ;
>> sh:datatype xsd:integer ;
>> rdfs:label "max count" ;
>> rdfs:comment "The maximum number of instances of defined type
>> required. Defaults to unlimited." ;
>> ] ;
>> sh:message "Required value count [{?predicate}..{?object}] but
>> found {?count}" ;
>> sh:sparql """
>> SELECT ?this (?type AS ?subject) ?count (?minCount AS
>> ?predicate) (?maxCount AS ?object)
>
> Minor tweak here: to avoid having to misuse ?predicate and ?object you
> can simply return ?minCount and ?maxCount as SELECT variables:
>
> SELECT ?this (?type AS ?subject) (rdf:type AS ?predicate) ?minCount
> ?maxCount ?count
>
> and then use them as
>
> sh:message "Required value count [{?minCount}..{?maxCount}] but
> found {?count}" ;
>
> Maybe we should have a general policy to always make all template
> argument values visible in the sh:messages?
>
> Cheers,
> Holger
>
>
>> WHERE {
>> BIND (sh:instanceCount(?type) AS ?count) .
>> FILTER ((?count < ?minCount) || (bound(?maxCount) &&
>> (?count > ?maxCount))) .
>> }
>> """ ;
>> .
>>
>> sh:instanceCount
>> a sh:Function ;
>> rdfs:label "instance count" ;
>> rdfs:comment "Gets the number of instances of a given type
>> (?arg1). The result is the number of matches of (?s, ?a, ?arg1)." ;
>> sh:argument [
>> sh:predicate sh:arg1 ;
>> sh:valueClass rdfs:Resource ;
>> rdfs:comment "The subject resource." ;
>> ] ;
>> sh:returnType xsd:integer ;
>> sh:sparql """
>> SELECT ((COUNT(?s)) AS ?result)
>> WHERE {
>> ?s a ?arg1 .
>> }
>> """ ;
>> .
>>
>> cheers,
>> simon
>>
>> ---
>> DDipl.-Ing. Simon Steyskal
>> Institute for Information Business, WU Vienna
>>
>> www: http://www.steyskal.info/ twitter: @simonsteys
>>
>> Am 2015-09-01 05:04, schrieb Karen Coyle:
>>> On 8/31/15 5:15 PM, Arnaud Le Hors wrote:
>>>> I have to say that I'm not sure I completely understand either.
>>>> Karen,
>>>> are you saying that for every X rdf:type ex:CulturalObject there can
>>>> be
>>>> one or more X rdf:type ex:Person ?
>>>
>>> Yes, that's one case.
>>>
>>> Does that mean you really want to
>>>> enforce that for every X rdf:type Person there must be one X
>>>> rdf:type
>>>> ex:CulturalObject ?
>>>
>>> Yes. And in that sense it's a simple question of cardinality
>>> definitions, but it operates on the class membership rather than the
>>> property presence (which seems to be what SHACL addresses).
>>>
>>> So starting with something more specific, this is what was sent to
>>> me:
>>>
>>> <!--Each graph must have exactly one instance of rdf:type
>>> edm:ProvidedCHO and one
>>> instance of rdf:type ore:Aggregation (R-225)-->
>>>
>>> Which is essentially:
>>>
>>> each focus node must have exactly one instance of rdf:type A and
>>> exactly one instance of rdf:type B.
>>>
>>> Then there will be cases with different cardinality patterns, but
>>> defined as class instances, not properties.
>>>
>>> We are gathering some more examples, but I first wanted to make sure
>>> that this is even relevant to SHACL before we do any work. Plus, I
>>> wanted to start the question before the f2f, in case it is relevant.
>>> If this is seen as out of scope or a quirk of ours, we'll do the
>>> analysis to see if we can re-define our validation requirements in
>>> terms of properties. At least in some cases I believe the answer to
>>> that will be yes, but in other cases it may be difficult or require
>>> some re-engineering of the vocabularies, like creating
>>> super-properties where the properties that can be used are awkwardly
>>> numerous.
>>>
>>> So I guess the underlying question of mine is: can validation
>>> conditions operate on instances of classes, in addition to validation
>>> that is defined in terms of properties?
>>>
>>> kc
>>
Received on Tuesday, 1 September 2015 05:59:11 UTC