Search code examples
instanceclassificationowlontologyreasoning

Closure axiom for instances so that reasoner can correctly classify instances in ontology


I am a geographer and a new comer in the field of ontology trying to make sense out of these two. Therefore, I have created a simple ontology, as follows:

Thing
    Feature
        Lane
        Segment(equivalent to Arc)
    Geometry
        Arc (equivalent to Segment)
        Node
            Dangling_Node
            Intersection_node

you can find the .owl file here instantiated with a very simple spatial road dataset (fig1). enter image description here

the ontology is consistent without and with instances, but when I run the reasoner, the Dangling_node instances (nodes that are connected to one link or arc) are not correctly assigned to the relevant subclass and only assigned to the Node superclass. The intersection_node (the node which is connected to more than one link) instances are correctly assigned.

I guess according to the open world assumption, the reasoner considers that the node might be 'is_extent_of' another Arc but just not mentioned here.

Do I need, or how could I have, a closure axiom for the instance? Which part of my ontology implementation is wrong?

Edited:

Equivalent to:
    Node and (is_extent_of max 1 Arc)
Subclass of (Anonymous Ancester):
    (is_extent_of only Arc) and (is_extent_of min 1 Arc)

the General Class Axiom for the Dangling_node is as follows:

Node and (is_extent_of max 1 Arc) SubClassOf Dangling_node

Solution

  • the Dangling_node instances (nodes that are connected to one link or arc) are not correctly assigned

    You'd need to assert what's true, and then what's not true. For instance, since Node_005 is connected to just Arc_004, you'd need to say something like this:

    (1)        connectedTo(Node_005,Arc_004)

    and

    (2)        {Node_005} ⊑ ∀connectedTo.{Arc_004}

    (1) says that the node is actually connected to the arc. (2) says that everything that the node is connected to is an element of the class {Arc_004}, that is, that the only things it's connected to is that arc. Then, you'd an axiom that says that if something is connected to at most one arc, then it's a dangling node:

    (3)        (≤ connectedTo.1) ⊑ DanglingNode

    (3) is a general class axiom. You can enter those in Protege, but the UI doesn't make it obvious. See this answer for more about how to create those.

    Here's what this looks like in Protege (except that instead of the general class axiom (3), I just made Dangling equivalent to connectedTo exactly 1):

    Class definition for Dangling

    class definition for Dangling

    Axioms about the Node

    individual axioms for Node

    Result of Reasoner (Node is Dangling)

    Dangling inferred by reasoner