I have a class hierarchy like this:

Thing
  - ClassA
    -ClassC
    -ClassD
  - ClassB
    -ClassC
    -ClassE

Class C is a subclass of both, ClassA and ClassB while ClassD and ClassE are only subclasses of either ClassA or ClassB

Now I would like to specify a class which is equivalent to the Intersection of subclasses of ClassA and ClassB. The following doesn't work:

NamedClass a owl:Class
NamedClass owl:equivalentClass (ClassA and ClassB)

The reason is that this sort of rule would be used by the reasoner to classify individuals, i.e. is I had an individual Ind1 which is of type ClassA and ClassB, it would be classified to be also of type NamedClass. This is not (only) what I want. I want ClassC itself to be a subclass of NamedClass.

I know this is achievable using rules (e.g. SPIN) but can it be done without rules?

有帮助吗?

解决方案

Let's start with the initial hierarchy, including F, but before we've declared that F is equivalent to the intersection of A and B:

enter image description here

Then we add (A and B) as a class equivalent to F. Protégé is smart enough to render things that are equivalent or subclasses of intersections under each of the intersected classes, so we see F appear in two places here.

enter image description here

A reasoner can confirm the relation, too. Here I've turned on Pellet, entered F into the DL query, and asked for subclasses. Sure enough, C is a subclass of F:

enter image description here

Here's the ontology that you can copy and paste:

@prefix :      <http://stackoverflow.com/q/22221549/1281433/> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:ontology a owl:Ontology .

:A a owl:Class .
:B a owl:Class .
:C a owl:Class ; rdfs:subClassOf  :A , :B .
:D a owl:Class ; rdfs:subClassOf  :A .
:E a owl:Class ; rdfs:subClassOf  :B .
:F a owl:Class ;
     owl:equivalentClass [ a owl:Class ;
                           owl:intersectionOf  ( :A :B ) ] .

其他提示

Yes, you can define that a class is defined as intersection of two other classes using OWL. Check the OWL 2 Primer.

Hope I helped!

PS If you want to apply more advanced rules to your model, I would suggest using SWRL which is a w3c recommendation.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top