如何查询美国总统的维基数据?
How to Query Wikidata for US persidents?
如何在维基数据中查询 1970 年后开始担任总统且至少有一个女儿的美国总统?
我知道如何查询美国总统,但我不知道如何过滤我的搜索。
SELECT ?presLabel ?spouseLabel ?picp ?picps ?daughterLabel ?numchild ?start WHERE {
?pres wdt:P31 wd:Q5 .
?pres p:P39 ?position_held_statement .
?position_held_statement ps:P39 wd:Q11696 .
?position_held_statement pq:P580 ?start .
?pres wdt:P26 ?spouse .
?pres wdt:P40 ?childern.
?pres wdt:P40 ?daughter.
?daughter wdt:P21 wd:Q6581072.
?pres wdt:P1971 ?numchild.
OPTIONAL {
?pres wdt:P18 ?picp
}
OPTIONAL {
?spouse wdt:P18 ?picps
}
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
} ORDER BY ?start
没那么难:
您已经有了 xsd:date
类型的开始时间。您现在要做的就是提取年份并使用此值进行过滤:
FILTER(year(?start) > 1970)
你的第二个条件"at least one daughter"隐含地被连接满足,即总统只有在有这样的数据时才匹配。如果你要求"at least two daughters",它会变得更多"interesting",因为那样你就必须按每位总统分组,计算女儿数,最后过滤组:
GROUP BY ?p
HAVING (count(?child) > 2)
您的最终查询:
SELECT ?presLabel ?spouseLabel ?picp ?picps ?daughterLabel ?numchild ?start WHERE {
?pres wdt:P31 wd:Q5 .
?pres p:P39 ?position_held_statement .
?position_held_statement ps:P39 wd:Q11696 .
?position_held_statement pq:P580 ?start .
# the spouse
?pres wdt:P26 ?spouse .
# all daughters
?pres wdt:P40 ?daughter.
?daughter wdt:P21 wd:Q6581072.
# number of children
?pres wdt:P1971 ?numchild.
OPTIONAL {
?pres wdt:P18 ?picp
}
OPTIONAL {
?spouse wdt:P18 ?picps
}
# filter by start date here
FILTER(year(?start) > 1970)
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
} ORDER BY ?start
附加任务
可以在子查询中检索女儿的数量,子查询只需将其放入原始查询中 + 将变量 ?numDaughters
添加到所选变量:
# here we compute the number of daughters
{
select ?pres (count(distinct ?daughter) as ?numDaughters) where {
?pres wdt:P31 wd:Q5 .
?pres p:P39 ?position_held_statement .
?position_held_statement ps:P39 wd:Q11696 .
# all daughters
?pres wdt:P40 ?daughter.
?daughter wdt:P21 wd:Q6581072.
}
group by ?pres
}
如何在维基数据中查询 1970 年后开始担任总统且至少有一个女儿的美国总统?
我知道如何查询美国总统,但我不知道如何过滤我的搜索。
SELECT ?presLabel ?spouseLabel ?picp ?picps ?daughterLabel ?numchild ?start WHERE {
?pres wdt:P31 wd:Q5 .
?pres p:P39 ?position_held_statement .
?position_held_statement ps:P39 wd:Q11696 .
?position_held_statement pq:P580 ?start .
?pres wdt:P26 ?spouse .
?pres wdt:P40 ?childern.
?pres wdt:P40 ?daughter.
?daughter wdt:P21 wd:Q6581072.
?pres wdt:P1971 ?numchild.
OPTIONAL {
?pres wdt:P18 ?picp
}
OPTIONAL {
?spouse wdt:P18 ?picps
}
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
} ORDER BY ?start
没那么难:
您已经有了
xsd:date
类型的开始时间。您现在要做的就是提取年份并使用此值进行过滤:FILTER(year(?start) > 1970)
你的第二个条件"at least one daughter"隐含地被连接满足,即总统只有在有这样的数据时才匹配。如果你要求"at least two daughters",它会变得更多"interesting",因为那样你就必须按每位总统分组,计算女儿数,最后过滤组:
GROUP BY ?p HAVING (count(?child) > 2)
您的最终查询:
SELECT ?presLabel ?spouseLabel ?picp ?picps ?daughterLabel ?numchild ?start WHERE {
?pres wdt:P31 wd:Q5 .
?pres p:P39 ?position_held_statement .
?position_held_statement ps:P39 wd:Q11696 .
?position_held_statement pq:P580 ?start .
# the spouse
?pres wdt:P26 ?spouse .
# all daughters
?pres wdt:P40 ?daughter.
?daughter wdt:P21 wd:Q6581072.
# number of children
?pres wdt:P1971 ?numchild.
OPTIONAL {
?pres wdt:P18 ?picp
}
OPTIONAL {
?spouse wdt:P18 ?picps
}
# filter by start date here
FILTER(year(?start) > 1970)
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
} ORDER BY ?start
附加任务
可以在子查询中检索女儿的数量,子查询只需将其放入原始查询中 + 将变量 ?numDaughters
添加到所选变量:
# here we compute the number of daughters
{
select ?pres (count(distinct ?daughter) as ?numDaughters) where {
?pres wdt:P31 wd:Q5 .
?pres p:P39 ?position_held_statement .
?position_held_statement ps:P39 wd:Q11696 .
# all daughters
?pres wdt:P40 ?daughter.
?daughter wdt:P21 wd:Q6581072.
}
group by ?pres
}