简体   繁体   English

HermiT 推理器为数据类型显示“UnsupportedDatatypeException”

[英]HermiT reasoner thows “UnsupportedDatatypeException” for datatype

I want to exctract DBPedia ontology classes hiearchy from an ontology file dbpedia_2016-10.owl (downloaded from https://wiki.dbpedia.org/downloads-2016-10 , and I built this method by refering to some other codes as I am beginner in this area:我想从本体文件dbpedia_2016-10.owl (从https://wiki.dbpedia.org/downloads-2016-10下载,我通过参考其他一些代码构建了这个方法)这方面的初学者:

        public static void importOntology(String ontologyFile) throws Exception {
        
             File file = new File(ontologyFile);
            if (file.exists()) {
                OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
                OWLOntology ontology = manager.loadOntologyFromOntologyDocument(file);
                
               Reasoner reasoner=new Reasoner(ontology);                
                if (!reasoner.isConsistent()) {
                    throw new Exception("Ontology is inconsistent");
                }

                
                
                for (OWLClass c :ontology.getClassesInSignature(true)) {
                    String classString = c.toString();
                    System.out.println(classString);
                    if (classString.contains("#")) {
                        classString = classString.substring(classString.indexOf("#")+1,classString.lastIndexOf(">"));
                    }
                    Set<OWLClassExpression> superclasses = c.getSuperClasses(ontology);
    
                    if (superclasses.isEmpty()) {
                        
                        System.out.println(classString + " is owl#Thing.");
                    } else {
                        for (OWLClassExpression superc:superclasses) {
                            System.out.println(superc + " is a parent.");
                        }
                    }
                }
            }
        
    }

When I declare and instanciate the HermiT reasoner, I get this exception:当我声明并实例化 HermiT 推理器时,出现以下异常:

org.semanticweb.HermiT.datatypes.UnsupportedDatatypeException: HermiT supports all and only the datatypes of the OWL 2 datatype map, see 
http://www.w3.org/TR/owl2-syntax/#Datatype_Maps. 
The datatype 'http://dbpedia.org/datatype/hour' is not part of the OWL 2 datatype map and 
no custom datatype definition is given; 
therefore, HermiT cannot handle this datatype.

Now, I undestand that HermiT is complaining about a datatype that it does not recognize, but how to solve this without modifyng the ontology?现在,我不明白 HermiT 正在抱怨它无法识别的数据类型,但是如何在不修改本体的情况下解决这个问题?

I am not sure if it would help, but these are the depencies of my project:我不确定它是否会有所帮助,但这些是我的项目的依赖项:

        <dependencies>
        <dependency>
            <groupId>com.hermit-reasoner</groupId>
            <artifactId>org.semanticweb.hermit</artifactId>
            <version>1.3.8.4</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.owlapi</groupId>
            <artifactId>owlexplanation</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>

Thanks in advance for any guidance!在此先感谢您的指导!

To test this, I loaded the DBPedia ontology into Protege 5.5 and used HermiT 1.4.3.517 to reason over it.为了测试这一点,我将 DBPedia 本体加载到 Protege 5.5 中,并使用 HermiT 1.4.3.517 对其进行推理。 This works without problem.这没有问题。 I therefore think you should look at your OWL API and HermiT maven dependencies.因此,我认为您应该查看您的 OWL API 和 HermiT maven 依赖项。

<dependency>
    <groupId>net.sourceforge.owlapi</groupId>
    <artifactId>owlapi-distribution</artifactId>
    <version>5.1.12</version>
</dependency>   
<dependency>
    <groupId>net.sourceforge.owlapi</groupId>
    <artifactId>org.semanticweb.hermit</artifactId>
    <version>1.4.3.517</version>
</dependency>

Update更新

You also seem to be starting the reasoner incorrectly.您似乎也错误地启动了推理器。 Here some working code using the Maven dependencies above.这里有一些使用上面的 Maven 依赖项的工作代码。

import org.semanticweb.HermiT.ReasonerFactory;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.*;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

import java.io.File;

public class LoadDBPedia {

    private static Logger logger = LoggerFactory.getLogger(LoadDBPedia.class);
    // Why This Failure marker
    private static final Marker WTF_MARKER = MarkerFactory.getMarker("WTF");

    private static String ONTOLOGY_FILE = "/path_to_ontology/dbpedia_2016-10.owl";

    public static void main(String[] args) {
        try {
            File file = new File(ONTOLOGY_FILE);
            if (file.exists()) {
                OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
                OWLOntology ontology = manager.loadOntologyFromOntologyDocument(file);

                OWLReasonerFactory reasonerFactory = new ReasonerFactory();
                OWLReasoner reasoner = reasonerFactory.createReasoner(ontology);
                if (!reasoner.isConsistent()) {
                    logger.debug("Ontology is inconsistent");
                    throw new Exception("Ontology is inconsistent");
                } else {
                    logger.debug("Ontology is consistent");
                }
              }

            } catch (Throwable t) {
            logger.error(WTF_MARKER, t.getMessage(), t);
        }
    }
 }

What could be wrong with your code?您的代码可能有什么问题?

(1) This line Reasoner reasoner=new Reasoner(ontology); (1) 这一行Reasoner reasoner=new Reasoner(ontology); is suspicious because (a) it not clear where you got the Reasoner class from and (b) does not seem to come from HermiT as the constructors for Reasoner in HermiT have different signatures.是可疑的,因为 (a) 不清楚您从哪里获得Reasoner类,以及 (b) 似乎不是来自 HermiT,因为 HermiT 中Reasoner的构造函数具有不同的签名。

(2) The fact that you have a dependency on owlexplanation rather than owlapi-distribution is suspicious. (2) 您依赖于owlexplanation而不是owlapi-distribution的事实是可疑的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM