如何使用Java从OWL本体读出特定值

时间:2010-08-14 13:52:55

标签: java ontology owl

我有一个OWL本体论:

<?xml version="1.0"?>
<rdf:RDF
    xmlns="http://www.owl-ontologies.com/Ontology1272923485.owl#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xml:base="http://www.owl-ontologies.com/Ontology1272923485.owl">
  <owl:Ontology rdf:about=""/>
  <owl:Class rdf:ID="studypath">
    <owl:disjointWith>
      <owl:Class rdf:ID="module"/>
    </owl:disjointWith>
    <owl:disjointWith>
      <owl:Class rdf:ID="docent"/>
    </owl:disjointWith>
  </owl:Class>
  <owl:Class rdf:about="#docent">
    <owl:disjointWith>
      <owl:Class rdf:about="#module"/>
    </owl:disjointWith>
    <owl:disjointWith rdf:resource="#studypath"/>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
                            >1</owl:minCardinality>
        <owl:valuesFrom>
          <owl:Class rdf:about="#module"/>
        </owl:valuesFrom>
        <owl:onProperty>
          <owl:ObjectProperty rdf:ID="responsiblefor"/>
        </owl:onProperty>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
  </owl:Class>
  <owl:Class rdf:about="#module">
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:onProperty>
          <owl:ObjectProperty rdf:ID="predecessor_module"/>
        </owl:onProperty>
        <owl:someValuesFrom rdf:resource="#module"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:someValuesFrom rdf:resource="#module"/>
        <owl:onProperty>
          <owl:ObjectProperty rdf:ID="folgemodule"/>
        </owl:onProperty>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
                            >1</owl:minCardinality>
        <owl:onProperty>
          <owl:ObjectProperty rdf:ID="offeredfor"/>
        </owl:onProperty>
        <owl:valuesFrom rdf:resource="#studypath"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
    <owl:disjointWith rdf:resource="#docent"/>
    <owl:disjointWith rdf:resource="#studypath"/>
  </owl:Class>
  <owl:ObjectProperty rdf:about="#predecessor_module">
    <rdfs:range rdf:resource="#module"/>
    <rdfs:domain rdf:resource="#module"/>
    <owl:inverseOf>
      <owl:ObjectProperty rdf:about="#folgemodule"/>
    </owl:inverseOf>
  </owl:ObjectProperty>
  <owl:ObjectProperty rdf:about="#folgemodule">
    <owl:inverseOf rdf:resource="#predecessor_module"/>
    <rdfs:range rdf:resource="#module"/>
    <rdfs:domain rdf:resource="#module"/>
  </owl:ObjectProperty>
  <owl:ObjectProperty rdf:about="#offeredfor">
    <rdfs:range rdf:resource="#studypath"/>
    <rdfs:domain rdf:resource="#module"/>
  </owl:ObjectProperty>
  <owl:ObjectProperty rdf:about="#responsiblefor">
    <rdfs:domain rdf:resource="#docent"/>
    <rdfs:range rdf:resource="#module"/>
  </owl:ObjectProperty>
  <module rdf:ID="Datenbanken">
    <offeredfor>
      <studypath rdf:ID="WIN"/>
    </offeredfor>
  </module>
  <docent rdf:ID="John_Smith">
    <responsiblefor rdf:resource="#Datenbanken"/>
  </docent>
  <module rdf:ID="Softwaretechnik"/>
  <docent rdf:ID="Wayne_Smith">
    <responsiblefor rdf:resource="#Softwaretechnik"/>
  </docent>
</rdf:RDF>

现在我使用Java API查询本体。例如,如果我有Wayne_Smith,我该如何查询他负责的模块?

3 个答案:

答案 0 :(得分:1)

韦恩,你正在使用哪种api?如果是曼彻斯特猫头鹰api,你会在他们的文档here中找到一些代码示例,它们可以帮助你解决这个问题。

答案 1 :(得分:1)

如果我正确地理解了您的问题并且您所指的Java API是OWL API,那么这应该可以解决问题:

/*Load your ontology from a local file and do the initialisations*/
File inputfile = new File("ontologyPath");
OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); ;
OWLDataFactory dataFactory = manager.getOWLDataFactory();
OWLOntology yourOntology = manager.loadOntologyFromOntologyDocument(inputfile);
IRI ontologyIRI = yourOntology.getOntologyID().getOntologyIRI();  

/*Get the object property and the individual you're interested in*/  
OWLObjectProperty o_p_responsible_for = dataFactory.getOWLObjectProperty(IRI.create(ontologyIRI + "#"+"Responsiblefor"));
OWLIndividual ind_Wayne = dataFactory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#"+"Wayne_Smith"));
/*return the value*/
Set<OWLIndividual> responsibilities_of_Wayne= ind_Wayne.getObjectPropertyValues(o_p_responsible_for, yourOntology);

答案 2 :(得分:0)

另一种方式:SPARQL查询可用于查询本体以获取Wayne_Smith负责的模块。还有Java SPARQL库(例如:Apache Jena ARQ)。希望这会有所帮助。