Java 使用OWLAPI获取本体中两个对象的属性值交集
我对OWLAPI还不熟悉,并尝试尝试使用它。我在protege中创建了一个简单的本体,在eclipse中使用OWLAPI创建了一个交互应用程序。本体结构如下:-Java 使用OWLAPI获取本体中两个对象的属性值交集,java,owl,ontology,owl-api,Java,Owl,Ontology,Owl Api,我对OWLAPI还不熟悉,并尝试尝试使用它。我在protege中创建了一个简单的本体,在eclipse中使用OWLAPI创建了一个交互应用程序。本体结构如下:- ---------------------------------------------------------------------------------------- Class Object (Data Property)StringValue ObjectProperty
----------------------------------------------------------------------------------------
Class Object (Data Property)StringValue ObjectProperty relatedTo
----------------------------------------------------------------------------------------
WordString WS1 "One" DS1
WS2 "Two" DS2
WS3 "Three" DS3
DigiString DS1 "1"
DS2 "2"
DS3 "3"
----------------------------------------------------------------------------
<rdf:RDF xmlns="http://localhost:3030/DigiWord.owl#"
xml:base="http://localhost:3030/DigiWord.owl"
xmlns:DigiWord="http://localhost:3030/DigiWord.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#">
<owl:Ontology rdf:about="http://localhost:3030/DigiWord.owl"/>
<!--
// Object Properties
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://localhost:3030/DigiWord.owl#relatedTo -->
<owl:ObjectProperty rdf:about="&DigiWord;relatedTo">
<rdfs:domain rdf:resource="&DigiWord;DigiString"/>
<rdfs:range rdf:resource="&DigiWord;WordString"/>
</owl:ObjectProperty>
<!--
//
// Data properties
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://localhost:3030/DigiWord.owl#stringValue -->
<owl:DatatypeProperty rdf:about="&DigiWord;stringValue">
<rdfs:domain rdf:resource="&DigiWord;DigiString"/>
<rdfs:domain rdf:resource="&DigiWord;WordString"/>
<rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>
<!--
// Classes
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://localhost:3030/DigiWord.owl#DigiString -->
<owl:Class rdf:about="&DigiWord;DigiString"/>
<!-- http://localhost:3030/DigiWord.owl#WordString -->
<owl:Class rdf:about="&DigiWord;WordString"/>
<!--
// Individuals
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://localhost:3030/DigiWord.owl#DS1 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS1">
<rdf:type rdf:resource="&DigiWord;DigiString"/>
<stringValue rdf:datatype="&xsd;string">1</stringValue>
<relatedTo rdf:resource="&DigiWord;WS1"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#DS2 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS2">
<rdf:type rdf:resource="&DigiWord;DigiString"/>
<stringValue rdf:datatype="&xsd;string">2</stringValue>
<relatedTo rdf:resource="&DigiWord;WS2"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#DS3 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS3">
<rdf:type rdf:resource="&DigiWord;DigiString"/>
<stringValue rdf:datatype="&xsd;string"></stringValue>
<relatedTo rdf:resource="&DigiWord;WS3"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS1 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS1">
<rdf:type rdf:resource="&DigiWord;WordString"/>
<stringValue rdf:datatype="&xsd;string">One</stringValue>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS2 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS2">
<rdf:type rdf:resource="&DigiWord;WordString"/>
<stringValue rdf:datatype="&xsd;string">Two</stringValue>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS3 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS3">
<rdf:type rdf:resource="&DigiWord;WordString"/>
<stringValue rdf:datatype="&xsd;string">Three</stringValue>
</owl:NamedIndividual>
</rdf:RDF>
完整的本体如下所示:-
----------------------------------------------------------------------------------------
Class Object (Data Property)StringValue ObjectProperty relatedTo
----------------------------------------------------------------------------------------
WordString WS1 "One" DS1
WS2 "Two" DS2
WS3 "Three" DS3
DigiString DS1 "1"
DS2 "2"
DS3 "3"
----------------------------------------------------------------------------
<rdf:RDF xmlns="http://localhost:3030/DigiWord.owl#"
xml:base="http://localhost:3030/DigiWord.owl"
xmlns:DigiWord="http://localhost:3030/DigiWord.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#">
<owl:Ontology rdf:about="http://localhost:3030/DigiWord.owl"/>
<!--
// Object Properties
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://localhost:3030/DigiWord.owl#relatedTo -->
<owl:ObjectProperty rdf:about="&DigiWord;relatedTo">
<rdfs:domain rdf:resource="&DigiWord;DigiString"/>
<rdfs:range rdf:resource="&DigiWord;WordString"/>
</owl:ObjectProperty>
<!--
//
// Data properties
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://localhost:3030/DigiWord.owl#stringValue -->
<owl:DatatypeProperty rdf:about="&DigiWord;stringValue">
<rdfs:domain rdf:resource="&DigiWord;DigiString"/>
<rdfs:domain rdf:resource="&DigiWord;WordString"/>
<rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>
<!--
// Classes
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://localhost:3030/DigiWord.owl#DigiString -->
<owl:Class rdf:about="&DigiWord;DigiString"/>
<!-- http://localhost:3030/DigiWord.owl#WordString -->
<owl:Class rdf:about="&DigiWord;WordString"/>
<!--
// Individuals
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://localhost:3030/DigiWord.owl#DS1 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS1">
<rdf:type rdf:resource="&DigiWord;DigiString"/>
<stringValue rdf:datatype="&xsd;string">1</stringValue>
<relatedTo rdf:resource="&DigiWord;WS1"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#DS2 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS2">
<rdf:type rdf:resource="&DigiWord;DigiString"/>
<stringValue rdf:datatype="&xsd;string">2</stringValue>
<relatedTo rdf:resource="&DigiWord;WS2"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#DS3 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS3">
<rdf:type rdf:resource="&DigiWord;DigiString"/>
<stringValue rdf:datatype="&xsd;string"></stringValue>
<relatedTo rdf:resource="&DigiWord;WS3"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS1 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS1">
<rdf:type rdf:resource="&DigiWord;WordString"/>
<stringValue rdf:datatype="&xsd;string">One</stringValue>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS2 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS2">
<rdf:type rdf:resource="&DigiWord;WordString"/>
<stringValue rdf:datatype="&xsd;string">Two</stringValue>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS3 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS3">
<rdf:type rdf:resource="&DigiWord;WordString"/>
<stringValue rdf:datatype="&xsd;string">Three</stringValue>
</owl:NamedIndividual>
</rdf:RDF>
1.
2.
一个
两个
三
我想为DS1检索对象WS1,为DS2检索对象WS2,即在提供字符串“1”、“2”等时,我的代码应该分别检索“1”、“2”。我还没有在网上遇到过这种类型的相关代码。如有任何帮助,将不胜感激。提前感谢。以下示例(OWLAPI 4)应该会有所帮助:
OWLOntology o = ... your ontology here
String ns = "http://localhost:3030/DigiWord.owl#";
OWLDataFactory df = o.getOWLOntologyManager().getOWLDataFactory();
OWLObjectProperty relatedto = df.getOWLObjectProperty(IRI.create(ns + "relatedTo"));
OWLDataProperty stringValue = df.getOWLDataProperty(IRI.create(ns + "stringValue"));
SimpleRenderer renderer = new SimpleRenderer();
for (OWLNamedIndividual i : o.getIndividualsInSignature()) {
for (OWLLiteral lit : EntitySearcher.getDataPropertyValues(i, stringValue, o)) {
System.out.println(i + " has values " + renderer.render(lit));
}
for (OWLIndividual related : EntitySearcher.getObjectPropertyValues(i, relatedto, o)) {
for (OWLLiteral lit : EntitySearcher.getDataPropertyValues(related, stringValue, o)) {
System.out.println(i + " related to " + related + " which has values " + renderer.render(lit));
}
}
}
编辑:要查找查询的匹配项,请执行以下操作:
for (OWLNamedIndividual i : o.getIndividualsInSignature()) {
for (OWLIndividual related : EntitySearcher.getObjectPropertyValues(i, relatedto, o)) {
for (OWLLiteral lit : EntitySearcher.getDataPropertyValues(related, stringValue, o)) {
if(lit.getLexicalForm().equals("1")){
for (OWLLiteral lit : EntitySearcher.getDataPropertyValues(i, stringValue, o)) {
System.out.println(i + " has values " + renderer.render(lit));
}
}
}
}
}
你的本体是什么样子还不是很清楚。你能在曼彻斯特或函数语法中添加公理吗?@mikrohelen先生,我已经放置了完整的本体论。谢谢,每样东西都印出来了。我的问题是访问单个类。例如,如果我从控制台输入“1”。应用程序应打印“一”。这意味着首先访问DS1,因为其字符串值为1,然后检索WS1,因为DS1与WS1相关,最后将打印“一”。请帮助这一点,因为没有与文档和谷歌运气。非常感谢。您需要的是将文字的值与个人匹配。我的意思是,在我的示例中,您需要找到
I
,其中lit的词法形式为“1”,并获取该个体的其他stringValue值