如何迭代引用虚拟图的 SPARQL 查询?

Posted

技术标签:

【中文标题】如何迭代引用虚拟图的 SPARQL 查询?【英文标题】:How do I iterate over a SPARQL query referring to a virtual graph? 【发布时间】:2017-07-15 01:38:49 【问题描述】:

我正在开发一个 Virtuoso 存储过程。 我想对 SPARQL 查询的结果执行循环到图表。 当查询包含对虚拟图的引用(不在三元存储中的物理图,是 R2RML 映射操作的结果)时,就会出现问题。在我所有的尝试中,我都没有收到错误,但结果集也是空的。 我尝试了以下

create procedure R2RML.DBA.try() returns integer

  for (sparql define input:storage ""
       select ?s ?p
       from <http://example.com/resource>
       where 
         ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o .
         LIMIT 5 ) do
    
      use_the_value("s");
    
;

还有以下

create procedure R2RML.DBA.try() returns integer

  declare srcgraph varchar;
  srcgraph := 'http://ec.example.com/resource';
  for (sparql define input:storage ""
        select ?s ?p
        where 
        GRAPH `iri(?:srcgraph)` 
          
            ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o .
          
          LIMIT 5 ) do
    
      use_the_value("s");
    
;

在这两种情况下都不会执行迭代,尽管查询相同,但在 SPARQL 端点中执行时会返回结果。

如果我删除对图形的引用,则执行迭代:

create procedure R2RML.DBA.try() returns integer

  for (sparql define input:storage ""
        select ?s ?p
        where 
          ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o .
          LIMIT 5 ) do
    
      use_the_value("s");
    
;

有人知道我做错了什么吗?

【问题讨论】:

这看起来更像是一个适合 Virtuoso 邮件列表的问题,因为这是一个非常具体的问题。但可能@TallTed 会在这里回答你的问题。 【参考方案1】:

由于图形是虚拟的,因此诀窍是在 SPARQL 语句的 define 指令中添加四元存储的名称。例如,如果使用 Virtuoso 四元映射存储,define 指令将变为以下内容。

sparql define input:storage "http://www.openlinksw.com/schemas/virtrdf#DefaultQuadStorage"

【讨论】:

以上是关于如何迭代引用虚拟图的 SPARQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化我的递归 SPARQL 查询?

如何将 Sparql 查询结果存储到数组中?

如何递归扩展 SPARQL 构造查询中的空白节点?

如何根据 SPARQL 中对象的主题选择不同的查询?

sparql 连接查询解释它是如何工作的?

DBpedia SPARQL 查询 ID3 标签的歌曲信息