【问题标题】:How to correctly specify RDF graph in an SPARQL UPDATE statement如何在 SPARQL UPDATE 语句中正确指定 RDF 图
【发布时间】:2014-04-06 12:40:51
【问题描述】:

我使用以下 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.
    }
}

-- fuseki 服务器显示UPDATE SUCCESS,当我查询回来时,我没有得到一个名为 CarrierProfile3 的新运营商配置文件

但是

(2) 当我使用这个时

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

这也是成功的,当我查询时,这次我得到了一个名为 CarrierProfile3 的新运营商配置文件

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

【问题讨论】:

    标签: sparql owl protege fuseki


    【解决方案1】:

    使用给定 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 .
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2013-08-15
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      相关资源
      最近更新 更多