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

时间:2015-07-28 03:39:56

标签: rdf semantic-web apache-jena

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

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

我知道可以在RDFParserRegistry中注册新的解析器对象,我假设它是在Model.read()期间引用的,但是如果我知道解析器是,那么我只想尝试Model.read()已注册阅读我要检索的文件类型。但是我没有看到使用RDFParserRegistry做到这一点的方法。

1 个答案:

答案 0 :(得分:2)

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

为了找出数据可用的格式,您需要向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
  }
}

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

由于这种方法要求您向远程资源发出HTTP请求,因此无论是model.read()还是catch尝试- - - - 实际上更有效,并记录/忽略发生的错误。< / p>