为什么我必须在SPARQL查询中过滤图形URI?

为什么我必须在SPARQL查询中过滤图形URI?,sparql,rdf,virtuoso,triplestore,named-graphs,Sparql,Rdf,Virtuoso,Triplestore,Named Graphs,为了从triplestore()中的命名图中获取所有三元组,我编写了SPARQL查询: SELECT ?s ?p ?o WHERE { GRAPH eg:myGraph { ?s ?p ?o. } } 但我似乎无法在图形声明中定义图形URI;查询不返回任何三元组 如果我使用中间变量?g而不是我的图形的URI,那么请求将起作用: SELECT ?s ?p ?o WHERE { FILTER(?g = eg:myGraph). GRAPH ?g {

为了从triplestore()中的命名图中获取所有三元组,我编写了SPARQL查询:

SELECT ?s ?p ?o
WHERE {
    GRAPH eg:myGraph {
        ?s ?p ?o.
    }
}
但我似乎无法在图形声明中定义图形URI;查询不返回任何三元组

如果我使用中间变量
?g
而不是我的图形的URI,那么请求将起作用:

SELECT ?s ?p ?o
WHERE {
    FILTER(?g = eg:myGraph).
    GRAPH ?g {
        ?s ?p ?o.
    }
}
我看不出这两个问题之间的区别

我的第一个语法是错误的查询吗?这是精湛的技艺吗?

你可以试着跑步

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


这两个查询是等价的。我还认为第一种方法更有效(一般来说,因为它的变量更少)。这一定是Virtuoso SPARQL解析器的一个限制/缺陷。。。其中{values?g{eg:myGraph}graph?g{…}起作用?这可能比过滤器更有效,并且更清楚地表明?g的值应该有一个预定义的值。结果与之前的
graph?
相同。我刚刚看到我的virtuoso版本是debian的当前默认版本:virtuoso 6.1。也许这个问题可以用virtuoso 7解决?SPARQL在
值上返回一个错误。我认为这个版本的解析器没有应用当前的SPARQL 1.1规范。您可能需要Virtuoso 7您的第一个命令返回正确的结果(不带“”),但第二个命令返回整个默认图。正如在问题的评论中所说的,我认为这是virtuoso版本中的一个问题(不幸的是,我正在处理的系统上的最后一个版本)。是的,我认为这主要取决于您使用的是哪个triple store。。。有了stardog,它们都能正常工作。如果myGraph不是要成为uri而是居里(这很明显……我将编辑我的答案),那么您不需要
SELECT ?s ?p ?o
FROM eg:myGraph
WHERE {
        ?s ?p ?o.
    }