I was discussing the geo: uris on tdwg-content. Had an idea.
One of the problems of RDF is that is does not do any sort of computing or calculation. This is quite deliberate. However, it could be done by means of annotations.
An annotation is a special kind of property in OWL. Unlike other properties, annotation properties can be applied to OWL artifacts themselves: predicates, axioms, classes. You use annotations to – for instance – add a description to your predicate to describe what it means.
However: annotation properties do not take part in OWL reasoning. This is very important: without it, OWL reasoning would become unsolvable.
One of the difficulties with the RDF representation of OWL is that “raw” RDF cannot tell the difference between an annotation property and some other kind of property. It has to assume that when you annotate a predicate, you are punning: attaching a property to a named individual with the same URI. That’s actually not the case.
I’m suggesting something along the lines of:
- We have a base property named math:multiply.
- We extend it to create a property foo:area, which applies to rectangles.
- We annotate this property, declaring somehow that its value shall be equal to a rectangle’s width times it’s height.
Now, most of the time – for most reasoners, nothing happens. But if you have a reasoner that supports math, then if a rectangle has a width and a height it will automagically infer the existence of a foo:area property from your vocabulary.
Obviously, you need standard operators – a whole “computed math” vocabulary. But it’s do-able and it will fit without breaking existing semweb artifacts.
Not just math, of course, but I was thinking that you’d define “polygon” to be a literal datatype, and have computed expressions like “overlaps”, “disjoint” and so on.
Note that annotations can be put on annotations. This allows you to construct – in RDF – expression trees. A “is within 100km of B” B if the polygon of A, expanded by 100km, overlaps the area of B.
What you need is a base vocabulary for creating expressions using annotations. I’m thinking about it on the back-burner.