- From: Holger Knublauch <holger@topquadrant.com>
- Date: Fri, 23 Jan 2015 19:35:02 +1000
- To: RDF Data Shapes Working Group <public-data-shapes-wg@w3.org>
- Message-ID: <54C215C6.1040905@topquadrant.com>
On 1/23/15, 7:03 PM, Dimitris Kontokostas wrote:
> First of all, great work initiating this Holger!!!
>
> Maybe I miss something in the semantics of the class declarations but
> I would suggest a simplification of the constraint definitions. Examples:
>
> # class example
>
> ex:constraintA
> a ldom:ClassConstraint ;
> ldom:class ex:ClassA, ex:ClassB, ex:ClassC ; # (oslc:describes)
> ldom:sparql """ ..?this ... """ ;
> ldom:property [
> ldom:predicate ex:propA ;
> ldom:minCount 1 ;
> ] ;
>
> in this case, all classes (A,B & C) have a min cardinality 1
> restriction on ex:propA which is not possible if we subclass the
> constraint to a single class.
Hi Dimitris,
to me this looks like the wrong direction. It is much more natural to write
ex:ClassA
ldom:property [
...
]
Sharing the same property across multiple classes is also not a scenario
that I have come across yet. And why the extra burden of creating a URI
for the constraint - I guess most people will be perfectly happy with
blank nodes. Likewise, why should they have to explicitly declare the
type ldom:ClassConstraint, if it is implicit from the context.
> We also decouple the schema declaration with the constraint
> declaration (*)
I don't think this decoupling is often desirable. When someone defines a
class, then of course the properties should be defined together with it
(just like owl:Restrictions did). What else would a class definition
good for?
In case someone really has to define shapes independently from classes,
then we can easily add a property such as the inverse of the ldom:class
that you have above, e.g. ldom:shape as in
ex:ClassA
ldom:shape ex:ShapeB ;
This would offer the same flexibility but have it in a more natural
direction to cover the most common use cases.
>
> # global constraint example, the rdfs:Resource / owl:Thing declaration
> is redundant
>
> ex:constraintB
> a ldom:GlobalConstraint ;
> ldom:sparql """ ... """ ;
>
> # ShExC / RS shapes in a similar way these are currently defined
> ex:constraintC
> a ldom:ShapeConstraint ;
> ldom:sparql """ ... """ ;
> ldom:property [
> ldom:predicate ex:propA ;
> ldom:minCount 1 ;
> ] ;
>
> For the ShapeConstraints we can define how validation can performed
> e.g. starting from a node or inferring the types of the nodes based on
> the shape definition and then validating in a similar way to the
> ClassConstraint.
> Would something like this solve the class/shape problem?
Why would the solution that I proposed not work?
Thanks,
Holger
>
>
> (*) Another reason for not defining constraints as classes is that
> automated Agents try to profile datasets for classes / properties used
> which, might confuse them and give false statistics.
>
> Best,
> Dimtiris
>
>
> On Fri, Jan 23, 2015 at 5:57 AM, Holger Knublauch
> <holger@topquadrant.com <mailto:holger@topquadrant.com>> wrote:
>
> May I suggest we try to resolve the long-standing issue of Shapes
> versus Classes in the specific context of LDOM. Maybe we can make
> progress if we have a specific metamodel in front of us.
>
> In the current draft, class definitions are containers of
> constraints, i.e.
>
> rdfs:Class
> a rdfs:Class ;
> rdfs:subClassOf rdfs:Resource ;
> ldom:property [
> ldom:predicate ldom:constraint ;
> ldom:valueType ldom:Constraint ;
> ] ;
> ldom:property [
> ldom:predicate ldom:property ;
> ldom:valueType ldom:PropertyConstraint ;
> ] ;
>
> which means that you can define a class such as
>
> ex:Rectangle
> ldom:property [
> ldom:predicate ex:height ;
> ...
> ] ...
>
> This could (easily) be generalized by moving the properties into a
> new a class
>
> ldom:Shape
> a rdfs:Class ;
> rdfs:subClassOf rdfs:Resource ;
> ldom:property [
> ldom:predicate ldom:constraint ;
> ldom:valueType ldom:Constraint ;
> ] ;
> ldom:property [
> ldom:predicate ldom:property ;
> ldom:valueType ldom:PropertyConstraint ;
> ] ;
>
> which serves as superclass of rdfs:Class
>
> rdfs:Class
> a rdfs:Class ;
> rdfs:subClassOf ldom:Shape ;
>
> This would mean that users could define stand-alone shapes
>
> ex:MyShape
> a ldom:Shape ;
> ldom:property [
> ...
> ] ...
>
> And this shape could be reused such as in
>
> ex:MyClass
> a rdfs:Class ;
> ldom:constraint [
> a ldom:ShapeConstraint ;
> ldom:all ex:MyShape ;
> ] ...
>
> or as an entry point to the validation:
>
> FILTER ldom:violatesConstraints(?resource, ex:MyShape)
>
> (maybe renaming the function above to ldom:hasShape).
>
> Since rdfs:Class is a subclass of ldom:Shape, class definitions
> become special kinds of shape definitions. The main differences
> between classes and shapes would be:
>
> - Classes can be instantiated, i.e. you can have ex:MyRectangle a
> ex:Rectangle
> - Class-based constraints get inherited (Shapes cannot have
> rdfs:subClassOf)
>
> I don't see practical problems with such a design, and in fact it
> may be a cleaner separation of concerns. The reason why these two
> concepts are currently merged into one is that the differences are
> fairly small, and people could simply define an anonymous (even
> typeless) class as a collection of constraints, as in Example 9
>
> http://spinrdf.org/ldomprimer.html#template-constraints
>
> Thoughts?
>
> Cheers,
> Holger
>
>
>
>
>
> --
> Dimitris Kontokostas
> Department of Computer Science, University of Leipzig
> Research Group: http://aksw.org
> Homepage:http://aksw.org/DimitrisKontokostas
Received on Friday, 23 January 2015 09:35:35 UTC