我刚刚开始使用Jena Apache,在他们的介绍中他们解释了如何写出创建的模型。作为输入,我使用包含一些OWL本体的一些数据的Turtle语法文件,并且我使用@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");
有多个读取和写入命令作为参数作为基础:
我不确定这是不是错误,也不确定。
答案 0 :(得分:1)
首先 - 考虑使用类似“:”的前缀 - 这与base不同,但也使输出更好。
您可以使用(当前版本的Jena)配置基础:
RDFWriter.create()
.source(model)
.lang(Lang.TTL)
.base("http://base/")
.output(System.out);
答案 1 :(得分:0)
似乎Jena RDF API的介绍教程中使用的命令没有更新,它们显示我之前显示的读取方法(FileManager),现在由RDFDataMgr替换。 FileManager方式不适用于&#34; base&#34;指示好。
经过实验,我发现基本指令适用于:
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上被认为是遗留的(而RDF input documentation上的model.read()被认为是常见的,但是不明白为什么),它是我发现的唯一一个允许&#34; base&#34;参数(需要将@base指令再次放在输出上),RDFDataMgr写入方法不包含它。
感谢@AndyS提供了一种更简单的方法来读取数据,从而解决了这个问题。
答案 2 :(得分:0)
@AndyS的答案允许我将相对URI写入文件,但不包括用于RDFXML变体的基础。为了正确添加xml base指令,我必须使用以下
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);