SPARQL/WIKIDATA 限定词、引用和排名
WIKIDATA 上的数据包含的信息不仅仅是三元组。有关完整描述,请参阅维基数据:词汇表.
让我们看一下道格拉斯·亚当斯 (Q42) 以及他在哪里接受教育 (P69).
让我们列出道格拉斯·亚当斯的教育以及限定词 开始时间 结束时间
SELECT ?education ?educationLabel ?starttime ?endtime
WHERE
{
wd:Q42 p:P69 ?statement.
?statement ps:P69 ?education.
?statement pq:P580 ?starttime.
?statement pq:P582 ?endtime.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?starttime
该前缀 p:
指向的不是对象,而是语句节点。然后,该节点就是其他三元组的主语。
语句节点内的前缀 ps:
检索对象。
语句节点内的前缀 pq:
检索限定词信息。
使用 [ ] 语法 可以通过消除变量 ?statement
来极大地缩写代码。
SELECT ?education ?educationLabel ?starttime ?endtime
WHERE
{
wd:Q42 p:P69 [ps:P69 ?education;
pq:P580 ?starttime;
pq:P582 ?endtime;
].
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?starttime
让我们列出道格拉斯·亚当斯的教育以及所述 (P248) 引用
SELECT ?education ?educationLabel ?ref ?refLabel
WHERE
{
wd:Q42 p:P69 ?statement.
?statement ps:P69 ?education.
?statement prov:wasDerivedFrom ?refnode.
?refnode pr:P248 ?ref.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
该前缀 p:
指向的不是对象,而是语句节点。然后,该节点就是其他三元组的主语。
语句节点内的前缀 ps:
检索对象。
语句节点内的 prov:wasDerivedFrom
指向新的引用节点。
引用节点内的前缀 pr:
检索引用信息。
使用 [ ] 语法 可以通过消除变量 ?statement
和 ?refnode
来极大地缩写代码。
SELECT ?education ?educationLabel ?ref ?refLabel
WHERE
{
wd:Q42 p:P69 [ ps:P69 ?education;
prov:wasDerivedFrom
[ pr:P248 ?ref;
]
].
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
您可能已经注意到,以上查询中只列出了两种教育中的一种。要列出这两种,我们需要引入 OPTIONAL{ }
。由于这只能与完整句子一起使用,因此我们需要使用包含三元组作为短句的完整展开语法
SELECT ?education ?educationLabel ?ref ?refLabel
WHERE
{
wd:Q42 p:P69 ?statement.
?statement ps:P69 ?education.
OPTIONAL{ ?statement prov:wasDerivedFrom ?refnode.
?refnode pr:P248 ?ref.
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
让我们列出道格拉斯·亚当斯的教育及其排名
SELECT ?education ?educationLabel ?rank
WHERE
{
wd:Q42 p:P69 ?statement.
?statement ps:P69 ?education.
?statement wikibase:rank ?rank.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
该前缀 p:
指向的不是对象,而是语句节点。然后,该节点就是其他三元组的主语。
语句节点内的前缀 ps:
检索对象。
语句节点内的 wikibase:rank
检索排名信息。
使用 [ ] 语法 可以通过消除变量 ?statement
来极大地缩写代码。
SELECT ?education ?educationLabel ?rank
WHERE
{
wd:Q42 p:P69 [ps:P69 ?education;
wikibase:rank ?rank;
].
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
一个具有不同排名的示例是柏林所处的(历史)国家。
# Berlins countries and ranking
SELECT ?country ?countryLabel ?rank
WHERE
{
wd:Q64 p:P17 [ps:P17 ?country;
wikibase:rank ?rank;
].
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
排名的三个可能值是 wikibase:PreferredRank
、wikibase:NormalRank
和 wikibase:DeprecatedRank
将其与普通三元组进行比较,普通三元组将只选择具有最高排名的值。在这种情况下,只有首选排名值 德国 (Q183)。
# Berlins countries via normal triples
SELECT ?country ?countryLabel
WHERE
{
wd:Q64 wdt:P17 ?country.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
排名可能会导致意外结果。例如,考虑以下查询,它将返回所有与阿尔芬 aan den Rijn (Q213246) 接壤的荷兰市。
select ?muni ?muniLabel where {
?muni wdt:P31 wd:Q2039348;
wdt:P47 wd:Q213246.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
这将不会显示博斯科普 (Q894442),因为其对 荷兰市 (Q2039348) 的排名是“普通”,而其他三个对实例 (P31) 的值是“首选”。为了在之前的查询中也看到博斯科普,请像这样重写查询
select ?muni ?muniLabel where {
?muni p:P31 [ps:P31 wd:Q2039348];
wdt:P47 wd:Q213246.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
或者使用属性路径来缩短查询,如下所示
select ?muni ?muniLabel where {
?muni p:P31/ps:P31 wd:Q2039348;
wdt:P47 wd:Q213246.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
示例 | ||
---|---|---|
语句 | wd:Q42 wdt:P69 wd:Q691283. 或 wd:Q42 p:P69 ?s. ?s ps:P69 wd:Q691283. 或 wd:Q42 p:P69 [ ps:P69 wd:Q691283 ]. |
|
排名 | wd:Q42 p:P69 [ wikibase:rank ?rank ]. | |
限定词 | wd:Q42 p:P69 [ pq:P580 ?qualifier ]. | |
引用 | wd:Q42 p:P69 [ prov:wasDerivedFrom [ pr:P248 ?ref ] ]. |
道格拉斯·亚当斯教育的完整查询,包括排名、限定词和引用,可能看起来像
# Douglas Adams education, with rank, qualifiers and references
SELECT ?education ?educationLabel ?rank ?starttime ?endtime ?ref ?refLabel
WHERE
{
wd:Q42 p:P69 ?statement.
?statement ps:P69 ?education.
# rank
?statement wikibase:rank ?rank.
# qualifiers
OPTIONAL{ ?statement pq:P580 ?starttime. }
OPTIONAL{ ?statement pq:P582 ?endtime. }
# references
OPTIONAL{ ?statement prov:wasDerivedFrom ?refnode.
?refnode pr:P248 ?ref.
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?starttime