2014-12-29 51 views
3

我在eclipse 3.4中使用OWL Api 4.0和Protege 4中的簡單本體論。我有兩個「Ward」和「Gaurdian」類。這些類的個體通過對象屬性isWardOf關聯。我怎樣才能找回有關同一個人Gaurdian類的病房的個人。考慮如下圖所示: -使用OWL API 4.0檢索具有相同對象屬性的OWL個體

enter image description here

我要檢索的事實,彼得和Allice相關或兄弟姐妹,因爲它們都連接到傑克。關於如何使用OWL API 4.0來實現這個任何粗略的線索。

我的完整的貓頭鷹文件貼: -

<?xml version="1.0"?> 


<!DOCTYPE Ontology [ 
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > 
<!ENTITY xml "http://www.w3.org/XML/1998/namespace" > 
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > 
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" > 
]> 


<Ontology xmlns="http://www.w3.org/2002/07/owl#" 
xml:base="http://www.semanticweb.org/antonio/ontologies/2014/11/untitled-ontology-46" 
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:xml="http://www.w3.org/XML/1998/namespace" 
ontologyIRI="http://www.semanticweb.org/antonio/ontologies/2014/11/untitled-ontology- 
46"> 
<Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/> 
<Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/> 
<Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/> 
<Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/> 
<Declaration> 
    <Class IRI="#Gaurdian"/> 
</Declaration> 
<Declaration> 
    <Class IRI="#Ward"/> 
</Declaration> 
<Declaration> 
    <ObjectProperty IRI="#isWardOf"/> 
</Declaration> 
<Declaration> 
    <NamedIndividual IRI="#Allice"/> 
</Declaration> 
<Declaration> 
    <NamedIndividual IRI="#Amber"/> 
</Declaration> 
<Declaration> 
    <NamedIndividual IRI="#Jack"/> 
</Declaration> 
<Declaration> 
    <NamedIndividual IRI="#Paul"/> 
</Declaration> 
<Declaration> 
    <NamedIndividual IRI="#Peter"/> 
</Declaration> 
<ClassAssertion> 
    <Class IRI="#Ward"/> 
    <NamedIndividual IRI="#Allice"/> 
</ClassAssertion> 
<ClassAssertion> 
    <Class IRI="#Gaurdian"/> 
    <NamedIndividual IRI="#Amber"/> 
</ClassAssertion> 
<ClassAssertion> 
    <Class IRI="#Gaurdian"/> 
    <NamedIndividual IRI="#Jack"/> 
</ClassAssertion> 
<ClassAssertion> 
    <Class IRI="#Ward"/> 
    <NamedIndividual IRI="#Paul"/> 
</ClassAssertion> 
<ClassAssertion> 
    <Class IRI="#Ward"/> 
    <NamedIndividual IRI="#Peter"/> 
</ClassAssertion> 
<ObjectPropertyAssertion> 
    <ObjectProperty IRI="#isWardOf"/> 
    <NamedIndividual IRI="#Allice"/> 
    <NamedIndividual IRI="#Jack"/> 
</ObjectPropertyAssertion> 
<ObjectPropertyAssertion> 
    <ObjectProperty IRI="#isWardOf"/> 
    <NamedIndividual IRI="#Amber"/> 
    <NamedIndividual IRI="#Jack"/> 
</ObjectPropertyAssertion> 
<ObjectPropertyAssertion> 
    <ObjectProperty IRI="#isWardOf"/> 
    <NamedIndividual IRI="#Paul"/> 
    <NamedIndividual IRI="#Amber"/> 
</ObjectPropertyAssertion> 
<ObjectPropertyDomain> 
    <ObjectProperty IRI="#isWardOf"/> 
    <Class IRI="#Ward"/> 
    </ObjectPropertyDomain> 
    <ObjectPropertyRange> 
    <ObjectProperty IRI="#isWardOf"/> 
    <Class IRI="#Gaurdian"/> 
    </ObjectPropertyRange> 
    </Ontology> > 

回答

1

這裏是我能想到的最簡單的方法。它涉及與名詞的推理,所以它可能在計算上是昂貴的。但是,如果本體不是太大,這種方法是可行的。

這個想法是獲得每個Gaurdian的所有實例。然後,每個這樣的人都可以通過isWard財產獲得所有與之相關的個人。如果這些集合的大小大於1(如果集合的大小是1,而不是隻有一個給定的Gaurdian的Ward),那麼這些集合就是你正在尋找的東西。 OWL API代碼與此類似:

// load an ontology 
OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 
OWLOntology ontology = manager.loadOntologyFromOntologyDocument(ONTOLOGY_IRI); 
OWLDataFactory df = manager.getOWLDataFactory(); 

// We need a reasoner to ask for individuals 
OWLReasoner reasoner = createReasoner(ontology); 
reasoner.precomputeInferences(InferenceType.CLASS_ASSERTIONS); 

// get all the gaurdians in the ontology 
OWLClass gaurdian = df.getOWLClass(IRI.create("#Gaurdian")); 
Set<OWLNamedIndividual> gaurdians = reasoner.getInstances(gaurdian, false).getFlattened(); 


for (OWLNamedIndividual g : gaurdians) { 
    // all wards of a given gaurdian g 
    OWLObjectProperty isWardOf = df.getOWLObjectProperty(IRI.create("#isWardOf")); 
    OWLClassExpression wardsOfG = df.getOWLObjectHasValue(isWardOf, g); 
    // get all the wards related to a given gaurdian 
    Set<OWLNamedIndividual> wards = reasoner.getInstances(wardsOfG, false).getFlattened(); 
    if (wards.size() > 1) { 
     // this set of wards is connected to the same gaurdian 
    } 
} 
+0

我已經實施了您建議的已刪除跟蹤版本。本體很大。它確實很昂貴,但因爲沒有其他建議。現在我會走這個。 – jaykio77

0
OWL的API文檔中

還有對源代碼的引用的粗糙指南教程here

一個測試的檢索斷言對一個對象屬性,你應該能夠適應你的需求:

@Test 
public void testIndividualAssertions() throws OWLException { 
    OWLOntologyManager m = create(); 
    OWLOntology o = m.createOntology(EXAMPLE_IRI); 
    // We want to state that matthew has a father who is peter. 
    OWLIndividual matthew = df.getOWLNamedIndividual(IRI.create(EXAMPLE_IRI 
      + "#matthew")); 
    OWLIndividual peter = df.getOWLNamedIndividual(IRI.create(EXAMPLE_IRI 
      + "#peter")); 
    // We need the hasFather property 
    OWLObjectProperty hasFather = df.getOWLObjectProperty(IRI 
      .create(EXAMPLE_IRI + "#hasFather")); 
    // matthew --> hasFather --> peter 
    OWLObjectPropertyAssertionAxiom assertion = df 
      .getOWLObjectPropertyAssertionAxiom(hasFather, matthew, peter); 
    // Finally, add the axiom to our ontology and save 
    AddAxiom addAxiomChange = new AddAxiom(o, assertion); 
    m.applyChange(addAxiomChange); 
    // matthew is an instance of Person 
    OWLClass personClass = df.getOWLClass(IRI.create(EXAMPLE_IRI 
      + "#Person")); 
    OWLClassAssertionAxiom ax = df.getOWLClassAssertionAxiom(personClass, 
      matthew); 
    // Add this axiom to our ontology - with a convenience method 
    m.addAxiom(o, ax); 
} 
相關問題