W3C home > Mailing lists > Public > public-data-shapes-wg@w3.org > January 2015

Re: Added Requirement: Static Constraints

From: Holger Knublauch <holger@topquadrant.com>
Date: Fri, 16 Jan 2015 08:45:17 +1000
Message-ID: <54B842FD.40805@topquadrant.com>
To: kcoyle@kcoyle.net, "public-data-shapes-wg@w3.org" <public-data-shapes-wg@w3.org>
On 1/16/2015 1:45, Karen Coyle wrote:
> Thanks, Holger. As usual, I need to do this "by example" because it's 
> quite likely that my vocabulary differs from that of others here.
>
> Use cases: I have data that uses dct:title in various places, and I 
> want to say that wherever it is used it can only be used once for each 
> subject in my data. Here's some data:

The following static constraint could express that scenario:

ex:AtMostOneTitleConstraint
     a :StaticConstraint ;
     :message "For a given subject, dct:title can only be used once." ;
     :predicate dct:title ;
     :sparql """
             # Find all subjects that have two distinct values of dct:title
             SELECT (?subject AS ?root)
             WHERE {
                 ?subject dct:title ?title1 .
                 ?subject dct:title ?title2 .
                 FILTER (?title1 != ?title2) .
             }
         """ ;
.

>
> 1)
> subjectA dce:creator "Somebody" .
> subjectA dct:title "Some title" .
> subjectA bf:subject http://.... .
> subjectB dce:creator "Someone else" .
> subjectB dct:title "Another title" .
>
> 2)
> subjectA dce:creator "Somebody" .
> subjectA dct:title "Some title" .
> subjectA bf:subject ex:subject1 .
> subjectB dce:creator "Someone else" .
> subjectB dct:title "Another title" .
> subject1 dct:title "A related book" .
>
> That's a pretty stupid example, and the data is more sophisticated 
> than that, of course. My questions are:
>
> a) because this data does not use rdf:type (unless inferred, and let's 
> say it isn't), does subject "s" constitute a node/graph/shape?

In the absence of an rdf:type triple, we indeed need to declare this as 
a static constraint that is not attached to any class but executed for 
the whole graph.

> b) substitute "skos:prefLabel" here and a rule that skos:prefLabel can 
> occur only once per each "X" (X because I dont know what to call it) - 
> is that the same case?

I think that's similar, only that we could probably associate that 
constraint with skos:Concept, because that is where skos:prefLabel is 
supposed to be used. However, skos:prefLabel should have another 
constraint that it should only have one value per language tag, which is 
a variation of the query above. Here is the corresponding SPIN query

CONSTRUCT {
     _:b0 a spin:ConstraintViolation .
     _:b0 rdfs:label ?message .
     _:b0 spin:violationRoot ?this .
     _:b0 spin:violationPath skos:prefLabel .
}
WHERE {
     ?this skos:prefLabel ?label1 .
     ?this skos:prefLabel ?label2 .
     FILTER ((lang(?label1) = lang(?label2)) && (?label1 != ?label2)) .
     BIND (CONCAT("Constraint S14: a resource has no more than one value 
of skos:prefLabel per language tag (@", lang(?label1), ").") AS ?message) .
}

> c) is this really a new use case, or a variation on existing ones?

I believe the Requirements cover this scenario. Whether you want to 
write it up as a new User Story is up to you.

HTH
Holger
Received on Thursday, 15 January 2015 22:48:42 UTC

This archive was generated by hypermail 2.3.1 : Thursday, 15 January 2015 22:48:44 UTC