无法使用 NTriples (OWLAPI) 保存本体

如何解决无法使用 NTriples (OWLAPI) 保存本体

我尝试使用 owlapi 将我的本体保存为 NTriples 格式。 当我尝试保存本体时出现此错误

Exception in thread "main" java.lang.indexoutofboundsexception: Index 1 out of bounds for length 1
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:373)
    at java.base/java.util.ArrayList.get(ArrayList.java:426)
    at java.base/java.util.Collections$UnmodifiableList.get(Collections.java:1321)
    at java.base/java.util.Collections$UnmodifiableList.get(Collections.java:1321)
    at org.semanticweb.owlapi.rdf.model.AbstractTranslator.lambda$visit$3(AbstractTranslator.java:710)
    at java.base/java.lang.Iterable.forEach(Iterable.java:75)
    at org.semanticweb.owlapi.rdf.model.AbstractTranslator.visit(AbstractTranslator.java:709)
    at org.semanticweb.owlapi.model.OWLSameIndividualAxiom.accept(OWLSameIndividualAxiom.java:51)
    at org.semanticweb.owlapi.rdf.model.AbstractTranslator.translate(AbstractTranslator.java:288)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1624)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndcopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at org.semanticweb.owlapi.rdf.RDFRendererBase.createGraph(RDFRendererBase.java:484)
    at org.semanticweb.owlapi.rdf.RDFRendererBase.createGraph(RDFRendererBase.java:471)
    at org.semanticweb.owlapi.rdf.RDFRendererBase.lambda$renderEntities$5(RDFRendererBase.java:294)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
    at java.base/java.util.ArrayList$Itr.forEachRemaining(ArrayList.java:1002)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndcopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at org.semanticweb.owlapi.rdf.RDFRendererBase.renderEntities(RDFRendererBase.java:295)
    at org.semanticweb.owlapi.rdf.RDFRendererBase.renderInOntologySignatureEntities(RDFRendererBase.java:280)
    at org.semanticweb.owlapi.rdf.RDFRendererBase.renderOntologyComponents(RDFRendererBase.java:263)
    at org.semanticweb.owlapi.rdf.RDFRendererBase.render(RDFRendererBase.java:258)
    at org.semanticweb.owlapi.rio.RioStorer.storeOntology(RioStorer.java:230)
    at org.semanticweb.owlapi.util.AbstractOWLStorer.store(AbstractOWLStorer.java:85)
    at org.semanticweb.owlapi.util.AbstractOWLStorer.storeOntology(AbstractOWLStorer.java:72)
    at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.saveOntology(OWLOntologyManagerImpl.java:1324)
    at preprocess.PositiveInference.inferringSemanticsofEquality(PositiveInference.java:117)
    at preprocess.PositiveInference.inferencing(PositiveInference.java:85)
    at preprocess.PositiveInference.main(PositiveInference.java:65)

错误引用的代码是:

NTriplesdocumentFormat nTriplesFormat = new NTriplesdocumentFormat();

try {
        ontologyManager.saveOntology(ontologyInferred,nTriplesFormat,IRI.create(file.toURI()));
} catch (OWLOntologyStorageException e) {
        e.printstacktrace();
} 

本体:

SameIndividual(<http://www.example.com/individual/eq#PB> )
SameIndividual(<http://www.example.com/individual/eq#transY> )
SameIndividual(<http://www.example.com/individual/eq#symX> )
SameIndividual(<http://www.example.com/individual/eq#OC> )
SameIndividual(<http://www.example.com/individual/eq#transZ> )
SameIndividual(<http://www.example.com/individual/eq#SAA> )
SameIndividual(<http://www.example.com/individual/eq#transX> )
SameIndividual(<http://www.example.com/individual/eq#OAC> )
SameIndividual(<http://www.example.com/individual/eq#refO> )
SameIndividual(<http://www.example.com/individual/eq#refS> )
SameIndividual(<http://www.example.com/individual/eq#SA> )
SameIndividual(<http://www.example.com/individual/eq#PAB> )
SameIndividual(<http://www.example.com/individual/eq#transX> <http://www.example.com/individual/eq#transY> <http://www.example.com/individual/eq#transZ> )
SameIndividual(<http://www.example.com/individual/eq#symY> )

基于OWL 2 RL/RDF规则eq-ref推理的reflexsive sameAs公理结果

如果:T(?s,?p,?o) 那么:T(?s,owl:sameAs,?s)

SameIndividual(http://www.example.com/individual/eq#PB)

推理代码

result.add(dataFactory.getoWLSameIndividualAxiom(individual,individual));

我可以将我的本体保存为 OWLXMLFormat,但是因为我正在构建一个需要三重形式的数据集。有没有办法以任何三重形式保存它?

其他格式已经尝试过但错误

NTriplesdocumentFormat nTriplesFormat = new NTriplesdocumentFormat();
N3DocumentFormat n3Format = new N3DocumentFormat();
TrigDocumentFormat trigFormat = new TrigDocumentFormat();
TurtleDocumentFormat  turtleFormat = new TurtleDocumentFormat();
RioTurtleDocumentFormat  rioFormat = new RioTurtleDocumentFormat();

编辑:

完整的推理代码

public class InferredSameIndividualAxiomGenerator extends InferredindividualAxiomGenerator<OWLSameIndividualAxiom>{
    
    @Override
    protected void addAxioms(OWLNamedindividual entity,OWLreasoner reasoner,OWLDataFactory dataFactory,Set<OWLSameIndividualAxiom> result) {

        Set<OWLNamedindividual> sameIndividuals = asUnorderedSet(reasoner.getSameIndividuals(entity).entities());
        sameIndividuals.add(entity);
        result.add(dataFactory.getoWLSameIndividualAxiom(entity,entity));
        if (sameIndividuals.size() > 1) 
            result.add(dataFactory.getoWLSameIndividualAxiom(sameIndividuals));
    }

    @Override
    public String getLabel() {
        return "Same Individuals T(?x,?y)";
    }
}

解决方法

异常是一个错误(请按照评论中的建议报告它),但是请注意,这些不是合法的 OWL 公理。语法和语义规范显示 sameAs 至少需要两个参数。

(考虑到公理应该允许定义同义词个体;一个论点只提供没有新信息)

如果公理是由推断公理生成器生成的,那么看起来该代码也有错误。

,

可以使用 ONT-API 作为解决方法。
由于 ONTAPI 是一个以 RDF 为中心的 OWLAPI 实现,因此任何 RDF 序列化都一定没有问题(默认情况下,OWLAPI 格式被 Jena 替代品替代)。
但是,公理 SameIndividual(x,x) 仍然是非法的,要创建这样的结构需要切换到 RDF API。

示例:

    OWLOntologyManager m = OntManagers.createManager();

    OWLOntology ont = m.createOntology();
    String i = "http://i";

    OntModel g = ((Ontology) ont).asGraphModel();
    g.createIndividual(i).addSameIndividual(g.createIndividual(i));

    ont.saveOntology(new NTriplesDocumentFormat(),System.out);

输出:

<http://i> <http://www.w3.org/2002/07/owl#sameAs> <http://i> .
<http://i> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#NamedIndividual> .
_:B0ee0d3dfX2D1fe4X2D4489X2D9fc3X2De18bae6cfab4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Ontology> .

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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元字符(。)和普通点?