嵌套 select 上的 Sparql 语法错误
Sparql syntax error on nested select
我正在尝试 select 人口最多的城市。我的查询如下所示:
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.
知道问题出在哪里吗?
我不知道您在哪里看到可以将 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
但是,如果您真的想要 "capital in Europe with the highest population",为什么不使用更简单、更明显的方式来反映您的任务,即 ORDER BY
+ LIMIT 1
:
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
我正在尝试 select 人口最多的城市。我的查询如下所示:
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.
知道问题出在哪里吗?
我不知道您在哪里看到可以将 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
但是,如果您真的想要 "capital in Europe with the highest population",为什么不使用更简单、更明显的方式来反映您的任务,即 ORDER BY
+ LIMIT 1
:
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