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". }
}
道格拉斯·亞當斯教育的完整查詢,包括排名、限定詞和引用,可能看起來像
# 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