如何通过编程确定是否注册了可以处理某种格式的Jena解析器?



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

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

我知道可以用RDFParserRegistry注册新的解析器对象,我假设在Model.read()期间引用了RDFParserRegistry,但我只想尝试Model。如果我知道解析器是为读取我要检索的文档类型而注册的,则使用read()。但我不认为使用RDFParserRegistry可以做到这一点。

所以本质上你有一些URI,例如http://example.org/foo发现在一些数据,你想尝试加载进一步的数据作为RDF,但你不知道如果URI提供的数据格式,耶拿支持?

为了找出可用的数据格式,您需要向URI手动发送HTTP GET请求,传递以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
  }
}

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

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

最新更新