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

Rdf CONSTRUCT子句的实际使用(和重用),rdf,sparql,semantics,triplestore,Rdf,Sparql,Semantics,Triplestore,在sparql查询中使用CONSTRUCT时,输出是一组三元组,即基本上是新数据。但总的来说,我认为构造是一种手动创建规则的方法,理论上应该是可重用的 在CONSTRUCT的一个示例用法中,假设我想定义一些数据中不存在的内容 @前缀:。 :简:有父母:吉恩。 :基因:hasParent:pat; :性别:女。 :琼:爸爸妈妈:帕特; :性别:女。 :帕特:性别:男。 当前位置迈克:他的父母:琼。 “以下CONSTRUCT语句基于上述三元组创建新的三元组,以指定谁是谁的祖父:” 前缀: 构造{

在sparql查询中使用
CONSTRUCT
时,输出是一组三元组,即基本上是新数据。但总的来说,我认为
构造
是一种手动创建规则的方法,理论上应该是可重用的


CONSTRUCT
的一个示例用法中,假设我想定义一些数据中不存在的内容

@前缀:。
:简:有父母:吉恩。
:基因:hasParent:pat;
:性别:女。
:琼:爸爸妈妈:帕特;
:性别:女。
:帕特:性别:男。
当前位置迈克:他的父母:琼。
“以下CONSTRUCT语句基于上述三元组创建新的三元组,以指定谁是谁的祖父:”

前缀:
构造{p:hasg}
其中{?p:hasParent?parent。
父项:hasParent?g。
g:性别:男。
}
结果是:

@prefix :        <http://some.site.com/ont#> .
:jane    :hasGrandfather    :pat .
:mike    :hasGrandfather    :pat .
@前缀:。
当前位置简:爷爷:帕特。
当前位置迈克:爷爷:帕特。


一旦我由于
构造
查询生成了新的三元组,这是否意味着我必须获取该数据,并将其输入到数据库中,以便开始使用/重用
:hascandle
?或者我可以像引用SQL中的动态表一样引用生成的RDF图吗


是否有其他有用的方法与由于使用
构造
而生成的三元组交互?

如果您使用SPARQL 1.1,并且您正在查询一个三元组存储库,您通常会使用INSERT将这些三元组添加到存储库(到同一个图或不同的图)。从以下内容查看第3.1节:

图形更新操作更改图形存储中的现有图形,但 不要显式删除或创建它们。非空插入到 但是,不存在的图将隐式创建这些图, i、 例如,满足更新请求的实现应该是静默的 自动创建在创建三元组之前不存在的图形 插入到它们中,如果未能执行此操作,则必须返回失败 不管什么原因。(例如,实施可能存在不足。) 资源或实现可能只提供更新服务 在一组固定的图上,隐式创建的图不是 在这个固定的范围内)。一个实现可以删除 从三元组中删除三元组后保留为空

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

  • 图形更新的基本基于模式的操作是插入和删除(可以在单个删除/插入操作中同时发生)。 这些操作包括要删除的三元组和 要添加的三元组。三元组的规格基于 查询模式。插入/删除和插入数据之间的差异 /删除数据是指插入数据和删除数据不可替代 从模式绑定到模板。数据表格要求 具体数据(包含DELETE中变量的三重模板 不允许执行数据和插入数据操作,并保留空白节点 删除数据中不允许,请参见语法中的注释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
  } }
前缀dc:
前缀xsd:
插入
{图{?book?p?v}
哪里
{图
{?图书dc:日期?日期。
过滤器(?日期>“1970-01-01T00:00:00-02:00”^^xsd:dateTime)
书?p?v
} }

为了补充约书亚的答案,因为你似乎正在使用构造查询来编写规则,你可以考虑使用或至少查看OWL和使用支持推理的数据库(有几个)。一些支持OWL的数据库也将支持SWRL规则,因此您可以同时使用这两种规则


如果您想遵守规则,但更喜欢SPARQL,Stardog有一个;它们仍然是SWRL规则,但具有令人满意的语法。还有一些虽然不是标准,但基于SPARQL的类似规则,但不是正式标准。

1。当你说这是典型的插入到商店,这是否意味着这是唯一的方式使用它们?2.在示例8中,整个
构造
/
,其中
查询是否包含在
图形{#here}
的范围内?“一旦我作为构造查询的结果生成了新的三元组,这是否意味着我必须获取该数据,并将其输入回数据库,以便开始使用/重用:hasgraden?”如果要查询构造的三元组,需要将它们放在可以查询的地方。将它们添加回相同或不同的命名图将是一种方法。我认为INSERT可能是典型的例子,这个例子突出了命名图的使用。它查询一个图形
,构造一些三元组并将它们存储在另一个图形
中。当然,您可以将它们存储在同一个图形中,也可以存储在默认图形中。这个例子只是强调了一些选项。可能值得花时间快速阅读文档的这些部分;你不需要马上记住所有的细节,但是你会知道你能做什么,你会知道在你需要的时候是否需要寻找细节。对我来说,这引出了另一个问题:
CONSTRUCT
还可以用于什么?我认为它有助于从数据集中提取特定的子图,然后将生成的子图插入数据库供以后使用?不需要。正如Joshua所说,SPARQL更新更适合通过SPARQL向数据库添加数据。构造可以简单地用于提取有趣的/有用的
@prefix :        <http://some.site.com/ont#> .
:jane    :hasGrandfather    :pat .
:mike    :hasGrandfather    :pat .
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
  } }