如何从 SPARQL 聚合中投影其他变量
How to project additional variables from SPARQL aggregates
我想借助维基数据了解瑞士城市的最新人口。要获得具有首选等级的那些很容易但没有帮助。我有以下 SPARQL 查询,但现在我无法从聚合中预测最新日期(不仅是日期)的实际人口计数 ?popWD
。据我了解,您不能预测未聚合的值。
SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE {
?wikiURI wdt:P31 wd:Q70208;
p:P1082 ?popWDStatement.
?popWDStatement pq:P585 ?timeWDAll;
ps:P1082 ?popWD.
}
GROUP BY ?wikiURI
我用一个子选择解决了这个问题,它确实有效,但看起来有点复杂而且很慢:
SELECT ?wikiURI ?timeWD ?popWD WHERE {
?wikiURI p:P1082 ?popWDStatement.
?popWDStatement ps:P1082 ?popWD;
pq:P585 ?timeWD.
{
SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE {
?wikiURI wdt:P31 wd:Q70208;
p:P1082 ?popWDStatement.
?popWDStatement pq:P585 ?timeWDAll.
}
GROUP BY ?wikiURI
}
}
有没有更好更快的解决方案?上面的代码片段应该都适用于:https://query.wikidata.org
看来您只需添加一行就可以提高查询的性能:
SELECT ?wikiURI ?timeWD ?popWD WHERE {
?wikiURI wdt:P31 wd:Q70208. #-- this line
?wikiURI p:P1082 ?popWDStatement.
?popWDStatement ps:P1082 ?popWD;
pq:P585 ?timeWD.
{
SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE {
?wikiURI wdt:P31 wd:Q70208;
p:P1082 ?popWDStatement.
?popWDStatement pq:P585 ?timeWDAll.
}
GROUP BY ?wikiURI
}
}
看看这些查询执行计划(向下滚动到“查询评估统计”部分):
- modified query(含
?wikiURI wdt:P31 wd:Q70208
),
- original query(没有
?wikiURI wdt:P31 wd:Q70208
)。
此外,下面的变体似乎更具可读性和适应性:
SELECT ?wikiURI ?timeWD ?popWD WHERE {
?wikiURI wdt:P31 wd:Q70208.
?wikiURI p:P1082 ?popWDStatement.
?popWDStatement ps:P1082 ?popWD;
pq:P585 ?timeWD.
FILTER NOT EXISTS {
?wikiURI wdt:P31 wd:Q70208. #-- this line is important for performance
?wikiURI p:P1082 ?popWDStatement_.
?popWDStatement_ ps:P1082 ?popWD_;
pq:P585 ?timeWD_.
FILTER (?timeWD_ > ?timeWD)}
} ORDER BY DESC(?popWD)
我想借助维基数据了解瑞士城市的最新人口。要获得具有首选等级的那些很容易但没有帮助。我有以下 SPARQL 查询,但现在我无法从聚合中预测最新日期(不仅是日期)的实际人口计数 ?popWD
。据我了解,您不能预测未聚合的值。
SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE {
?wikiURI wdt:P31 wd:Q70208;
p:P1082 ?popWDStatement.
?popWDStatement pq:P585 ?timeWDAll;
ps:P1082 ?popWD.
}
GROUP BY ?wikiURI
我用一个子选择解决了这个问题,它确实有效,但看起来有点复杂而且很慢:
SELECT ?wikiURI ?timeWD ?popWD WHERE {
?wikiURI p:P1082 ?popWDStatement.
?popWDStatement ps:P1082 ?popWD;
pq:P585 ?timeWD.
{
SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE {
?wikiURI wdt:P31 wd:Q70208;
p:P1082 ?popWDStatement.
?popWDStatement pq:P585 ?timeWDAll.
}
GROUP BY ?wikiURI
}
}
有没有更好更快的解决方案?上面的代码片段应该都适用于:https://query.wikidata.org
看来您只需添加一行就可以提高查询的性能:
SELECT ?wikiURI ?timeWD ?popWD WHERE {
?wikiURI wdt:P31 wd:Q70208. #-- this line
?wikiURI p:P1082 ?popWDStatement.
?popWDStatement ps:P1082 ?popWD;
pq:P585 ?timeWD.
{
SELECT ?wikiURI (max(?timeWDAll) AS ?timeWD) WHERE {
?wikiURI wdt:P31 wd:Q70208;
p:P1082 ?popWDStatement.
?popWDStatement pq:P585 ?timeWDAll.
}
GROUP BY ?wikiURI
}
}
看看这些查询执行计划(向下滚动到“查询评估统计”部分):
- modified query(含
?wikiURI wdt:P31 wd:Q70208
), - original query(没有
?wikiURI wdt:P31 wd:Q70208
)。
此外,下面的变体似乎更具可读性和适应性:
SELECT ?wikiURI ?timeWD ?popWD WHERE {
?wikiURI wdt:P31 wd:Q70208.
?wikiURI p:P1082 ?popWDStatement.
?popWDStatement ps:P1082 ?popWD;
pq:P585 ?timeWD.
FILTER NOT EXISTS {
?wikiURI wdt:P31 wd:Q70208. #-- this line is important for performance
?wikiURI p:P1082 ?popWDStatement_.
?popWDStatement_ ps:P1082 ?popWD_;
pq:P585 ?timeWD_.
FILTER (?timeWD_ > ?timeWD)}
} ORDER BY DESC(?popWD)