首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OWL-API重命名不会删除推理程序中旧的owl:Thing子类

OWL-API重命名不会删除推理程序中旧的owl:Thing子类
EN

Stack Overflow用户
提问于 2020-09-06 04:30:38
回答 1查看 66关注 0票数 1

在使用OWL-API重命名一个类之后,我没有得到我想要的子类列表。我已经创建了一个小示例来演示。

本体分为两类:狗和飞盘。然后我将Dog重命名为Cat。重命名后,owl:Thing子类的列表包含Dog和Cat。

下面是rename-test.owl文件:

代码语言:javascript
复制
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns="http://example.org/owl-api/rename/"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
  <owl:Ontology rdf:about="http://example.org/owl-api/rename"/>
  <owl:Class rdf:about="http://example.org/owl-api/rename/Frisbee"/>
  <owl:Class rdf:about="http://example.org/owl-api/rename/Dog"/>
</rdf:RDF>

下面是java测试文件:

代码语言:javascript
复制
package org.example;

import java.io.File;
import java.util.Collections;
import java.util.List;

import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.FileDocumentSource;
import org.semanticweb.owlapi.io.OWLOntologyDocumentSource;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyChange;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.semanticweb.owlapi.reasoner.structural.StructuralReasonerFactory;
import org.semanticweb.owlapi.util.OWLEntityRenamer;

public class OwlapiRenameTest_main {
    
    public static void main(String[] args) {
        
        String owlPath = "c:\\owl-tests\\rename-test.owl";
        String oldUri = "http://example.org/owl-api/rename/Dog";
        String newUri = "http://example.org/owl-api/rename/Cat";
        runRenameTest(owlPath, oldUri, newUri);
    }
    
    static void runRenameTest(String owlPath, String oldUri, String newUri) {
        
        OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
        OWLOntologyDocumentSource owlFile = new FileDocumentSource(new File(owlPath));
        try {
            OWLOntology ontology = manager.loadOntologyFromOntologyDocument(owlFile);
            OWLReasoner reasoner = new StructuralReasonerFactory().createNonBufferingReasoner(ontology);
            
            dumpStmts(ontology);
            dumpSubclasses(ontology, reasoner);
            
            OWLEntityRenamer renamer = new OWLEntityRenamer(manager, Collections.singleton(ontology));
            List<? extends OWLOntologyChange> changes = renamer.changeIRI(
                    IRI.create(oldUri), 
                    IRI.create(newUri));
            manager.applyChanges(changes);
            
            System.out.println("** rename applied **");
            
            //does not help (which it shouldn't anyway for non-buffering reasoner)
            reasoner.flush();

            dumpStmts(ontology);
            dumpSubclasses(ontology, reasoner);
        } catch (OWLOntologyCreationException e) {
            e.printStackTrace();
        }
    }
    
    static void dumpStmts(OWLOntology ontology) {
        
        System.out.println("** dump all start **");
        ontology.axioms().forEach(axiom -> System.out.println("  axiom: " + axiom));
        System.out.println("** dump all end **");
    }
    
    static void dumpSubclasses(OWLOntology ontology, OWLReasoner reasoner) {
        
        System.out.println("** owl:Thing subclasses **");
        OWLClass thingClass = ontology.getOWLOntologyManager().getOWLDataFactory().getOWLClass(
                IRI.create("http://www.w3.org/2002/07/owl#Thing"));
        reasoner.getSubClasses(thingClass, true).entities().forEach(entity ->
                System.out.println("  " + entity.toString()));
    }
}

我得到的输出如下:

代码语言:javascript
复制
** dump all start **
  axiom: Declaration(Class(<http://example.org/owl-api/rename/Frisbee>))
  axiom: Declaration(Class(<http://example.org/owl-api/rename/Dog>))
** dump all end **
** owl:Thing subclasses **
  <http://example.org/owl-api/rename/Frisbee>
  <http://example.org/owl-api/rename/Dog>
** rename applied **
** dump all start **
  axiom: Declaration(Class(<http://example.org/owl-api/rename/Frisbee>))
  axiom: Declaration(Class(<http://example.org/owl-api/rename/Cat>))
** dump all end **
** owl:Thing subclasses **
  <http://example.org/owl-api/rename/Frisbee>
  <http://example.org/owl-api/rename/Dog>
  <http://example.org/owl-api/rename/Cat>

正如您所看到的,在重命名之后,Dog类不在公理列表中,但非缓冲推理器认为它是。

我需要以某种方式调整代码吗?我试着在推理器上使用flush(),这对非缓冲的推理器来说是有意义的。我找不到任何其他类似的方法来尝试。我不想自动保存,因为这是用于用户必须手动保存的OWL编辑器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-06 16:21:40

不要使用结构推理机。它并不是为了在现实世界中使用,而且很可能保留了它不应该使用的缓存。只需在本体中写出公理,这个本体中几乎没有足够的公理来工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63758234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档