我正在编写一个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
并记录/忽略发生的错误更有效。