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());
}
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());
}