It's not really clear what the problem is. You can add multiple domains and ranges to object properties, but the interpretation is the intersection. That means that you if say, for instance,
hasFather rdfs:domain Son
hasFather rdfs:domain Animal
whenever you have
X hasFather Y
you'll be able to infer
X rdf:type Son
X rdf:type Animal
which probably isn't what you want.
As I see it, you could do this:
- Don't declare any domain or range on hasFather. There's no need to do that. You can just declare the property, and then use it however you see fit.
If you want a bit more type inference available to you, then you could also add two subclass axioms:
Son SubClassOf (hasFather only Father)
Animal SubClassOf (hasFather only AnimalFather)
these axioms say that if something is a Son and it's related to something by the property hasFather, then that something is an instance of Father. Similiary, if something is an Animal and is related to something by the property hasFather, then that something is an instance of AnimalFather.