在sparql查询中使用CONSTRUCT时,输出为single RDF graph,也就是一组三元组,它们实际上是新数据。但总的来说,我认为CONSTRUCT是一种手动创建理论上应该可重用的规则的方法。



CONSTRUCT的示例用法中,假设我想定义数据中还没有的内容。 Here's a good example taken from an article about CONSTRUCT

@prefix : <http://some.site.com/ont#> .

:jane :hasParent :gene .
:gene :hasParent :pat ;
      :gender    :female .
:joan :hasParent :pat ;
      :gender    :female .
:pat  :gender    :male .
:mike :hasParent :joan .


“下面的CONSTRUCT语句根据上述内容创建新的三元组,以指定谁是谁的祖父:”

PREFIX : <http://some.site.com/ont#>

CONSTRUCT { ?p :hasGrandfather ?g . }
WHERE {?p      :hasParent ?parent .
       ?parent :hasParent ?g .
       ?g      :gender    :male .
}


结果:

@prefix :        <http://some.site.com/ont#> .
:jane    :hasGrandfather    :pat .
:mike    :hasGrandfather    :pat .




一旦通过CONSTRUCT查询生成了新的三元组,这是否意味着我必须获取该数据并将其输入回数据库中才能开始使用/重用:hasGrandfather?还是可以引用生成的RDF图,就像引用SQL中的动态表一样?

还有其他有用的方法与使用CONSTRUCT生成的三元组进行交互吗?

最佳答案

如果您使用的是SPARQL 1.1,并且要查询三元组,则通常使用INSERT将这些三元组添加到商店中(到同一图或不同的图)。看看SPARQL 1.1 Update中的3.1节:


3.1 Graph Update

图形更新操作会更改“图形存储”中的现有图形,但
不要显式删除或创建它们。非空插入
不存在的图将隐式创建那些图,
即,满足更新请求的实现应静默
自动创建在三元组之前不存在的图
插入其中,如果失败则必须返回失败
出于任何原因。 (例如,实施可能不足
资源,或者实现可能仅提供更新服务
在一组固定的图上,而不是隐式创建的图
在此固定范围内)。实现可能会删除
将三元组从其中删除后留空。

SPARQL 1.1 Update提供了以下图形更新操作:…


用于图更新的基于模式的基本操作是INSERT和DELETE(它们可以在单个DELETE / INSERT操作中同时发生)。
这些动作包括要删除的三元组组和
要添加的三元组。三元组的规格基于
查询模式。 INSERT / DELETE和INSERT DATA之间的区别
/ DELETE DATA是INSERT DATA和DELETE DATA不替代
从模式绑定到模板。数据表要​​求
具体数据(包含DELETE中变量的三重模板
不允许执行DATA和INSERT DATA操作,并且不允许使用空白节点
不允许在DELETE DATA中删除,请参见语法中的注释8 + 9)。有
具体数据的特定操作意味着可以将请求
流式传输,以便可以进行大型的纯数据更新。



稍后在同一文档中:


范例8:

本示例将三元组从一个命名图复制到另一个命名图
基于模式的图形:

PREFIX dc:  <http://purl.org/dc/elements/1.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

INSERT
  { GRAPH <http://example/bookStore2> { ?book ?p ?v } }
WHERE
  { GRAPH  <http://example/bookStore>
       { ?book dc:date ?date .
         FILTER ( ?date > "1970-01-01T00:00:00-02:00"^^xsd:dateTime )
         ?book ?p ?v
  } }

10-06 13:05