我有一个OWL文件,其示例代码如下所示。
<owl:NamedIndividual rdf:ID="001">
<rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">some literal 1</rdfs:label>
<has_legislative_reference rdf:resource="#002"/>
<has_legislative_reference rdf:resource="#003"/>
<has_legislative_reference rdf:resource="#004"/>
<has_name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">some literal 2</has_name>
<has_name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">some literal 3</has_name>
<rdf:type rdf:resource="#some_class"/>
<has_englishkeywords>
<owl:NamedIndividual rdf:ID="005">
<rdf:type rdf:resource="#006"/>
<rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">some literal 4</rdfs:label>
</owl:NamedIndividual>
</has_englishkeywords>
</owl:NamedIndividual>
现在,我已经能够获取每个语句的第一级可用的所有文字,即some literal 1
,some literal 2
和some literal 3
。但是我对如何获取some literal 4
感到茫然。
PS:对于与主OWL命名空间处于同一级别的所有情况,我使用下面给出的方法,然后迭代每个NamedIndividuals
。
ResIterator namedIndividuals = m.listResourcesWithProperty(RDF.type, OWL.NamedIndividual);
OWL.NamedIndividual
定义为:
AnnotationProperty NamedIndividual = m_model.createAnnotationProperty("http://www.w3.org/2002/07/owl#NamedIndividual");
现在对于嵌套对象,我是否需要创建一个临时命名空间来读取嵌套文字?如果有,怎么样?或者还有其他有效的方法来做同样的事情吗?任何指导都表示赞赏。
答案 0 :(得分:2)
这是OWL本体的RDF映射的RDF / XML序列化。您可以将其查询为RDF,在这种情况下,您可能希望使用RDF API(如Jena)或SPARQL查询(您也可以使用Jena)。或者,您可以使用基于OWL的API并查找您感兴趣的特定类型的公理.Jena的OntModel API提供了一些OWL支持,这对您来说可能已经足够了。
在这种情况下,您的数据不包含&#34;嵌套属性&#34;,而是个人(001),其他人(005)作为其值has_englishkeywords属性,该个人的值为rdfs:label属性(某些为literal4)。
您所说的&#34; OWL名称空间&#34;和#34;嵌套命名空间&#34;没有意义。 RDF是基于图表的表示。存在按属性(URI)链接到其他(URI,空节点和文字)的资源(URI和空白节点)。在这种情况下,如果您只是想从某个起点找到可以访问的文字,那么使用SPARQL查询可能最容易:
prefix : <urn:ex:>
select ?literal {
values ?start { <http://example.org/001> } #-- value of ?start
?start (:|!:)* ?literal #-- property path with wildcard
filter isLiteral(?literal) #-- make sure ?literal is a literal
}
在使用Jena运行SPARQL查询的其他问题和答案中,有很多例子,以及属性路径,通配符等。