如何在SPARQL UPDATE语句中正确指定RDF图

时间:2014-04-06 12:40:52

标签: sparql owl protege fuseki

我使用以下IRI在PROTEGE中创建了一个本体:

http://www.marketplace.org/CarrierBlueprint#

和前缀i给了它mp

现在我在Fuseki服务器上传了这个本体并尝试运行更新语句。

在这个本体中有一个叫做CarrierProfile的类,所以我想用INSERT语句创建一个新的运营商档案

(1)我试过这个

INSERT DATA {
    GRAPH <http://www.marketplace.org/CarrierBlueprint#>
    {
        mp:CarrierProfile3  rdf:type  mp:CarrierProfile.
    }
}

- fuseki服务器显示UPDATE SUCCESS,当我回询时,我没有获得名为CarrierProfile3的新运营商资料

BUT

(2)当我使用这个

INSERT DATA {
    mp:CarrierProfile3  rdf:type  mp:CarrierProfile.
}

它也很成功,当我查询时,我得到一个名为CarrierProfile3的新运营商资料

我不明白我在代码1中做错了什么。我没有正确提及图表吗?

1 个答案:

答案 0 :(得分:3)

使用给定的IRI创建本体并不一定会在将其上载到商店时为其提供该URI。每个商店都有自己的方式来指定加载新数据的图形,在Fuseki的情况下,当您上传本体文件时,它几乎肯定会进入未命名的默认图形。

使用Fuseki,您可以通过在上传表单图表字段中输入所需的名称来上传到特定的命名图表。

您可以使用以下查询查看所有数据,包括其中的图表:

SELECT *
WHERE
{
  { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}

现在,就你的两个更新而言,它们都成功的原因是它们都插入了有效数据,问题是更新1将其专门插入到命名图中,而更新2插入到未命名的默认图中。您没有显示用于测试更新是否“有效”的特定查询,但我认为它类似于以下内容:

SELECT *
WHERE
{
  ?x a mp:CarrierProfile .
}

此处的问题是您的查询仅查询未命名的默认图,因此在第一次更新后,您将看不到该图中的任何更改,因为您更新了特定的命名图。而在第二次更新时,您更新了默认图表,以便查询确实能够看到新数据。

您可以通过多种方式重写查询以访问特定的命名图。首先,您可以使用第一次更新中的GRAPH子句,例如

SELECT *
WHERE
{
  GRAPH <http://www.marketplace.org/CarrierBlueprint#>
  {
    ?x a mp:CarrierProfile .
  }
}

或者您可以使用FROM子句将特定的命名图形作为查询的默认图形,例如

SELECT *
FROM <http://www.marketplace.org/CarrierBlueprint#>
WHERE
{
  ?x a mp:CarrierProfile .
}