java - 如何读取rdf :description inside annotation using OWL API

标签 java rdf owl owl-api

我是 OWL API 的新手。如何获取以下 OWL 文件中 rdfs:label 内的值? oboInOwl:hasSynonym 是一个注释属性。

<oboInOwl:hasSynonym>
  <rdf:Description>
    <rdf:type rdf:resource="&oboInOwl;Synonym"/>
    <rdfs:label xml:lang="en">Endocardiums</rdfs:label>
  </rdf:Description>
</oboInOwl:hasSynonym>

我正在使用 Owl API。我不想使用 XML 解析器。

最佳答案

以下代码重新创建了包含您所描述的结构类型的本体,并展示了如何检索您感兴趣的注释属性值。getSampleOntology()创建本体(并打印它),以及 main展示了如何从 x 开始,找到它的hasSynonym值,然后找到 rdfs:label这些值的 s。这是基于OWL API code examples来自文档。

import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.OWLOntologyDocumentTarget;
import org.semanticweb.owlapi.io.RDFXMLOntologyFormat;
import org.semanticweb.owlapi.io.SystemOutDocumentTarget;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAnnotation;
import org.semanticweb.owlapi.model.OWLAnnotationAssertionAxiom;
import org.semanticweb.owlapi.model.OWLAnnotationProperty;
import org.semanticweb.owlapi.model.OWLAnnotationSubject;
import org.semanticweb.owlapi.model.OWLAnonymousIndividual;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLIndividual;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLObjectPropertyAssertionAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyFormat;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import org.semanticweb.owlapi.vocab.OWLRDFVocabulary;

public class OWLAPIAnnotations {
    final static OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
    final static OWLDataFactory factory = manager.getOWLDataFactory();
    final static String ns = "http://example.org/";
    final static OWLNamedIndividual x = factory.getOWLNamedIndividual( IRI.create( ns+"x" ));
    final static OWLAnonymousIndividual y = factory.getOWLAnonymousIndividual();
    final static OWLObjectProperty hasSynonym = factory.getOWLObjectProperty(IRI.create(ns + "hasSynonym"));

    public static OWLOntology getSampleOntology() throws OWLOntologyCreationException, OWLOntologyStorageException {
        OWLOntology ontology = manager.createOntology();
        manager.addAxiom( ontology, factory.getOWLClassAssertionAxiom( factory.getOWLClass(IRI.create(ns + "Synonym")), y));
        manager.addAxiom(ontology, factory.getOWLObjectPropertyAssertionAxiom(hasSynonym, x, y));
        OWLAnnotation ann = factory.getOWLAnnotation( factory.getOWLAnnotationProperty(OWLRDFVocabulary.RDFS_LABEL.getIRI()), factory.getOWLLiteral("Endocardium", "en"));
        manager.addAxiom(ontology, factory.getOWLAnnotationAssertionAxiom(y, ann));
        manager.saveOntology(ontology, System.out);
        return ontology;
    }

    public static void main(String[] args) throws OWLOntologyCreationException, OWLOntologyStorageException {
        OWLOntology ontology = getSampleOntology();
        for( OWLIndividual object : x.getObjectPropertyValues( hasSynonym, ontology ) ) {
            for ( OWLAnnotationAssertionAxiom aAxiom : ontology.getAnnotationAssertionAxioms( (OWLAnnotationSubject) object ) ) {
                if ( aAxiom.getProperty().equals( factory.getRDFSLabel() ) ) {
                    System.out.println( aAxiom.getValue() );
                }
            }
        }
    }
}

最后的输出(显示注释值)是:

"Endocardium"@en

生成的本体是(删除注释,以节省空间):

<?xml version="1.0"?>
<rdf:RDF xmlns="http://www.w3.org/2002/07/owl#"
     xml:base="http://www.w3.org/2002/07/owl"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:example="http://example.org/">
    <ObjectProperty rdf:about="http://example.org/hasSynonym"/>
    <Class rdf:about="http://example.org/Synonym"/>
    <NamedIndividual rdf:about="http://example.org/x">
        <example:hasSynonym>
            <rdf:Description>
                <rdf:type rdf:resource="http://example.org/Synonym"/>
                <rdfs:label xml:lang="en">Endocardium</rdfs:label>
            </rdf:Description>
        </example:hasSynonym>
    </NamedIndividual>
</rdf:RDF>

关于java - 如何读取rdf :description inside annotation using OWL API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12174698/

相关文章:

java - 使用 MongoDb 进行 Elasticsearch

java - 将 Owl 类转换为 java 类或 xml

rdf - 计算OWL本体中子类的深度

java - 在 Java 中重写泛型方法的正确方法

java - GWT 中的拖动和切换按钮类似于 Ubuntu 12.04 切换按钮

python语义代理/服务器,使用哪个框架?

rdf - 如何判断资源/实体是类还是实例

rdf - 如何设置通用 owl 对象关系

java - 如何区分 OWLAPI 中的断言公理和推断公理?

java - Spring 使用注解从一个类创建两个 bean