Jena 相对 URI 基础

Jena relative URI base

Reading RDF in Apache Jena 指出,

A resource name with no URI scheme is assumed to be a local file name.

可以通过为 RDFDataMgr 的各种 read 方法提供基本 URI 来覆盖此假设。但是有没有办法将相对 URI 视为错误,即如果在给定的 RDF 文档中遇到相对 URI,则抛出异常?

问题与 Jena adds path/url to URIs 类似,但在我的例子中,相对 URI 表示错误情况。

是的,可以覆盖 URI 解析行为。从而允许您替换拒绝相对 URI 的解析器。我们在基于 Apache Jena 构建的生产软件中使用它。

我们的代码不适用于您感兴趣的代码路径,因为我们在 SPARQL 解析中使用它,这与解析不同 API,而且我无法共享专有代码。不过我觉得你想做的是完全可以实现的。

Jena 的最新版本引入了 RDFParserBuilder class,它提供了构建解析器并详细控制解析器行为的功能。将数据中的术语转换为 Jena Node 对象由可以在解析器构建器上设置的 FactoryRDF 接口处理。所以你应该能够覆盖它来实现你的逻辑来拒绝相对 URI。

A resource name with no URI scheme is assumed to be a local file name.

扩展该文档:这意味着

RDFDataMgr.read(Model, "mydata.ttl", ...)

将读取文件 "mydata.ttl"

基本 URI 参数适用于解析数据的过程,而不适用于选择要读取的数据。等效地,资源查找的基本 URI 是进程的当前工作目录。

这是@RobV 使用 FactoryRDF.

实现的答案
static final String BASE = "null://null/";
static final FactoryRDF FACTORY = new FactoryRDFStd() {
    @Override
    public Node createURI(String uriStr) {
        if (uriStr.startsWith(BASE))
            throw new IllegalArgumentException("URI is not absolute: " + uriStr.substring(BASE.length()));
        return super.createURI(uriStr);
    }
};

public static void main(String... args) {
    Model output = ModelFactory.createDefaultModel();
    RDFParser.create()
             .fromString("<foo> <bar> <baz> .")
             .lang(Lang.TURTLE)
             .base(BASE)
             .factory(FACTORY)
             .parse(output.getGraph());
}