【发布时间】:2011-08-14 11:45:47
【问题描述】:
我正在使用耶拿。我想知道是否有一种方法可以修改或删除实例的属性值?
谢谢
【问题讨论】:
我正在使用耶拿。我想知道是否有一种方法可以修改或删除实例的属性值?
谢谢
【问题讨论】:
Jena 中的语句在设计上是不可变的。要更改某个主题s 的属性p 的值,您需要添加一个主谓相同的新语句,并删除旧语句。这在耶拿总是如此,即使 API 有时会向您隐藏这一点。例如,OntResource 及其子类有多种 setProperty 变体,但在底层它们执行相同的添加新三重和删除旧过程。
【讨论】:
这取决于您使用的 Jena API。例如,如果您使用 Jena 3.0 和 Model API,您可以使用 Model.remove(Statement) 通过为语句选择适当的主题/谓词/对象来删除属性。可以通过删除旧版本的 Statement 并添加新版本来实现修改。
【讨论】:
java.util.ConcurrentModificationException,我使用jena 3.1
要仅删除语句本身,即实例和属性值之间的关系,您可以使用: OntResource.removeProperty(Property, RDFNode)
如果您想完全删除属性值,即值及其所有关系,您可以使用:OntResource.remove()
【讨论】:
我有类似的任务:我需要删除具有指定值的属性。希望以下代码 sn-p 对某人有所帮助。
public void removeLabel(String language, String value) {
NodeIterator nodeIterator = resource.getModel().listObjectsOfProperty(RDFS.label);
RDFNode foundToDelete = null;
while (nodeIterator.hasNext()) {
RDFNode next = nodeIterator.next();
boolean langsAreIdentical = next.asLiteral().getLanguage().equals(language);
boolean valuesAreIdentical = next.asLiteral().getLexicalForm().equals(value);
if (langsAreIdentical && valuesAreIdentical) {
foundToDelete = next;
break;
}
}
resource.getModel().remove(resource, RDFS.label, foundToDelete);
}
【讨论】: