【问题标题】:URI of an RDF resource in Jena modelJena 模型中 RDF 资源的 URI
【发布时间】:2014-03-26 10:03:37
【问题描述】:

当我在模型中创建资源并打印 URI 时,我得到了正确的命名空间。例如,URI 是

http://www.somesite1.com/rdfdump/resources/resourceid-1

但是,当我将资源导出到 RDF file (link to the file) 并导入它时,我得到的资源 URI 指向磁盘中文件的物理位置,例如

file:///D:/somefolder/resources/resourceid-1

我将com.hp.hpl.jena.rdf.model.Modelcom.hp.hpl.jena.ontology.OntModel 结合使用。 RDF 模型存储资源,我使用OntModel 定义了一个本体。按以下方式初始化它们。

com.hp.hpl.jena.rdf.model.Model model = ModelFactory.createDefaultModel();

OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM, model);

NS = "http://www.somesite2.com/ontology"
BASE_URL = "http://www.somesite1.com/rdfdump/"
OntClass ocResource = ontModel.createClass(NS + "#RESOURCE");

//read an RDF file into the model
RDFDataMgr.read(model, file.toURI().toString());

这就是我创建资源的方式。

String uri = BASE_URL + "resources/resourceid-1";
com.hp.hpl.jena.rdf.model.Resource rdfResource = model.createResource(uri, ocResource );

您能否指出我哪里出错了,为什么我在导入文件时没有得到正确的 URI?

我注意到的一件事是,如果 Jena RDF 模型和 OntModel 的基本 URL 相同,即 http://www.somesite.com/...,那么我无法使用

检索模型中的资源
ocResource.listInstances()

尽管有资源,但它给了我 0 资源。

【问题讨论】:

  • 将模型写入磁盘的代码在哪里?另外,请在问题中显示(至少一个样本)输出;我们需要查看here的数据才能使问题有意义。

标签: java uri rdf jena ontology


【解决方案1】:

您的 RDF/XML 文档没有指定 xml:base,而是使用相对 URI:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://www.someaddress2.com/ontology#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" >
  <!-- … -->
  <rdf:Description rdf:nodeID="A1">
    <!-- "tag/tag/…" is relative -->
    <rdf:_1 rdf:resource="tag/tag/rs_tagapplication-guid-5CCC6F83F6DDEE9DC69390E3767DEA4BD8BD4DCD4E9F3570A67E8F7455785C51"/>
    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag"/>
  </rdf:Description>
  <!-- … -->
</rdf:RDF>

文档中没有 xml:base,因此相对 URI 显然是针对 从中读取模型的文件的路径。要么 (i) 在文档中仅使用绝对 URI,要么 (ii) 在文档中明确指定基址,要么 (iii) 使用带有 base 参数的读取方法之一,例如 read(model,uri,base,hintLang)

虽然你提到你这样做:

String uri = BASE_URL + "resources/resourceid-1";
Resource rdfResource = model.createResource(uri, ocResource );

我希望某处您遗漏了BASE_URL 前缀(毕竟,您还没有向我们展示您的所有代码)并做了类似的事情:

String uri = "resources/resourceid-1";
Resource rdfResource = model.createResource(uri, ocResource );

【讨论】:

  • 非常感谢!我错误地编写了我的模型writer.write(this.model, out, BASE_URL);,并且文档说如果提到基本uri,它就与路径相关。但是基本 uri 从未写入模型中,或者至少在检索资源时没有考虑到它。
  • 你知道为什么 OntModel 和 RDF Model 需要有不同的基础 URI 吗?否则它不起作用。
  • @user592748 我认为向 writer 函数提供基本 URI 的目的是制作相对 URI,以便您以后可以提供(可能不同的)基本 URI。虽然这样做是合法的,但通常更方便的是忽略您可以拥有基本 URI 的事实,并在任何地方简单地使用绝对 URI。
  • @user592748 我不确定你的意思是“否则它不起作用”;这个问题中没有任何内容描述该问题。如果你可以重现它,这是一个不同的问题,应该问一个新问题。模型没有基础 URI;一些 RDF 图的序列化(例如,RDF/XML、Turtle)可以。这是序列化的属性,而不是模型的属性。鉴于此,我不确定您遇到了什么问题。另外,我不太清楚您为什么使用(普通)模型 OntModel。我认为您需要在一个新问题中更多地描述您的设置。
猜你喜欢
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
相关资源
最近更新 更多