【问题标题】:Jena Java Api to read RDF file?Jena Java Api 读取 RDF 文件?
【发布时间】:2011-06-23 20:24:40
【问题描述】:

我有一个 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 尝试了很多方法,但都没有成功。您能否指导我如何做到这一点。任何源代码都会有很大帮助。谢谢

【问题讨论】:

  • 有很多关于如何使用 JENA here 编写、读取和查询 RDF 的示例。

标签: java rdf jena


【解决方案1】:

如果这是您的 RDF 的代表性样本,那么它存在几个问题:

  • 不应该断言所有前缀都是xyz。当您使用缩短的名称(例如 info:containsgeo:something)时,用于标识资源的实际 URI 是名称空间 URI 和本地名称的串联。如果使用得当,命名空间 URI 可以消除类似命名概念的歧义,例如 computers:monitorreptiles:monitor 可能分别用于表示显示屏和蜥蜴。但是,如果computersreptiles 命名空间都具有相同的值,那么这两个URI 都表示相同的资源,并且关于一个资源的每一条语句也都是关于另一个资源的。不是个好主意。

  • 您的示例不完整,因为未定义 info 命名空间,因此 info:contains 不表示合法的属性 URI。

  • 资源title2 有一个相对URI,即它表示的是相对于文档的基本URI。这意味着,例如,如果您从不同的位置(例如,在磁盘上或从http: URL)读取包含文档的文件,title2 的身份将改变。您可以通过添加 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();

【讨论】:

  • 我为 xyz 感到抱歉,但由于数据的性质,我不得不将它们从读取 rdf 更改。另外,先生,标题 1 和 2 已更改,在实际数据中,它们是我以前无法知道的网址。有没有办法获取这些 uri 的列表?
  • 如果我对您的理解正确,您不会事先知道要检查的资源的 URI。大概这些资源将具有一些您将用来识别它们的特征。您如何知道要处理哪些资源?你能举一个更现实的例子吗?
  • 你能给我发电子邮件至 mbansal2@buffalo.edu。我会给你发一份真正的 rdf 文件的副本。这件事对我来说真的很重要,所以如果你能帮助你,你会帮我一个大忙。如果你不想给我发邮件,你可以告诉我,我会在这里发布 rdf(虽然不是首选,但由于材料的性质)。
  • 我尝试将整个 rdf 文件添加为注释,但由于文件中的字符数,stackoverflow 甚至不允许我加入其中的一部分。我可以通过其他方式获取文件吗,或者您可以通过电子邮件将您的电子邮件地址发送给我,我将发送文件,或者您可以告诉我其他地方可以将其发布给您。我真的需要你的指导。谢谢
  • 我的电子邮件地址列在我的 StackOverflow 个人资料页面上。如果你把文件发给我,我会看的,但可能要到星期一,因为我星期天整天都在外面。
猜你喜欢
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
相关资源
最近更新 更多