Currently multiple mappers can exist with the same predicate URI for the same class differing only by the rdfs:range value.
ie. mapper --> rdf:Property with a subset of rdfs:range.
eg.
Article {
@Predicate(uri="a:annotatedBy")
Set<Comment> comments;
@Predicate(uri="a:annotatedBy")
Set<Correction> corrections;
}
So the mapper selection is based on the predicate-uri and the rdf:type of its range.
However, this is a bit half done currently in the sense, only object-property types are considered differently. ie. different mappers with same predicate uri cannot be created based solely on the sub-class of rdfs:Literal as its rdfs:range. Not sure what the use case for such a situation is. Nevertheless it is a corner case that we don't handle now.
There are also other differentiators that we haven't considered in the predicate-uri to mapper selection. eg. we could have mappers with the same predicate-uri but for statements that appear in a different graph. Or we could have a differentiation based on the collection type. (A bit far fetched, but still a possibility).