9

我正在试验 Sesame 和 Virtuoso Triplestores。目前,我使用 Sesame Java API 将 RDF 数据添加到两个 Triplestore。

我的 RDF 数据代表不同的东西,如 Videodata、Userdata 等。目前我可以将视频的 RDF(标题、描述、位置等)添加到 Triplestore

但是如何更新商店中的 RDF 呢?

例如,如果我使用 sesame 的 REST 接口并使用更新的 RDF 发出 PUT 请求,则首先删除存储中的所有内容。

当我将 POST 与更新的数据一起使用时(例如视频的标题已更改),标题(旧的和新的)都会被存储。

您如何与三联店合作?也许我在这里错过了一些必不可少的东西。


编辑:

我现在为每个 RDF 条目使用 Sesame 中的 Context 和 Virtuoso 中的 Graphs。这种更新方式我可以先清除上下文并再次添加。当我对两个 Triplestore 使用 Sesame API 时(我们仍然不知道我们将使用哪一个),代码看起来完全一样。

ValueFactory f = rep.getValueFactory();
URI uri = f.createURI(urn);
con.clear(uri);
con.add(reader,this.baseURI, RDFFormat.RDFXML,uri);

谢谢您的帮助

4

2 回答 2

5

我假设您正在使用 SPARQL。如果你不这样做,那么你可能应该:-)

许多三元组存储支持SPARQL 更新,这是一种用于在 SPARQL 存储中修改 RDF 三元组的语言。它就像 SQL 的INSERT,UPDATE等等DELETE。我不确定 Sesame 是否支持它——SPARQL 更新仍然是一个非常新的规范,甚至还没有完全确定。

另一个需要注意的有用的事情是命名图,特别是如果您想以 RESTful 方式工作。这允许在不同的图表中管理三元组,因此您可以将数据分开。例如,您可以将每个视频的三元组保存在单独的命名图中,然后在 PUT 请求中仅更新该命名图。您仍然可以使用 SPARQL 跨所有命名图查询整个存储。同样,我不完全确定 Sesame 的 REST API 是否提供对命名图的访问。(我很确定 Java API 确实如此;我认为他们称之为不同的东西。上下文?)

于 2011-06-20T12:10:57.743 回答
2

因此,假设您拥有像这样的原始 RDF,以您的具体标题示例为例:

:something :title "Original Title" .

您想将其更改为:

:something :title "Updated Title" .

使用 Sesame 的 POST只会将新信息添加到命名图(芝麻术语中的上下文),重要的是它不会删除任何现有信息。

在 RDF 术语中,这两个三元组代表不同的事实。芝麻(或任何其他三元组)不知道第二个三元组应该取代第一个。这与您可能习惯于更新属性的传统 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" . }
}
于 2011-06-20T13:47:30.033 回答