CONSTRUCT 子句的实际使用(和重用)

Posted

技术标签:

【中文标题】CONSTRUCT 子句的实际使用(和重用)【英文标题】:Practical use (and reuse) of the CONSTRUCT clause 【发布时间】:2014-02-23 05:29:33 【问题描述】:

在 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?还是可以像引用 SQL 中的动态表一样引用生成的 RDF 图?

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

【问题讨论】:

【参考方案1】:

如果您使用的是 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
   

【讨论】:

1.当您说将它们插入商店是典型时,这是否意味着这是使用它们的唯一方法? 2.在示例8中,整个CONSTRUCT/WHERE查询是否包含在GRAPH &lt;uri&gt; #here 的范围内? “一旦我通过 CONSTRUCT 查询生成了新的三元组,这是否意味着我必须获取该数据,并将其输入回数据库才能开始使用/重用:hasGrandfather ?”如果你想查询构造的三元组,你需要把它们放在你可以查询的地方。将它们添加回相同或不同的命名图将是一种方法。我认为 INSERT 可能在那里很典型。 该示例强调了命名图的使用。它正在查询一个图形&lt;http://example/bookStore&gt;,并构造一些三元组并将它们存储在另一个图形&lt;http://example/bookStore2&gt; 中。当然,您可以将它们存储在同一个图形中,或者也可以存储在默认图形中。该示例只是突出显示了一些选项。可能值得花时间快速阅读文档的这些部分;你不需要马上记住所有的细节,但你会知道你能做什么,并且你会知道是否在需要时寻找细节。【参考方案2】:

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

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

【讨论】:

对我来说,这引出了另一个问题:CONSTRUCT 还能用来做什么? 我认为从数据集中提取特定子图很有用 然后将生成的子图插入您的数据库以供以后使用? 不需要。正如 Joshua 所说,SPARQL 更新更适合通过 SPARQL 向您的数据库添加数据。 Construct 可以简单地用于提取您的应用程序可能需要对其执行一些逻辑的有趣/有用的子图。

以上是关于CONSTRUCT 子句的实际使用(和重用)的主要内容,如果未能解决你的问题,请参考以下文章

多次重用参数

如何将用户输入转换为 gnu prolog 中的可重用谓词?

PHP类和对象之构造函数和析构函数

《SQLite3 — 子句》

吴裕雄--天生自然 PHP开发学习:MySQL子句

VFP里使用SQL的SELECT语句将查询结果存储在一个临时表中,应使用啥子句?