我一直试图使用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。
答案 0 :(得分:5)
简单回答:
inMemModel.removeAll(null, RDF.value, ResourceFactory.createPlainLiteral("class"));
这将删除谓词为rdf:value
且对象为"class"
的所有三元组。
内部 - 在您尝试的SPI级别 - 您可以使用inMemModel.remove(Node.ANY, nodePredicate, nodeObject)
,查找和删除(使用delete
)匹配的三元组。 delete
占据了三倍,因此没有找到。
createAnon()
不起作用只是因为它是一个不同的主题,所以没有什么可以删除。