我正在试验Sesame和Virtuoso Triplestores。在Moment中,我使用Sesame Java API将RDF数据添加到Triplestores。
我的RDF数据代表不同的东西,如Videodata,Userdata等。 目前我可以将视频的RDF(标题,描述,位置等)添加到Triplestore
但是如何更新商店中的RDF?
例如,如果我使用芝麻的REST接口并使用更新的RDF发出PUT请求,则首先删除商店中的所有内容。
当我使用带有更新数据的POST时(例如视频标题已更改),将同时存储标题(旧版和新版)。
您如何使用Triplestores? 也许我想念一些必要的东西。
编辑:
我现在在Virtuoso中使用Sesame中的Context和每个RDF条目。这种更新方式我可以先清除上下文并再次添加。当我为两个Triplestores使用Sesame API时(我们仍然不知道我们将使用哪一个),代码看起来完全相同。
ValueFactory f = rep.getValueFactory();
URI uri = f.createURI(urn);
con.clear(uri);
con.add(reader,this.baseURI, RDFFormat.RDFXML,uri);
感谢您的帮助
答案 0 :(得分:5)
我假设您正在使用SPARQL。如果你不这样做,那你可能应该: - )
许多三重存储支持SPARQL Update,这是一种用于修改SPARQL存储中的RDF三元组的语言。它就像SQL的INSERT
,UPDATE
,DELETE
等等。我不确定Sesame是否支持它 - SPARQL Update仍然是一个非常新的规范,甚至尚未最终确定。
要注意的另一个有用的事情是Named Graphs,特别是如果你想以RESTful方式工作。这允许在不同的图形中管理三元组,因此您可以将数据分开。例如,您可以在单独的命名图中保留关于每个视频的三元组,然后仅在PUT请求上更新该命名图。您仍然可以使用SPARQL在所有命名图上查询整个商店。我还不完全确定Sesame的REST API是否提供对命名图的访问。 (我很确定Java API会这样做;我认为他们称之为不同的东西。上下文?)
答案 1 :(得分:2)
因此,假设你拥有原始的RDF,你可以采用标题的具体例子:
:something :title "Original Title" .
你想把它改成像:
:something :title "Updated Title" .
使用Sesame的POST 只会将新信息添加到命名图表(芝麻术语中的上下文),重要 不会删除任何现有信息
在RDF术语中,这两个三元组代表不同的事实。芝麻(或任何其他三重商店)不知道第二个三重奏应该取代第一个。这与您可能习惯更新属性的传统SQL /关系模型完全不同,RDF没有正确的概念,因为您无法修改三元组。您可以添加新的三元组或删除现有的三元组。
要获得您想要的更新行为,您必须删除旧的三元组(芝麻的REST API支持HTTP DELETE),然后添加替换它的新三元组(使用当前正在执行的Sesame的POST操作)。
对于您使用的几乎所有三重商店而言,这同样适用。如果cyrgi建议您使用SPARQL Update支持商店,则可以向更新端点发出以下内容(假设您使用命名图):
DELETE DATA
{
GRAPH <http://example.org/graph> { :something :title "Original Title" . }
};
INSERT DATA
{
GRAPH <http://example.org/graph> { :something :title "Updated Title" . }
}