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为参数的读写命令:
- 在 read() 上,我发现如果在数据文件上未声明 @base,则必须在读取命令上完成它,否则它可以设置为 null。
- 在 write() 上,base 参数是可选的,无论我是否指定 base(甚至像 null 或 URI)都没有关系,输出始终相同,@base 不出现并且所有真实 URI 都是完整 URI。
我不确定这是一个错误还是根本不可能。
首先 - 考虑使用像“:”这样的前缀 - 这与 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);
我刚开始使用 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为参数的读写命令:
- 在 read() 上,我发现如果在数据文件上未声明 @base,则必须在读取命令上完成它,否则它可以设置为 null。
- 在 write() 上,base 参数是可选的,无论我是否指定 base(甚至像 null 或 URI)都没有关系,输出始终相同,@base 不出现并且所有真实 URI 都是完整 URI。
我不确定这是一个错误还是根本不可能。
首先 - 考虑使用像“:”这样的前缀 - 这与 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);