我一直试图使用Jena从模型中删除一个三元组,但没有成功。当主题、谓词和对象是URI或文字时,一切都很好,但对于匿名节点来说,这似乎不起作用。例如,在一个模型中考虑这个三元组:
_:A68d23cacX3aX13f793fa898X3aXX2dX7ffd <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "class" .
我想删除它使用:
Node nodeSubject = Node.createAnon(); //or Node.ANY
Node nodePredicate = Node.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#value");
Node nodeObject = Node.createLiteral("class");
Triple triple = Triple.create(nodeSubject, nodePredicate, nodeObject);
inMemModel.getGraph().delete(triple);
无论使用createAnon
还是Node.ANY
,我都无法删除三元组。我不想使用AnonId,因为如果我在另一台机器上运行代码,我怀疑是否会生成相同的匿名id。
简单答案:
inMemModel.removeAll(null, RDF.value, ResourceFactory.createPlainLiteral("class"));
这将删除谓词为rdf:value
、对象为"class"
的所有三元组。
在内部——在您尝试的SPI级别——您可以使用inMemModel.remove(Node.ANY, nodePredicate, nodeObject)
,它可以查找和删除(使用delete
)匹配的三元组。delete
取地三元组,因此不进行查找。
createAnon()
之所以不起作用,仅仅是因为它是一个不同的主题,所以没有什么可删除的。