如何使用OWL API

时间:2017-04-09 11:54:30

标签: java owl ontology owl-api

我是OWL API的新手,因此我面临一些检索数据的问题。

假设我有以下数据:

<rdf:Description rdf:about="http://purl.obolibrary.org/obo/GO_0044297">
        <oboInOwl:creation_date>"2010-02-05T10:37:16Z"</oboInOwl:creation_date>
        <obo:IAO_0000115>"The portion of a cell bearing surface projections such as axons, dendrites, cilia, or flagella that includes the nucleus, but excludes all cell projections."</obo:IAO_0000115>
        <oboInOwl:hasOBONamespace>"cellular_component"</oboInOwl:hasOBONamespace>
        <oboInOwl:hasDbXref>"Wikipedia:Cell_body"</oboInOwl:hasDbXref>
        <oboInOwl:hasDbXref>"FMA:67301"</oboInOwl:hasDbXref>
        <oboInOwl:hasExactSynonym>"cell soma"</oboInOwl:hasExactSynonym>
        <rdfs:label>"cell body"</rdfs:label>
        <rdfs:subClassOf>http://purl.obolibrary.org/obo/GO_0044464</rdfs:subClassOf>
        <oboInOwl:hasDbXref>"FBbt:00005107"</oboInOwl:hasDbXref>
        <rdf:type>http://www.w3.org/2002/07/owl#Class</rdf:type>
        <oboInOwl:id>"GO:0044297"</oboInOwl:id>
        <rdfs:comment>"Note that 'cell body' and 'cell soma' are not used in the literature for cells that lack projections, nor for some cells (e.g. yeast with mating projections) that do have projections."</rdfs:comment>
        <oboInOwl:created_by>"xyz"</oboInOwl:created_by>
        <oboInOwl:inSubset>http://purl.obolibrary.org/obo/go#goslim_pir</oboInOwl:inSubset>
    </rdf:Description>
<rdf:Description rdf:about="http://purl.obolibrary.org/obo/GO_0071509">
    <oboInOwl:hasRelatedSynonym>"activation of MAPKK activity involved in mating response"</oboInOwl:hasRelatedSynonym>
    <rdfs:subClassOf>http://purl.obolibrary.org/obo/GO_0090028</rdfs:subClassOf>
    <oboInOwl:hasOBONamespace>"biological_process"</oboInOwl:hasOBONamespace>
    <oboInOwl:hasExactSynonym>"activation of MAP kinase kinase activity during conjugation with cellular fusion"</oboInOwl:hasExactSynonym>
    <oboInOwl:hasExactSynonym>"conjugation with cellular fusion, activation of MAPKK activity"</oboInOwl:hasExactSynonym>
    <rdfs:label>"activation of MAPKK activity involved in conjugation with cellular fusion"</rdfs:label>
    <rdf:type>http://www.w3.org/2002/07/owl#Class</rdf:type>
    <oboInOwl:id>"GO:0071509"</oboInOwl:id>
    <oboInOwl:creation_date>"2010-01-05T02:09:58Z"</oboInOwl:creation_date>
    <oboInOwl:hasExactSynonym>"conjugation with cellular fusion, activation of MAP kinase kinase activity"</oboInOwl:hasExactSynonym>
    <oboInOwl:created_by>"midori"</oboInOwl:created_by>
    <obo:IAO_0000115>"Any process that initiates the activity of the inactive enzyme MAP kinase kinase in the context of conjugation with cellular fusion."</obo:IAO_0000115>
    <rdfs:subClassOf>http://purl.obolibrary.org/obo/GO_0000186</rdfs:subClassOf>
</rdf:Description>

对于每个“rdf:description”,我想在java中使用OWL API检索其对应的“rdf:label”,“oboInOwl:hasExactSynonym”和“rdfs:subClassOf”。

到目前为止,我可以获得所有标签,但不能获得关于哪个标签用于描述的链接。

目前我的代码如下:

OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
        OWLOntology pizzaOntology = manager.loadOntologyFromOntologyDocument(f);
        Set<OWLOntology> allOntologies = manager.getImportsClosure(pizzaOntology);
        //System.out.println(allOntologies);
        OWLReasonerFactory reasonerFactory = new ElkReasonerFactory();
        OWLReasoner reasoner = reasonerFactory.createReasoner(pizzaOntology);
        //pizzaOntology
        OWLDataFactory factory = manager.getOWLDataFactory();

        Set<OWLAxiom> axiom = pizzaOntology.getAxioms();
        for (OWLAxiom o : axiom) {
            AxiomType<?> at = o.getAxiomType();
            //System.out.println("Annotation type is "+at+" for "+o);

            if (at == AxiomType.ANNOTATION_ASSERTION) {
                OWLAnnotationAssertionAxiom ax = (OWLAnnotationAssertionAxiom) o;
                //Check if the axiom is a label and write to file
                if(ax.getProperty().toString().contains("hasExactSynonym"))
                System.out.println("Data is "+ax.getValue().toString());
                if (ax.getProperty().equals(factory.getRDFSLabel())) {
                    String label = ax.getValue().toString();
                    label = label.toLowerCase();
                    label = label.replaceAll("[^\\p{L}\\p{Nd}]+", " ");
                    allLabels.add(label);
                }
            }

        }

有人可以帮我解决一些问题吗?

1 个答案:

答案 0 :(得分:1)

这应该有所帮助:

    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
    OWLOntology pizzaOntology = manager.loadOntologyFromOntologyDocument(f);
    Set<OWLOntology> allOntologies = manager.getImportsClosure(pizzaOntology);
    // System.out.println(allOntologies);
    OWLReasonerFactory reasonerFactory = new ElkReasonerFactory();
    OWLReasoner reasoner = reasonerFactory.createReasoner(pizzaOntology);
    // pizzaOntology
    OWLDataFactory factory = manager.getOWLDataFactory();
    Map<OWLAnnotationSubject, String> allLabels = new HashMap<>();
    Map<OWLAnnotationSubject, String> allExactSynonyms = new HashMap<>();
    for (OWLAnnotationAssertionAxiom ax : pizzaOntology
        .getAxioms(AxiomType.ANNOTATION_ASSERTION)) {
        // Check if the axiom is a label and write to file
        OWLAnnotationSubject subject = ax.getSubject();
        if (ax.getProperty().toString().contains("hasExactSynonym")) {
            allExactSynonyms.put(subject, ax.getValue().toString());
        }
        if (ax.getProperty().equals(factory.getRDFSLabel())) {
            String label = ax.getValue().toString();
            label = label.toLowerCase();
            label = label.replaceAll("[^\\p{L}\\p{Nd}]+", " ");
            allLabels.put(subject, label);
        }
    }

两个映射保持IRI之间的关系(在这种情况下,注释主题始终是IRI - 注释附加到类的IRI,而不是类本身)和属性的值。如果将标签值与IRI的属性值匹配,则可以通过映射中的IRI找到其他值。