是否可以将项目动态添加到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)
提前致谢
最佳答案
没有看到所有代码以及某些值是什么,我们无法确定正在发生什么,但是我认为这里的问题是您不能将RDFList#add与空列表一起使用,而我想这就是您的意思在开始创建。由于创建的列表中没有元素,因此应该返回rdf:nil,这是空列表。请注意,RDFList#add的文档说:
如果此列表为空(零)列表,则在不违反此节点不变的情况下,如果不将此节点的URI(从rdf:nil更改为新列表单元的空白节点),则无法执行副作用更新。因此,如果尝试将其添加到nil列表,则此更新操作将引发异常。添加到空列表的安全方法包括with(RDFNode)和cons(RDFNode)。
您没有提到您是否正在获得该例外。
对于您的情况,我认为最简单的方法是创建OntClasses数组,然后根据它们创建列表。也就是说,您可以执行以下操作(未测试):
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上有所挣扎的人。