在三元组存储中更新RDF

9
我正在尝试使用Sesame和Virtuoso三元存储。目前,我使用Sesame Java API将RDF数据添加到两个三元存储中。
我的RDF数据表示不同的事物,如视频数据、用户数据等。目前,我可以将视频的RDF(标题、描述、位置等)添加到三元存储中。
但是我该如何更新存储中的RDF?
例如,如果我使用sesame的REST接口,并使用更新后的RDF进行PUT请求,则会首先删除存储中的所有内容。
当我使用更新后的数据(例如视频标题已更改)进行POST时,旧标题和新标题都被存储。
你是如何使用三元存储的?也许我漏掉了一些重要的东西。
编辑:
我现在在Sesame中使用Context,在Virtuoso中使用Graphs来管理每个RDF条目。这样,对于更新,我可以首先清除上下文,然后再次添加它。由于我对两个三元存储都使用Sesame API(我们仍然不知道要使用哪个),因此代码看起来完全相同。
ValueFactory f = rep.getValueFactory();
URI uri = f.createURI(urn);
con.clear(uri);
con.add(reader,this.baseURI, RDFFormat.RDFXML,uri);

感谢您的帮助。

请注意,Virtuoso Sesame提供程序文档提供了有关将RDF数据添加到四元存储中的示例:http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSesame2Provider - hwilliams
@hwilliams。是的,我用过那个。但我还不知道如何使用API更新存储中的RDF。 - mjspier
Virtuoso具有SPARUL“修改”操作,其中嵌入了删除和插入操作,执行与SQL更新操作等效的操作,详见http://docs.openlinksw.com/virtuoso/sparqlextensions.html#rdfsparulexamples13。 - hwilliams
2个回答

5

我假设你正在使用SPARQL。如果不是的话,那么你可能应该开始使用它了 :-)

许多三元组存储支持SPARQL Update,这是一种用于修改SPARQL存储中的RDF三元组的语言。它类似于SQL的INSERTUPDATEDELETE等命令。我不确定Sesame是否已经支持它——SPARQL Update仍然是一个非常新的规范,甚至还没有最终确定。

另一个需要注意的有用工具,特别是如果你想以RESTful方式工作,就是命名图。这样可以管理不同图中的三元组,因此可以将数据分开存储。例如,你可以将每个视频的三元组保存在一个单独的命名图中,然后在PUT请求中仅更新该命名图。但是你仍然可以使用SPARQL查询跨所有命名图的整个存储。同样,我并不确定Sesame的REST API是否提供对命名图的访问。(我相当确定Java API提供了这个功能;不过他们可能称其为其他名称,比如“上下文”?)


谢谢你的回答。我还在思考什么是最好的方法。无论如何,我以后必须使用SPARQL。所以我会尝试一下。 - mjspier
是的,Sesame调用命名图形上下文。 - RobV
再次感谢您的回答。我不知道我可以为每个RDF条目使用上下文或图形。这非常有用。 - mjspier

2

因此,以您的具体标题为例,假设您有以下原始RDF:

:something :title "Original Title" .

您希望将其更改为类似于:

:something :title "Updated Title" .

使用Sesame的POST仅向命名图(在Sesame术语中称为上下文)添加新信息,重要的是它不会删除任何现有信息。
在RDF术语中,这两个三元组表示不同的事实。 Sesame(或任何其他三元组存储)并不知道第二个三元组应该替换第一个三元组。这与您可能习惯于的传统SQL / 关系模型非常不同,在其中您将更新属性,因为RDF没有适当的概念来修改三元组。您只能添加新的三元组或删除现有的三元组。
要获得所需的更新行为,您必须删除旧的三元组(Sesame的REST API支持HTTP DELETE进行此操作),然后添加替换它的新三元组(使用您当前正在执行的Sesame的POST操作)。
对于几乎所有使用的三元组存储,都是如此。如果像cyrgi建议的那样使用支持SPARQL更新的存储,则可以向更新终端发出以下请求(假设您使用命名图):
DELETE DATA 
{ 
  GRAPH <http://example.org/graph> { :something :title "Original Title" . }
};
INSERT DATA 
{
   GRAPH <http://example.org/graph> { :something :title "Updated Title" . }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接