SPARQL: Как передать переменную в подзапрос? - PullRequest
0 голосов
/ 31 октября 2018

Это работает:

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 голосов
/ 01 ноября 2018

Прочитайте раздел Оптимизации в Blazegraph в статье SPARQL Bottom Up Semantics , затем немного помогите оптимизатору:

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
  } 
}

Попробуйте!

Просто добавьте переменную ?entity в проекцию (и тогда вы должны GROUP BY ?entity явно).
В результате у вас будет дополнительный joinVars=[entity] в плане запросов .

Интересно, что такую ​​оптимизацию нельзя отключить с помощью hint:Query hint:optimizer "None".

...