SWOOP - Helping to Debug Ontologies
Henry has discovered SWOOP, a small ontology editor from MindSwap. This reminds me to point out a very nice feature of SWOOP, one that Protege does not have out of the box.
SWOOP, through its integration with Pellet, is able to not only compute classifications but also able to tell you *why* your ontology is inconsistent. This, to me, is a huge step towards being able to use ontologies in "every day" problems.
The use case here is: You are collecting information from many many different sources. You have an ontology that defines your view of the world. It's possible that all the different information sources will present to you conflicting information. Your ontology defines what is consistent, so therefore it should be able to tell you when you have information that is *inconsistent*.
SWOOP does a pretty good job at giving you the feedback to find the source of the inconsistency. An example output is:
Inconsistent ontology Reason: Individual ErrorBoat has more than 1 values for property at
Location
violating the cardinality restriction
Axioms causing the problem:
1) (ErrorBoat decommissionedAt DryDock)
2) |_(DryDock ≠ SanDiego)
3) |_(ErrorBoat deployedTo SanDiego)
4) |_(ErrorBoat rdf:type Boat)
5) |_(Boat ⊆ (= 1 atLocation))
Now that's a simple problem, where an instance has two values for a property that is constrained to have only one.
What about when an individual belongs to two disjoint classes? This one is a bit more confusing if you don't have a background in DL, but if you stare long enough at it, you might see the real cause:
Inconsistent ontology Reason: Individual ErrorBoat is forced to belong to class
all(decommissionedAt, not(Location))
and its complement
Axioms causing the problem:
1) (ErrorBoat decommissionedAt DryDock)
2) |_(DryDock rdf:type Location)
3) |_(SanDiego rdf:type Location)
4) |_(ErrorBoat deployedTo SanDiego)
5) (Decommissioned ≡ (∃decommissionedAt . Location))
6) (Active ⊆ ¬ Decommissioned)
7) (Active ≡ (∃deployedTo . Location))
To explain this one better, I've declared that the class Active and the class Decommissioned are disjoint. And I've placed the instance ErrorBoat into both classes.
For this reason, I like SWOOP and Pellet. Though, Protege still has nicer workflows.
SWOOP, through its integration with Pellet, is able to not only compute classifications but also able to tell you *why* your ontology is inconsistent. This, to me, is a huge step towards being able to use ontologies in "every day" problems.
The use case here is: You are collecting information from many many different sources. You have an ontology that defines your view of the world. It's possible that all the different information sources will present to you conflicting information. Your ontology defines what is consistent, so therefore it should be able to tell you when you have information that is *inconsistent*.
SWOOP does a pretty good job at giving you the feedback to find the source of the inconsistency. An example output is:
Inconsistent ontology Reason: Individual ErrorBoat has more than 1 values for property at
Location
violating the cardinality restriction
Axioms causing the problem:
1) (ErrorBoat decommissionedAt DryDock)
2) |_(DryDock ≠ SanDiego)
3) |_(ErrorBoat deployedTo SanDiego)
4) |_(ErrorBoat rdf:type Boat)
5) |_(Boat ⊆ (= 1 atLocation))
Now that's a simple problem, where an instance has two values for a property that is constrained to have only one.
What about when an individual belongs to two disjoint classes? This one is a bit more confusing if you don't have a background in DL, but if you stare long enough at it, you might see the real cause:
Inconsistent ontology Reason: Individual ErrorBoat is forced to belong to class
all(decommissionedAt, not(Location))
and its complement
Axioms causing the problem:
1) (ErrorBoat decommissionedAt DryDock)
2) |_(DryDock rdf:type Location)
3) |_(SanDiego rdf:type Location)
4) |_(ErrorBoat deployedTo SanDiego)
5) (Decommissioned ≡ (∃decommissionedAt . Location))
6) (Active ⊆ ¬ Decommissioned)
7) (Active ≡ (∃deployedTo . Location))
To explain this one better, I've declared that the class Active and the class Decommissioned are disjoint. And I've placed the instance ErrorBoat into both classes.
For this reason, I like SWOOP and Pellet. Though, Protege still has nicer workflows.