嵌套select上的Sparql语法错误

时间:2016-10-30 19:36:56

标签: sparql fuseki

我正在尝试选择人口最多的城市。我的查询如下所示:

PREFIX dct: <http://purl.org/dc/terms/>
PREFIX dbpedia: <http://dbpedia.org/resource/>
PREFIX db: <http://dbpedia.org/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX dbc: <http://dbpedia.org/resource/Category:>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?population ?capital
WHERE {

    ?x dct:subject dbc:Countries_in_Europe .
    ?x   dbo:capital ?capital .
    ?capital dbo:populationTotal ?population .

     FILTER (?population =
        (
          SELECT MAX(?popul) AS ?pop
          WHERE{
              ?capital dbo:populationTotal ?popul .
          }
        )
  )

}
LIMIT 200

我已经关注了This PDF第5页。 我正在使用apache-jena-fuseki-2.4.0并收到语法错误 Encountered " "select" "SELECT "" at line 18, column 1. 问题出在哪里?

1 个答案:

答案 0 :(得分:3)

我不知道你在哪里看到你可以将SELECT查询的结果绑定到FILTER中的变量,但那是完全错误的。这可能适用于SQL,但不适用于SPARQL。

PREFIX  dbo:  <http://dbpedia.org/ontology/>
PREFIX  dbp:  <http://dbpedia.org/property/>
PREFIX  dct:  <http://purl.org/dc/terms/>
PREFIX  dbc:  <http://dbpedia.org/resource/Category:>
PREFIX  dbpedia: <http://dbpedia.org/resource/>
PREFIX  db:   <http://dbpedia.org/>

SELECT  ?population ?capital
WHERE
  { ?x        dct:subject          dbc:Countries_in_Europe ;
              dbo:capital          ?capital .
    ?capital  dbo:populationTotal  ?population
    FILTER ( ?population = ?pop )

    # sub-SELECTs are evaluated first and encapsulated by { }
    # in addition (as to TomP's comment), you have to restrict to European captials here
    { SELECT  (MAX(?popul) AS ?pop)
      WHERE
        { ?x        dct:subject          dbc:Countries_in_Europe ;
                    dbo:capital          ?capital .
          ?capital  dbo:populationTotal  ?popul }
    }
  }
LIMIT   200

但是,如果你真的想要拥有“人口最多的欧洲首都”,为什么不使用反映你任务的更简单,更明显的方式,即ORDER BY + LIMIT 1:< / p>

PREFIX  dbo:  <http://dbpedia.org/ontology/>
PREFIX  dbp:  <http://dbpedia.org/property/>
PREFIX  dct:  <http://purl.org/dc/terms/>
PREFIX  dbc:  <http://dbpedia.org/resource/Category:>
PREFIX  dbpedia: <http://dbpedia.org/resource/>
PREFIX  db:   <http://dbpedia.org/>

SELECT  ?population ?capital
WHERE
  { ?x        dct:subject          dbc:Countries_in_Europe ;
              dbo:capital          ?capital .
    ?capital  dbo:populationTotal  ?population    
  }
ORDER BY DESC(?population)
LIMIT   1