Search code examples
rdfowlontologyprotege

Issues importing an ontology into Protege


I have some severe issues importing the "Rhizomik" MPEG7 Ontology in all common ontology Editors. Primarily I tend to work with Protege. Import allways leads to several 100 errors. I fixed a few of them. One of the remaining seems to be connected to the following class:

<owl:Class rdf:about="&mpeg7;SpatioTemporalLocatorType">
    <rdfs:subClassOf>
        <owl:Class>
            <owl:intersectionOf rdf:parseType="Collection">
                <owl:Restriction>
                    <owl:onProperty rdf:resource="&mpeg7;CoordRef"/>
                    <owl:allValuesFrom>
                        <owl:Class>
                            <rdfs:subClassOf>
                                <owl:Restriction>
                                    <owl:onProperty rdf:resource="&mpeg7;ref"/>
                                    <owl:allValuesFrom rdf:resource="&xsd;string"/>
                                </owl:Restriction>
                            </rdfs:subClassOf>
                            <rdfs:subClassOf>
                                <owl:Restriction>
                                    <owl:onProperty rdf:resource="&mpeg7;ref"/>
                                    <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
                                </owl:Restriction>
                            </rdfs:subClassOf>
                            <rdfs:subClassOf>
                                <owl:Restriction>
                                    <owl:onProperty rdf:resource="&mpeg7;spatialRef"/>
                                    <owl:allValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema&mpeg7;boolean"/>
                                </owl:Restriction>
                            </rdfs:subClassOf>
                            <rdfs:subClassOf>
                                <owl:Restriction>
                                    <owl:onProperty rdf:resource="&mpeg7;spatialRef"/>
                                    <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
                                </owl:Restriction>
                            </rdfs:subClassOf>
                        </owl:Class>
                    </owl:allValuesFrom>
                </owl:Restriction>
                <owl:Class>
                    <owl:unionOf rdf:parseType="Collection">
                        <owl:Restriction>
                            <owl:onProperty rdf:resource="&mpeg7;FigureTrajectory"/>
                            <owl:allValuesFrom rdf:resource="&mpeg7;FigureTrajectoryType"/>
                        </owl:Restriction>
                        <owl:Restriction>
                            <owl:onProperty rdf:resource="&mpeg7;ParameterTrajectory"/>
                            <owl:allValuesFrom rdf:resource="&mpeg7;ParameterTrajectoryType"/>
                        </owl:Restriction>
                        <owl:Restriction>
                            <owl:onProperty rdf:resource="&mpeg7;MediaTime"/>
                            <owl:allValuesFrom rdf:resource="&mpeg7;MediaTimeType"/>
                        </owl:Restriction>
                    </owl:unionOf>
                </owl:Class>
            </owl:intersectionOf>
        </owl:Class>
    </rdfs:subClassOf>
</owl:Class>

Is someone in the position to check this class for any logical error?

Kind regards, Patrick


Solution

  • The problem is in the construction of the axioms. subClassOf axioms appear embedded in class usage, but the rdfs:subClassOf token is not allowed in those positions (see https://www.w3.org/TR/owl2-mapping-to-rdf/ for the recognised mappings).

    For example, the Error1 URL refers to this axiom:

    ObjectPropertyRange(<#Mpeg7> <http://org.semanticweb.owlapi/error#Error1>)
    

    The corresponding XML is:

    <owl:ObjectProperty rdf:ID="Mpeg7">
        <rdfs:range>
            <owl:Class>
                <rdfs:subClassOf rdf:resource="&mpeg7;Mpeg7Type"/>
                <rdfs:subClassOf>
                    <owl:Class>
                        <owl:unionOf rdf:parseType="Collection">
                            <owl:Restriction>
                                <owl:onProperty rdf:resource="#DescriptionUnit"/>
                                <owl:allValuesFrom rdf:resource="&mpeg7;Mpeg7BaseType"/>
                            </owl:Restriction>
                            <owl:Restriction>
                                <owl:onProperty rdf:resource="#Description"/>
                                <owl:allValuesFrom rdf:resource="&mpeg7;CompleteDescriptionType"/>
                            </owl:Restriction>
                        </owl:unionOf>
                    </owl:Class>
                </rdfs:subClassOf>
            </owl:Class>
        </rdfs:range>
    </owl:ObjectProperty>
    

    The intent here is clear, but the anonymous class is intended to be an intersection - it cannot be parsed as such because it is created as nested subclass axioms, which are not valid OWL syntax.

    When the above sample is changed to this:

    <owl:ObjectProperty rdf:ID="Mpeg7">
        <rdfs:range>
            <owl:Class>
                <owl:intersectionOf rdf:parseType="Collection">
                    <rdf:Description rdf:about="&mpeg7;Mpeg7Type"/>
                    <owl:Class>
                        <owl:unionOf rdf:parseType="Collection">
                            <owl:Restriction>
                                <owl:onProperty rdf:resource="#DescriptionUnit"/>
                                <owl:allValuesFrom rdf:resource="&mpeg7;Mpeg7BaseType"/>
                            </owl:Restriction>
                            <owl:Restriction>
                                <owl:onProperty rdf:resource="#Description"/>
                                <owl:allValuesFrom rdf:resource="&mpeg7;CompleteDescriptionType"/>
                            </owl:Restriction>
                        </owl:unionOf>
                    </owl:Class>
                </owl:intersectionOf>
            </owl:Class>
        </rdfs:range>
    </owl:ObjectProperty>
    

    The parsed axiom becomes

    ObjectPropertyRange(<#Mpeg7>
        ObjectIntersectionOf(
            <http://rhizomik.net/ontologies/2005/03/Mpeg7-2001.owl#Mpeg7Type>
            ObjectUnionOf(
                ObjectAllValuesFrom(<#Description> <http://rhizomik.net/ontologies/2005/03/Mpeg7-2001.owl#CompleteDescriptionType>)
                ObjectAllValuesFrom(<#DescriptionUnit> <http://rhizomik.net/ontologies/2005/03/Mpeg7-2001.owl#Mpeg7BaseType>)
            )
        )
    )
    

    I count about 175 similar problems in the file...