我正在编写一个DCAT查询组件,理想情况下,我能够加载一个Jena模型,目录中有多个发行版(假设它们不是同一数据的不同表示形式) ,根据我的经验,他们通常不是。
但是如果我随意尝试加载在DCAT文档中找到的任何accessURL或downloadURL,Jena会抛出异常,因为数据不是解析器的预期格式(Jena根据MIME类型和文件扩展名猜测)。
我知道可以在RDFParserRegistry中注册新的解析器对象,我假设它是在Model.read()期间引用的,但是如果我知道解析器是,那么我只想尝试Model.read()已注册阅读我要检索的文件类型。但是我没有看到使用RDFParserRegistry做到这一点的方法。
答案 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>