我有一个 rdf 文件,其格式为:
<rdf:RDF
xmlns:geo="xyz"
xmlns:quality="xyz"
xmlns:purl="xyz"
xmlns:swrlb="xyz">
<rdf:Description rdf:about="title1">
<rdf:type rdf:resource="resource22"/>
<info:contains>fromdisk1</info:contains>
<info:has_text_value>
The location
</info:has_text_value>
</rdf:Description>
<rdf:Description rdf:about="title2">
<rdf:type rdf:resource="resource12"/>
<info:contains>fromdisk2</info:contains>
<info:has_text_value>
xyz
</info:has_text_value>
</rdf:Description>
</rdf:RDF>
我想存储 info:has_text_value 和对应的 info:contains 的值。我用 JENA API 尝试了很多方法,但都没有成功。你能指导我怎么做吗?任何源代码都会有很大帮助。谢谢
最佳答案
如果这是您的 RDF 的代表性样本,那么它有几个问题:
您不应该断言所有前缀都是
xyz
。当您使用缩短的名称(例如info:contains
或geo:something
)时,用于标识资源的实际 URI 是串联命名空间 URI 和本地名称。如果使用得当, namespace URI 可以消除类似命名概念的歧义,例如computers:monitor
和reptiles:monitor
可能旨在表示显示屏和蜥蜴,分别。但是,如果computers
和reptiles
命名空间具有相同的值,则两个 URI 表示相同的资源,并且关于一个资源的每个声明也都是关于另一个资源的。这不是个好主意。您的示例不完整,因为未定义
<info
命名空间,因此info:contains
不表示合法属性 URI。资源
title2
有一个相对 URI,即它表示的是相对于文档的基本 URI。这意味着,例如,如果您从不同的位置(例如在磁盘上或从http:
URL)读取包含文档的文件,title2
的标识 < em>会改变。您可以通过添加xml:base
语句断言文档的基本 URI 来减轻这种影响。
解决这些问题(并猜测您的命名空间),得到:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:geo="http://example.org/schema/geo#"
xmlns:quality="http://example.org/schema/quality#"
xmlns:purl="http://example.org/schema/purl#"
xmlns:swrlb="http://example.org/schema/swrlb#"
xmlns:info="http://example.org/schema/info#"
xml:base="http://example.org/data/test#"
>
<rdf:Description rdf:about="title1">
<rdf:type rdf:resource="resource22"/>
<info:contains>fromdisk1</info:contains>
<info:has_text_value>The location</info:has_text_value>
</rdf:Description>
<rdf:Description rdf:about="title2">
<rdf:type rdf:resource="resource12"/>
<info:contains>fromdisk2</info:contains>
<info:has_text_value>xyz</info:has_text_value>
</rdf:Description>
</rdf:RDF>
有很多在线资源可以向您展示如何在 Jena 中读取和操作 RDF 数据。为了帮助您开始,这里是一种方法:
首先创建一个Model
并将您的数据加载到其中。我假设您的数据在文件 ./rdf/test.rdf
中:
Model m = FileManager.get().loadModel( "./rdf/test.rdf" );
现在创建一个表示 title2
的资源:
String NS = "http://example.org/data/test#";
Resource title2 = m.getResource( NS + "title2" );
现在列出资源的属性:
for (StmtIterator i = title2.listProperties(); i.hasNext(); ) {
Statement s = i.next();
System.out.println( "title2 has property " + s.getPredicate() +
" with value " + s.getObject() );
}
或者,创建一个属性对象来访问 info:contains
属性:
Property contains = m.getProperty( NS + "contains" );
System.out.println( "title2.contains = " + title2.getProperty( contains )
.getObject();
关于java - Jena Java Api 读取 RDF 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460180/