【问题标题】:Using a bound variable to refer to a GRAPH in SPARQL在 SPARQL 中使用绑定变量来引用 GRAPH
【发布时间】:2014-09-01 15:42:49
【问题描述】:

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

选择 ?s ?p ?o 在哪里 { 图 { :a 属性 ?literal 。 BIND ( URI(CONCAT("http://www.interition.net/graphs/", ?literal )) AS ?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> .

【问题讨论】:

  • 你得到 ?graph 的绑定值了吗?例如,如果您删除 graph graph { ?s ?p ?o } 并选择 ?literal 和 ?graph,您会得到什么?
  • 是的,如果我在投影中有一个 SELECT * 并删除第二个 GRAPH 声明及其块,我将获得 ?literal 和 ?graph 值,后者作为 URI。如果我采用 URI 值并使用 spo 块作为参数提供给 GRAPH,则它可以工作。
  • 您能否展示一些 nquads 数据以便我们重现问题?
  • 编辑了问题。我显然在制造查询和数据。我想知道我是否应该期望它起作用。
  • @JoshuaTaylor 嗨,我可以提供更多信息吗?如果我希望它能够工作,那么我会花更多时间研究它。

标签: rdf sparql jena arq


【解决方案1】:

看起来问题根源在于我们正在使用的三元存储。我制作了两个虚拟 ttl 文件,将它们上传到 Jena 的 Fuseki 中的两个图表中,查询的工作方式与 Andy 演示的一样。

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

【讨论】:

  • 轻微修正 - BigData 已经处理了图形 uri 的变量传递,但当您使用 BIND(uri(concat(...
【解决方案2】:

数据中的&lt;s1&gt; 似乎与查询中的&lt;s1&gt; 不匹配。

尝试使用“arq.qparse”打印查询(或仅在程序中打印“toString”)。 &lt;s1&gt; 的相对 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" |
-----------------------------------------------------------------------

【讨论】:

  • 我确实是手工制作的,因为我无法显示真实的查询或数据。我没有创建一个真实的数据集并进行测试,因为我只是想知道它是否应该在原则上起作用。我会更彻底地复制并回帖。
  • 您似乎已经注意到, 也是一个问题。
  • 是的,正如我所说,它是捏造的,因此从未运行过此代码和数据。我问的是原则。我有人制作了一些虚拟数据来回传以结束问题。
  • 两个 GRAPH 块连接在一起 - 从逻辑上讲,两个 GRAPH par 被评估,然后每个结果的连接完成。 ARQ 会找到一种更快的方法(索引连接的一种形式)。原始问题的答案是“是的,你可以这样做”
【解决方案3】:

这个问题可能与查询评估在您的 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多