OWL-API重命名不会删除旧的owl:Thinger中的Thing子类

如何解决OWL-API重命名不会删除旧的owl:Thinger中的Thing子类

在使用owl-api重命名一个类之后,我没有得到我期望的子类列表。我创建了一个小例子来演示。

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

这是rename-test.owl文件

<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测试文件

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()));
    }
}

我得到的输出如下:

** 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编辑器。

解决方法

请勿使用结构推理器。它不适合在现实世界中使用,并且可能会保留不应使用的缓存。只需在本体中写出公理,该本体中就没有足够的功能来工作了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?