Apache Jena - 是否可以写入输出 BASE 指令?

Apache Jena - Is it possible to write to output the BASE directive?

我刚开始使用 Jena Apache,在他们的介绍中,他们解释了如何写出创建的模型。作为输入,我使用了一个 Turtle 语法文件,其中包含一些关于某些 OWL 本体的数据,并且我使用 @base 指令在语法上使用相对 URI:

@base <https://valbuena.com/ontology-test/> .

然后将我的数据写为:

<sensor/AD590/1> a sosa:Sensor ;
    rdfs:label "AD590 #1 temperatue sensor"@en ;
    sosa:observes <room/1#Temperature> ;
    ssn:implements <MeasureRoomTempProcedure> . 

Apache Jena 能够读取该@base 指令并将相对 URI 扩展为其完整版本,但当我将其写出时,Jena 不会写入 @base 指令和相关 URI。输出显示为:

<https://valbuena.com/ontology-test/sensor/AD590/1> a sosa:Sensor ;
    rdfs:label "AD590 #1 temperatue sensor"@en ;
    sosa:observes <https://valbuena.com/ontology-test/room/1#Temperature> ;
    ssn:implements <https://valbuena.com/ontology-test/MeasureRoomTempProcedure> .  

我的代码如下:

Model m = ModelFactory.createOntologyModel();
String base = "https://valbuena.com/ontology-test/";

InputStream in = FileManager.get().open("src/main/files/example.ttl");
if (in == null) {
   System.out.println("file error");
   return;
} else {
   m.read(in, null, "TURTLE");
}

m.write(System.out, "TURTLE");

有多个以base为参数的读写命令:

我不确定这是一个错误还是根本不可能。

首先 - 考虑使用像“:”这样的前缀 - 这与 base 不同,但输出也很好。

您可以使用(Jena 的当前版本)配置基础:

RDFWriter.create()
         .source(model)
         .lang(Lang.TTL)
         .base("http://base/")
         .output(System.out); 

Jena RDF入门教程API中使用的命令似乎没有更新,他们显示了我之前显示的读取方法(FileManager),现在被RDFDataMgr取代。 FileManager 方式不适用于 "base" 指令。

经过试验,我发现基本指令适用于:

Model model = ModelFactory.createDefaultModel();
RDFDataMgr.read(model,"src/main/files/example.ttl");
model.write(System.out, "TURTLE", base);

Model model = ModelFactory.createDefaultModel();
model.read("src/main/files/example.ttl");
model.write(System.out, "TURTLE", base);

虽然 model.write() 命令据说是 RDF output documentation (whereas model.read() is considered common on RDF input documentation 上的遗留命令,但不明白为什么),它是我发现的唯一允许 "base"参数(需要再次将 @base 指令放在输出上),RDFDataMgr 写入方法不包含它。

感谢@AndyS 提供了一种更简单的读取数据的方法,从而解决了问题。

@AndyS 的回答允许我将相对 URI 写入文件,但不包括用于 RDFXML 变体的基础。要正确添加 xml 基本指令,我必须使用以下

RDFDataMgr.read(graph, is, Lang.RDFXML);    
Map<String, Object> properties = new HashMap<>();
properties.put("xmlbase", "http://example#");
Context cxt = new Context();
cxt.set(SysRIOT.sysRdfWriterProperties, properties);
RDFWriter.create().source(graph).format(RDFFormat.RDFXML_PLAIN).base("http://example#").context(cxt).output(os);