4

在 sparql 查询中使用CONSTRUCT时,输出是单个 RDF 图,也就是一组三元组,本质上是数据。但总的来说,我认为CONSTRUCT这是一种手动创建理论上应该可重用的规则的方法。


在 的示例用法中CONSTRUCT,假设我想定义数据中尚未包含的内容。这是取自一篇关于 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?还是可以像引用 SQL 中的动态表一样引用生成的 RDF 图?

是否有其他有用的方法可以与使用生成的三元组进行交互CONSTRUCT

4

2 回答 2

4

如果您使用的是 SPARQL 1.1,并且您正在查询三元组,那么您通常会使用 INSERT 将这些三元组添加到存储中(添加到相同的图或不同的图)。查看SPARQL 1.1 更新中的第 3.1 节:

3.1 图表更新

图更新操作会更改图存储中的现有图,但不会显式删除或创建它们。然而,对不存在的图的非空插入将隐式地创建这些图,即满足更新请求的实现应该默默地自动创建在三元组插入之前不存在的图,并且如果它必须返回失败因任何原因未能这样做。(例如,实现可能资源不足,或者实现可能只对一组固定的图提供更新服务,而隐式创建的图不在这个固定集合内)。实现可能会删除从三元组中删除后留空的图。

SPARQL 1.1 Update 提供了这些图更新操作:……</p>

  • 图更新的基于模式的基本操作是 INSERT 和 DELETE(它们可以同时出现在单个 DELETE/INSERT 操作中)。这些动作包括要删除的三元组和要添加的三元组。三元组的规范基于查询模式。INSERT / DELETE 和 INSERT DATA / DELETE DATA 之间的区别在于 INSERT DATA 和 DELETE DATA 不会将绑定替换为模式中的模板。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
  } }
于 2014-01-30T18:29:15.497 回答
2

为了补充 Joshua 的回答,由于您似乎正在使用构造查询来编写规则,您可能会考虑使用或至少查看 OWL 并使用支持推理的数据库(有几个)。一些支持 OWL 的数据库也支持 SWRL 规则,所以你可以同时使用。

如果你想坚持规则,但更喜欢 SPARQL,Stardog 有一个基于 SPARQL 的 SWRL 语法;它们仍然是 SWRL 规则,但具有可口的语法。还有SPIN,虽然不是标准,但它是基于 SPARQL 的类似规则,但不是正式标准。

于 2014-02-02T10:58:26.983 回答