在导入的OWL本体中获取超类

时间:2013-07-12 09:16:17

标签: java neo4j owl owl-api

我正在尝试解析本体(包括导入的本体)以将其存储到图形数据库中。为此,我首先列出本体中的所有类,然后将它们链接到各自的超类。

除导入的超类外,代码工作正常。我可以链接到我自己的本体中的超类,但不能链接到其超类在导入的本体中的类。超类存在,如果我在getClasesInSignature()方法调用之后打印它,我可以看到它,因为我指定了true来添加导入的类。

在此代码示例中,如上所述,类的超类集的输出将为空。有没有办法包括它们?

public void importOntology(String ontologyFile) throws Exception {
    try {
        File file = new File(ontologyFile);
        if (file.exists()) {
            OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
            OWLOntology ontology = manager.loadOntologyFromOntologyDocument(file);
            OWLReasonerFactory reasonerFactory = PelletReasonerFactory.getInstance();
            OWLReasoner reasoner = reasonerFactory.createReasoner(ontology, new SimpleConfiguration());
            if (!reasoner.isConsistent()) {
                throw new Exception("Ontology is inconsistent");
            }

            Transaction tx = db.beginTx();
            try {
                //create starting node
                Node thingNode = getOrCreateNodeWithUniqueFactory("owl:Thing");

                //add all classes
                for (OWLClass c :ontology.getClassesInSignature(true)) {
                    String classString = c.toString();
                    if (classString.contains("#")) {
                        classString = classString.substring(classString.indexOf("#")+1,classString.lastIndexOf(">"));
                    }
                    //create node
                    Node classNode = getOrCreateNodeWithUniqueFactory(classString);

                    Set<OWLClassExpression> superclasses = c.getSuperClasses(ontology);

                    //top level node
                    if (superclasses.isEmpty()) {
                        //link to thing 
                    } else {
                        //link to superclass(es)
                    }

                    //[rest of code removed]
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

好的,经过一些研究,我发现OWLReasoner也有一个获得超类的功能。 该方法包括来自导入本体的超类,甚至可以区分直接和间接超类。虽然getClassesInSignature()包含那些没有访问推理器但是工作正常并解决了我的问题,这有点奇怪。

代码是

NodeSet<OWLClass> superclasses = reasoner.getSuperClasses(c, true);

获取课程。返回类型不同,这就是为什么还必须更改以下内容:

for (org.semanticweb.owlapi.reasoner.Node<OWLClass> parentOWLNode: superclasses) {                      
    OWLClassExpression parent = parentOWLNode.getRepresentativeElement();