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

如何在SPARQL UPDATE语句中正确指定RDF图,sparql,owl,protege,fuseki,Sparql,Owl,Protege,Fuseki,我使用以下IRI在PROTEGE中创建了一个本体: http://www.marketplace.org/CarrierBlueprint# 我给它的前缀是mp 现在我将这个本体上传到Fuseki服务器,并尝试运行更新语句 在这个本体中有一个名为CarrierProfile的类,所以我想使用INSERT语句创建一个新的运营商概要文件 (1) 我试过这个 INSERT DATA { GRAPH <http://www.marketplace.org/CarrierBlueprint

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

http://www.marketplace.org/CarrierBlueprint#
我给它的前缀是
mp

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

在这个本体中有一个名为CarrierProfile的类,所以我想使用
INSERT
语句创建一个新的运营商概要文件

(1) 我试过这个

INSERT DATA {
    GRAPH <http://www.marketplace.org/CarrierBlueprint#>
    {
        mp:CarrierProfile3  rdf:type  mp:CarrierProfile.
    }
}
这也是成功的,当我查询时,我这次得到了一个名为CarrierProfile3的新运营商档案


我不明白我在代码1中做错了什么。我没有正确地提到这个图吗?

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

使用Fuseki,您可以通过在upload forms graph字段中输入所需的名称上传到特定的命名图

您可以使用以下查询查看所有数据,包括它所在的图形:

SELECT *
WHERE
{
  { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}
现在,就您的两个更新而言,它们都成功的原因是它们都插入了有效数据,问题是更新1专门将其插入到命名图中,而更新2则插入到未命名的默认图中。您还没有显示用于测试更新是否“有效”的特定查询,但我假设它如下所示:

SELECT *
WHERE
{
  ?x a mp:CarrierProfile .
}
这里的问题是,您的查询只查询未命名的默认图,因此在第一次更新后,您不会看到该图中的任何更改,因为您更新了特定的命名图。而在第二次更新中,您更新了默认图,以便查询能够看到新数据

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

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