是否可以动态地向Jena的RDFList添加项目? 类似的东西:
RDFList list = model.createList(new RDFNode[] {});
//string with names of rdf classes
String[] parts = list.split("-");
for(int i = 0; i<parts.length; i++){
OntClass oclass = model.getOntClass("http://example.org/"+parts[i]);
list.add(oclass);
}
我得到了
com.hp.hpl.jena.rdf.model.EmptyListUpdateException: Attempt to add() to the empty list (rdf:nil)
提前致谢
答案 0 :(得分:1)
如果没有看到您的所有代码以及某些值,我们无法确定发生了什么,但我认为这里的问题是您无法使用RDFList #add使用空列表,我认为这是您在开始时创建的内容。由于您正在创建一个没有元素的列表,因此您应该返回 rdf:nil ,这是空列表。请注意RDFList#add的文档说:
如果此列表为空(零)列表,则在不违反Jena的情况下,我们无法在不更改此节点的URI(从rdf:nil)到新列表单元格的空白节点的情况下执行副作用更新不变的。因此,如果尝试添加到nil列表,则此更新操作将引发异常。添加到空列表的安全方式包括with(RDFNode)和cons(RDFNode)。
你没有提到你是否得到了这个例外。
在您的情况下,我认为最简单的方法是创建 OntClass es数组,然后从中创建列表。也就是说,你可以做一些像(未经测试的):
String[] parts = list.split("-");
RDFNode[] elements = new RDFNode[parts.length];
for(int i = 0; i<parts.length; i++){
elements[i] = model.getOntClass("http://example.org/"+parts[i]);
}
RDFList list = model.createList(elements);
或者,如果您想使用和,如文档中所述,您可以执行类似的操作(再次,未经测试):
RDFList list = model.createList(new RDFNode[] {});
//string with names of rdf classes
String[] parts = list.split("-");
for(int i = 0; i<parts.length; i++){
OntClass oclass = model.getOntClass("http://example.org/"+parts[i]);
list = list.with(oclass);
}
有关此问题的更多信息,您可能会发现我的this answer及其相关评论。你不是第一个与RDFLists有过一点斗争的人。