使用绑定变量来引用SPARQL中的GRAPH

时间:2014-09-01 15:42:49

标签: rdf sparql jena arq

我之前使用三重模式的Uri绑定变量作为GRAPH参数,但是当我使用下面显示的BIND / URI / CONCAT的结果时,它的行为不符合预期:它不匹配任何已知的图形。我检查过?graph变量正在解析为预期的Graph Uri。如果模式应该有效,那么我会忽略一个可变的范围问题吗?

       SELECT ?s ?p ?o WHERE
       { 
        GRAPH <http://www.interition.net/g1>
          { 
            <s1> :aProperty ?literal .

            BIND ( URI(CONCAT("http://www.interition.net/graphs/", ?literal )) AS ?graph) .
          }

          GRAPH ?graph { 
                  ?s ?p ?o .
              }
    }

示例nQuads

<s1> <http://www.interition.net/ref/aProperty> "g2" <http://www.interition.net/g1> .
<s2> <http://www.interition.net/ref/aState> "happy"   <http://www.interition.net/graphs/g2> .

3 个答案:

答案 0 :(得分:1)

看起来问题源于我们正在使用的三元组。我编造了两个虚拟ttl文件,我将其上传到Jena的Fuseki中的两个图表中,查询就像Andy演示的一样。

但是,我们目前正在使用较旧版本的BigData作为我们在Interition的商店,它似乎不支持这种类型的变量传递给图表......我会在最新版本上尝试发布,我们将重新考虑是否升级或切换到Fuseki。如果问题在最新版本中仍然存在,我将与开发团队一起提出。

答案 1 :(得分:0)

看起来数据中的<s1>与查询中的<s1>不匹配。

尝试使用&#34; arq.qparse&#34;打印查询。 (或者只是在程序中打印&#34; toString&#34;)。 <s1>的相对URI已解决。

如何创建N-Quads? API不检查URI。

尝试:

PREFIX  ref:  <http://www.interition.net/ref/>

SELECT  ?graph ?s ?p ?o
WHERE
  { GRAPH <http://www.interition.net/g1>
      { ?s1 ref:aProperty ?literal
        BIND(uri(concat("http://www.interition.net/graphs/", ?literal)) AS ?graph)
      }
    GRAPH ?graph
      { ?s ?p ?o }
  }

我明白了:

-----------------------------------------------------------------------
| graph                                 | s    | p          | o       |
=======================================================================
| <http://www.interition.net/graphs/g2> | <s2> | ref:aState | "happy" |
-----------------------------------------------------------------------

答案 2 :(得分:0)

此问题可能与您在RDF存储中如何实现查询评估有关。当评估第一个GRAPH块时,它会导致?graph的一组绑定。通常,此绑定仅在查询评估的最后阶段应用于两个组,其中块将跨此变量连接。不需要将其用于实际匹配第二图形模式。编写查询的另一种方法是匹配过滤器中的图形:

PREFIX  ref:  <http://www.interition.net/ref/>

SELECT  ?graph ?s ?p ?o
WHERE {
   GRAPH <http://www.interition.net/g1> {
      ?s1 ref:aProperty ?literal
      BIND(uri(concat("http://www.interition.net/graphs/", ?literal)) AS ?graph1)
   }
   GRAPH ?graph2 {
      ?s ?p ?o
   }
   FILTER(?graph1 = ?graph2)
}