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

时间:2014-01-30 18:20:53

标签: rdf sparql semantics triplestore

在sparql查询中使用CONSTRUCT时,输出为single RDF graph,也就是一组三元组,基本上是 new 数据。但总的来说,我认为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查询,我生成了 new triples ,这是否意味着我必须获取该数据,然后将其输入数据库才能启动使用/重用:hasGrandfather?或者我可以引用生成的RDF图,就好像我将在SQL中引用动态表一样?

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

2 个答案:

答案 0 :(得分:4)

如果您正在使用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不替换的   从模式绑定到模板。 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)

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

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