2

我正在编写一个 DCAT 查询组件,理想情况下,我能够加载目录中可用的尽可能多的分布的 Jena 模型(假设它们不是相同数据的不同表示,根据我的经验,它们通常是't)。

但是,如果我任意尝试加载在 DCAT 文档中找到的任何 accessURL 或 downloadURL,则会在 Jena 中引发异常,因为数据不是解析器的预期格式(Jena 基于 MIME 类型和文件扩展名猜测)。

我知道可以使用 RDFParserRegistry 注册新的解析器对象,我假设它在 Model.read() 期间被引用,但我只想尝试 Model.read() 如果我知道解析器已注册用于读取类型我要检索的文件。但我看不到使用 RDFParserRegistry 的方法。

4

1 回答 1

2

所以本质上你有一些 URI,例如http://example.org/foo在一些数据中找到,你想尝试加载更多关于 RDF 的数据,但你不知道 URI 是否以 Jena 支持的格式提供数据?

为了找出可用的数据格式,您需要GET手动向 URI 发出 HTTP 请求,传递以 RDF 为中心的Accept标头(WebContent.defaultGraphAcceptHeader提供 Jena 将用于请求的标头)。然后,您可以检查Content-Type远程服务器返回的内容。

一旦你有了这个,你可以使用它来检查解析器,如下所示:

Lang lang = RDFLanguages.contentTypeToLang(contentType);
if (lang != null) {
  // Language is known, is there an RDF parser for it?
  ReaderRIOTFactory parserFactory = RDFParserRegistry.getFactory(lang);
  if (parserFactory != null) {
    // Parser registered
    // Read your model
  }
}

请注意,您可能希望直接从InputStream您的GET请求中读取模型,就好像您只是model.read()对 URI 执行操作一样,您将强制 Jena 再次下载内容。

由于这种方法要求您无论如何都向远程资源发出 HTTP 请求,因此实际上只尝试一个model.read()不管catch并记录/忽略发生的错误可能会更有效。

于 2015-07-28T08:45:07.557 回答