- From: Simon Steyskal <simon.steyskal@wu.ac.at>
- Date: Tue, 01 Sep 2015 07:49:02 +0200
- To: kcoyle@kcoyle.net
- Cc: public-data-shapes-wg@w3.org
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)
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:49:31 UTC