【问题标题】:Why am I obliged to filter the graph URI in a SPARQL query?为什么我必须在 SPARQL 查询中过滤图形 URI?
【发布时间】:2015-07-15 04:28:44
【问题描述】:

为了从我的三元存储库 (OpenLink Virtuoso v6.1) 中的命名图中获取所有三元组,我编写了 SPARQL 查询:

SELECT ?s ?p ?o
WHERE {
    GRAPH eg:myGraph {
        ?s ?p ?o.
    }
}

但我似乎无法在 GRAPH 声明中定义图形 URI;查询不返回任何三元组。

如果我使用中间变量 ?g 而不是我的图形的 URI,则请求有效:

SELECT ?s ?p ?o
WHERE {
    FILTER(?g = eg:myGraph).
    GRAPH ?g {
        ?s ?p ?o.
    }
}

我看不出这两个查询之间的区别。

我的第一个语法是错误的查询吗?这是Virtuoso的精妙之处吗?

【问题讨论】:

  • 这两个查询是等价的。我也认为第一个更有效(一般来说,因为它的变量更少)。这一定是 Virtuoso SPARQL 解析器的限制/错误。
  • select ... where { values ?g { eg:myGraph } graph ?g { ... } } 有效吗?这可能比过滤器更有效,并且更清楚地表明 ?g 的值应该具有预定义的值。
  • 和之前graph ?的结果一样。我刚刚看到我的 virtuoso 版本是 debian 的当前默认版本:virtuoso 6.1。也许这个问题可以用 virtuoso 7 解决?
  • SPARQL 在values 上返回错误。我认为这个版本的解析器只是没有应用当前的 SPARQL 1.1 规范。
  • 您可能需要 Virtuoso 7

标签: sparql rdf virtuoso triplestore named-graphs


【解决方案1】:

你可以试试跑

SELECT ?s ?p ?o
FROM NAMED eg:myGraph
WHERE {
    GRAPH eg:myGraph {
        ?s ?p ?o.
    }
}

SELECT ?s ?p ?o
FROM eg:myGraph
WHERE {
        ?s ?p ?o.
    }

【讨论】:

  • 你的第一个命令返回正确的结果(没有''),但第二个返回整个默认图。正如问题的 cmets 所说,我认为这是 virtuoso 版本的问题(不幸的是,我正在使用的系统上的最后一个版本)。
  • 是的,我认为这主要取决于您使用的是哪个三重商店......使用stardog,它们都可以正常工作。如果 eg:myGraph 不打算成为一个 uri 而是一个居里(这很明显......我要编辑我的答案)你不需要
猜你喜欢
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2015-08-19
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多