SPARQL:如何将变量传递给子查询?

时间:2018-10-31 18:13:34

标签: sparql wikidata

这有效:

SELECT ?propLabel ?val WHERE {
    BIND("incoming"@en AS ?propLabel)
    {
      SELECT (COUNT(?s) AS ?val) WHERE {
        ?s ?p wd:Q8740.
        _:b72 wikibase:directClaim ?p.
      }
    }
}

但这不是,我认为是因为首先查询了子查询,因此?entity尚未绑定:

SELECT ?propLabel ?val WHERE {
  BIND(wd:Q8740 as ?entity)
    BIND("incoming"@en AS ?propLabel)
    {
      SELECT (COUNT(?s) AS ?val) WHERE {
        ?s ?p ?entity.
        _:b72 wikibase:directClaim ?p.
      }
    }
}

如果是这样,我们如何将变量“传递”到子查询中?

1 个答案:

答案 0 :(得分:1)

阅读SPARQL Bottom Up Semantics文章中的 Blazegraph中的优化部分,然后稍微帮助优化器:

SELECT ?propLabel ?val WHERE {
  BIND (wd:Q8740 AS ?entity)
  BIND("incoming"@en AS ?propLabel)
  { 
    SELECT (COUNT(?s) AS ?val) ?entity WHERE {
      ?s ?p ?entity .
      [] wikibase:directClaim ?p 
    } GROUP BY ?entity
  } 
}

Try it!

只需将?entity变量添加到投影中即可(然后您应明确地GROUP BY ?entity)。
因此,您将在query plan中有另外的joinVars=[entity]

有趣的是,无法使用hint:Query hint:optimizer "None"禁用这种优化。