【发布时间】:2021-05-26 01:00:58
【问题描述】:
我尝试使用 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推理的反身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, owl:sameAs, ?y)";
}
}
【问题讨论】:
-
这应该是一个错误。你应该打开一个 Github 问题。 OWL API 确实使用集合来保持相同公理的个体,但实际上 N-Triples 表示确实需要 2 个个体,因此,由于集合中只有一个个体,所以会发生异常。一个简单的检查 size = 1 特别是公理应该可以解决这个问题。但是您必须报告它,甚至提供修复并提出拉取请求
-
result.add(dataFactory.getOWLSameIndividualAxiom(entity, entity));我不确定这条线的目的是什么。正在创建的公理不是由推理器推断的,并且不是有效的 OWL 2 公理。删除此行可能会解决您的问题。 -
@Ignazio 试图为 OWL 2 RL Rule Semantics of Equality 创建推理,并且该行的目的是用于 Rule eq-ref,即 If: T(?s, ?p, ?o), 然后: T(?s, owl:sameAs, ?s), T(?p, owl:sameAs, ?p), T(?o, owl:sameAs, ?o)。如果我删除了该行,是否有任何替代方法可以产生推理?
-
目前没有 OWLAPI 的好方法 :-( 问题是您希望写出的推论可以表示为 RDF 三元组,但根本不能表示为 OWL 公理,所以 OWLAPI 和 RIO (您尝试过的格式跨越 OWLAPI 和 RIO 格式)并不期望那样。有一个开放的请求允许此类构造通过某种机制工作,以便应用程序可以选择使用不符合 OWL 的公理,但它是还没有实现。我对当前堆栈所做的就是写出没有这些三元组的 NTRIPLE 内容,然后手动将它们添加到文件中,这不是很好。
标签: java owl owl-api n-triples