我正在编写一个 DCAT 查询组件,理想情况下我能够加载目录中可用的尽可能多的分布的 Jena 模型(假设它们不是相同数据的不同表示,根据我的经验他们通常不是)。
但是,如果我任意尝试加载 DCAT 文档中找到的任何 accessURL 或 downloadURL,则 Jena 中会引发异常,因为数据不是解析器的预期格式(Jena 根据 MIME 类型和文件扩展名进行猜测)。
我知道新的解析器对象可以使用 RDFParserRegistry 注册,我假设在 Model.read() 期间引用了该对象,但如果我知道解析器已注册,我只想尝试 Model.read()阅读我要检索的文档类型。但我没有看到使用 RDFParserRegistry 来做到这一点的方法。
最佳答案
所以本质上你有一些 URI,例如http://example.org/foo
在某些数据中发现您想要尝试加载有关 RDF 的更多数据,但您不知道 URI 是否以 Jena 支持的格式提供数据?
为了找出数据的可用格式,您需要向 URI 发出 HTTP GET
请求,手动传递以 RDF 为中心的 Accept
header (WebContent.defaultGraphAcceptHeader
提供 Jena 将用于请求的 header )。然后,您可以检查远程服务器返回的 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
读取模型,就像执行 model.read()
使用 URI,您将强制 Jena 再次下载内容。
由于这种方法需要您向远程资源发出 HTTP 请求,因此实际上尝试 model.read()
并 catch
可能会更有效并记录/忽略发生的错误。
关于rdf - 如何以编程方式确定是否注册了可以处理格式的 Jena 解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31666970/