跳转到内容

SPARQL/修饰符

来自维基教科书,开放的书籍,为开放的世界

SELECT ... WHERE { .. } 有 4 个可选修饰符。有关介绍,请参见SELECT 章节。

五个修饰符是 GROUP BY ...HAVING ...ORDER BY ...LIMIT ...OFFSET ...

让我们考虑一下巴赫的孩子列表,其中还列出了他们的母亲

SELECT ?mother ?motherLabel ?child ?childLabel
WHERE
{
  ?child wdt:P22 wd:Q1339.# ?child has father Bach
  ?child wdt:P25 ?mother.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

让我们按母亲对这个列表进行分组。

SELECT ?mother ?motherLabel (COUNT(?child) AS ?children) 
        (GROUP_CONCAT(DISTINCT ?childLabel; SEPARATOR=", ") AS ?names)
WHERE
{
  ?child wdt:P22 wd:Q1339.# ?child has father Bach
  ?child wdt:P25 ?mother.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". 
                          ?mother rdfs:label ?motherLabel.
                          ?child  rdfs:label ?childLabel.
                         }
}
GROUP BY ?mother ?motherLabel

试试看!

我们对 ?mother?motherLabel 两个变量都使用 GROUP BY,因为如果省略标签,最终会得到“错误的聚合”错误。

首先,我们添加了 (COUNT(?child) AS ?children) 来计算孩子的数量。COUNT聚合函数 MINMAXSUMAVGCOUNTSAMPLE 之一。
首先要注意的是它计算了变量 ?child。还要注意语法是 (COUNT(?var1) AS ?var2)

作为第二条信息,我们使用 (GROUP_CONCAT(DISTINCT ?var1; SEPARATOR=", ") AS ?var2) 添加了每个母亲的孩子的组合列表。

在使用 GROUP_CONCAT 和标签时,所有标签都应在 SERVICE 中明确定义。

HAVING 始终与 GROUP BY 结合使用

SELECT ?mother ?motherLabel (COUNT(?child) AS ?children) 
        (GROUP_CONCAT(DISTINCT ?childLabel; SEPARATOR=", ") AS ?names)
WHERE
{
  ?child wdt:P22 wd:Q1339.# ?child has father Bach
  ?child wdt:P25 ?mother.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". 
                          ?mother rdfs:label ?motherLabel.
                          ?child  rdfs:label ?childLabel.
                         }
}
GROUP BY ?mother ?motherLabel 
HAVING (COUNT(?child)>7)

试试看!

HAVING 将过滤掉不满足指定条件的组。在这种情况下,只显示一位母亲,她有 13 个孩子。

由于 COUNT(?child) 与变量 ?children 绑定,因此 HAVING 子句也可以写成 HAVING (?children>7)

HAVING 子句对于查找重复项可能很有用,例如 HAVING (COUNT(?var)>1)

ORDER BY somethingsomething 对结果进行排序。something 可以是任何表达式或变量。此表达式也可以用 ASC()DESC() 包裹以指定排序顺序(ascending 或 descending)。(如果未指定任何一个,则默认值为升序排序,因此 ASC(something) 等效于 something。)

SELECT ?mother ?motherLabel ?child ?childLabel
WHERE
{
  ?child wdt:P22 wd:Q1339.# ?child has father Bach
  ?child wdt:P25 ?mother.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY DESC(?motherLabel) ?childLabel

试试看!

LIMIT count 将结果列表截断为 count 个结果,其中 count 是任何自然数。例如,LIMIT 10 将查询限制为十个结果。LIMIT 1 仅返回单个结果。

这对于获取前 10 个结果或仅获取 10 个随机结果以查看数据的外观可能很有用。

OFFSET count 可用于跳过前几个结果。OFFSET 100 LIMIT 10 返回第 101-110 条记录。

参考文献

[编辑 | 编辑源代码]


华夏公益教科书