簡體   English   中英

如何使用owl API在一行中打印類,子屬性和范圍?

[英]How do I Print class,sub property and range at one row using owl API?

我需要使用owl API在一行中打印[Class]-[Class子屬性]-[Class范圍]和[Class超級屬性]。

我已經嘗試過,但是我只得到[類],它是[子屬性]

下面是我的代碼:

package com.ifour.example.owl;

import java.io.File;

import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.AxiomType;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLDataProperty;
import org.semanticweb.owlapi.model.OWLDataPropertyDomainAxiom;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLObjectPropertyDomainAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyManager;

public class IterateOWLDetails2 {

    public static void main(String args[]) {

        try {

            OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
            IRI iri = IRI.create(new File("src/main/webapp/resources/inputfile/owlfile/pizza.owl"));
            OWLOntology moduleOWL = manager.loadOntologyFromOntologyDocument(iri);

            java.util.Set<OWLClass> classes;
            java.util.Set<OWLObjectProperty> prop;
            java.util.Set<OWLDataProperty> dataProp;
            java.util.Set<OWLNamedIndividual> individuals;

            classes = moduleOWL.getClassesInSignature();
            prop = moduleOWL.getObjectPropertiesInSignature();
            dataProp = moduleOWL.getDataPropertiesInSignature();
            individuals = moduleOWL.getIndividualsInSignature();

            System.out.println("Classes");
            System.out.println("--------------------------------");
            for (OWLClass cls : classes) {
                System.out.println("+: " + cls.getIRI().getShortForm());

                System.out.println(" \tObject Property Domain");
                for (OWLObjectPropertyDomainAxiom op : moduleOWL.getAxioms(AxiomType.OBJECT_PROPERTY_DOMAIN)) {
                    if (op.getDomain().equals(cls)) {
                        for (OWLObjectProperty oop : op.getObjectPropertiesInSignature()) {
                            if (cls.getIRI().getShortForm().equals(oop.getIRI().getShortForm()))
                                continue;
                            System.out.println("\t\t +: " + oop.getIRI().getShortForm() + "==Object Property");
                        }
                    }
                }

                System.out.println(" \tData Property Domain");
                for (OWLDataPropertyDomainAxiom dp : moduleOWL.getAxioms(AxiomType.DATA_PROPERTY_DOMAIN)) {
                    if (dp.getDomain().equals(cls)) {
                        for (OWLDataProperty odp : dp.getDataPropertiesInSignature()) {
                            System.out.println("\t\t +: " + odp.getIRI().getShortForm() + "==Data Property");
                        }
                    }
                }
            }

        } // end try

        catch (Exception e) {
            System.out.println("Failed to load ontology/ies");
            e.getLocalizedMessage();
            e.printStackTrace();
        } // end catch`
    }
}

我有如下數據

<owl:ObjectProperty rdf:about="http://www.co-ode.org/ontologies/pizza/pizza.owl#hasBase">
        <rdfs:subPropertyOf rdf:resource="http://www.co-ode.org/ontologies/pizza/pizza.owl#hasIngredient"/>
        <owl:inverseOf rdf:resource="http://www.co-ode.org/ontologies/pizza/pizza.owl#isBaseOf"/>
        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#FunctionalProperty"/>
        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#InverseFunctionalProperty"/>
        <rdfs:domain rdf:resource="http://www.co-ode.org/ontologies/pizza/pizza.owl#Pizza"/>
        <rdfs:range rdf:resource="http://www.co-ode.org/ontologies/pizza/pizza.owl#PizzaBase"/>
    </owl:ObjectProperty>

我需要從文件中獲取域,范圍,子屬性。 我的文件中沒有子類屬性,因此請不要提供使用本體的列表子類方法的解決方案。 我已經迭代了所有類,現在我必須獲取該類的各種屬性,例如迭代類的域,范圍,子屬性等。

我已經使用下面的代碼打印了輸出,現在可以使用屬性getObjectPropertyRangeAxioms(oop)來解決我的問題

for(OWLObjectPropertyRangeAxiom range:moduleOWL.getObjectPropertyRangeAxioms(oop)) {
    for(OWLEntity rangeStr : range.getSignature()) {
    //System.out.println("\t\t ==========: " + rangeStr );
    if(!rangeStr.containsEntityInSignature(oop)) {
     System.out.println("\t\t -: " + rangeStr.toString().replaceAll("<|>", "") );
     str = rangeStr.toString().replaceAll("<|>", "");
    }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM