SPARQL/三元組
語句“天空是藍色的”包含主體(“天空”)、謂詞(“是”)和賓語(“藍色”)。
SPO 或“主體、謂詞、賓語”被稱為(語義)三元組,在維基資料中通常被稱為關於資料的陳述。
SPO 也用作查詢 RDF 資料結構或任何圖資料庫或三元組儲存(如維基資料查詢服務 (WDQS))的基本語法佈局形式。
另見 w:en:語義三元組
在維基資料查詢服務 (WDQS) 中,三元組用於描述查詢模式在SELECT 語句的WHERE 子句中。
# ?child father Bach ?child wdt:P22 wd:Q1339.
在這種情況下,三元組?child wdt:p22 wd:Q1339 指定變數?child 必須具有父/父親巴赫。
三元組的任何部分主體、謂詞和賓語都可能是變數。這使得這種選擇非常靈活。

可以透過新增額外的三元組來新增額外的變數。在最簡單的情況下,這些三元組使用相同的主體。
SELECT ?child ?childLabel ?genderLabel ?birth_date ?date_of_death
WHERE
{
?child wdt:P22 wd:Q1339.# ?child has father Bach
?child wdt:P21 ?gender.
?child wdt:P569 ?birth_date.
?child wdt:P570 ?date_of_death.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
第一個三元組選擇巴赫的所有孩子。額外的三元組將所有這些三元組與性別、出生日期和死亡日期的值連結在一起。變數?child 將它們全部連結在一起。
如果你仔細觀察結果,你可能會注意到約翰·克里斯托夫·弗里德里希·巴赫在列表中有 2 行,因為有 2 個不同的出生日期,6 月 21 日和 23 日 1732 年。在他的情況下,?child wdt:P569 ?birth_date. 產生了 2 個值。有關更多詳細資訊,請參閱刪除重複項和修飾符。
如果並非所有主體都對某個三元組有值,則該主體將被排除。為了將其包括在內,OPTIONAL 關鍵字非常有用。
SELECT DISTINCT ?child ?childLabel ?genderLabel ?birth_date ?date_of_death
WHERE
{
?child wdt:P22 wd:Q76.# ?child has father Obama
OPTIONAL{ ?child wdt:P21 ?gender. }
OPTIONAL{ ?child wdt:P569 ?birth_date. }
OPTIONAL{ ?child wdt:P570 ?date_of_death. }
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
兩個孩子都顯示出來,即使其中一個變數(在本例中是死亡日期)沒有填寫。
有關完整說明,請參閱可選章節。
三元組不限於一個主體。事實上,三元組可以以任何可想象的方式連結。
例如,你可以列出巴赫子女出生地點的座標。
SELECT ?child ?childLabel ?placeofbirthLabel ?coordinates
WHERE
{
?child wdt:P22 wd:Q1339.# ?child has father Bach
?child wdt:P19 ?placeofbirth.
?placeofbirth wdt:P625 ?coordinates.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?placeofbirthLabel
你甚至可以透過使用#defaultView:Map 在地圖上看到這些出生地點(科騰、萊比錫和魏瑪)。
#defaultView:Map
SELECT ?placeofbirthLabel ?coordinates
(GROUP_CONCAT(DISTINCT ?childLabel; SEPARATOR=", ") AS ?children)
WHERE
{
?child wdt:P22 wd:Q1339.# ?child has father Bach
?child wdt:P19 ?placeofbirth.
?placeofbirth wdt:P625 ?coordinates.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en".
?child rdfs:label ?childLabel.
?placeofbirth rdfs:label ?placeofbirthLabel.
}
}
GROUP BY ?placeofbirthLabel ?coordinates ?children
如果你點選一個紅點,你將獲得如上所述的附加資料,使用變數?placeofbirthLabel 和?children。我們必須使用GROUP BY、GROUP_CONCAT、DISTINCT,並且所有標籤都應在SERVICE 中明確定義。你可以透過“顯示”下拉列表(位於“執行”按鈕的右側)在“地圖”顯示和標準表格顯示之間切換。
一個示例,使用主體作為變數的三元組:
SELECT ?child ?childLabel
WHERE
{
?child wdt:P22 wd:Q1339. # ?child has father Bach
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
這將列出所有主體(作為變數?child),具有謂詞父親 (P22) 和賓語約翰·塞巴斯蒂安·巴赫 (Q1339)。
一個示例,使用謂詞作為變數的三元組:
SELECT ?predicate ?pLabel
WHERE
{
wd:Q57225 ?predicate wd:Q1339. # Johann Christoph Friedrich Bach ?predicate Johann Sebastian Bach
BIND( IRI(REPLACE( STR(?predicate),"prop/direct/","entity/" )) AS ?p).
# or ?p wikibase:directClaim ?predicate.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
這將列出所有謂詞(作為變數?predicate),具有賓語約翰·克里斯托夫·弗里德里希·巴赫 (Q57225) 和主體約翰·塞巴斯蒂安·巴赫 (Q1339)。
它表明他不僅是他的父親 (P22),而且也是他的學生 (P1066)
一個示例,使用賓語作為變數的三元組:
SELECT ?workloc ?worklocLabel
WHERE
{
wd:Q1339 wdt:P937 ?workloc. # Bach work location ?workloc
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
這將列出所有賓語(作為變數?workloc),具有主體約翰·塞巴斯蒂安·巴赫 (Q1339) 和謂詞工作地點 (P937)。
一個示例,使用 2 個變數,並且主體只有一個固定值,將列出關於巴赫的所有原始資訊,在維基資料中可用。
SELECT ?predicate ?object
WHERE
{
wd:Q1339 ?predicate ?object. # Bach
}
有關更多用法,請參閱下一節中包含 3 個變數的三元組。
一個示例,使用 2 個變數,並且謂詞只有一個固定值,將列出所有具有 IATA 機場程式碼的主體(可能是機場)。
SELECT ?subject ?subjectLabel ?object
WHERE
{
?subject wdt:P238 ?object. # IATA airport code
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?object
一個用法可以是檢查重複的 IATA 程式碼。
SELECT ?object (COUNT(?subject) AS ?count)
(MIN(?subject) AS ?subject1) (MAX(?subject) AS ?subject2)
(GROUP_CONCAT(DISTINCT ?subjectLabel; SEPARATOR=", ") AS ?subjectLabels)
WHERE
{
?subject wdt:P238 ?object. # IATA airport code
SERVICE wikibase:label { bd:serviceParam wikibase:language "en".
?subject rdfs:label ?subjectLabel.
}
}
GROUP BY ?object
HAVING(COUNT(?subject) > 1)
ORDER BY ?object
一個示例,使用 2 個變數,並且賓語只有一個固定值,將列出所有與巴赫相關的主體。
SELECT ?subject ?subjectLabel ?subjectDescription ?predicate ?pLabel
WHERE
{
?subject ?predicate wd:Q1339. # Bach
BIND( IRI(REPLACE( STR(?predicate),"prop/direct/","entity/" )) AS ?p).
# or ?p wikibase:directClaim ?predicate.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?subject
使用賓語作為固定值的另一個可能性將列出所有具有值“ABC”的主體,並將顯示例如阿爾瓦塞特機場。
SELECT ?subject ?subjectLabel ?subjectDescription ?predicate ?pLabel
WHERE
{
?subject ?predicate "ABC".
BIND( IRI(REPLACE( STR(?predicate),"prop/direct/","entity/" )) AS ?p).
# or ?p wikibase:directClaim ?predicate.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?subject
當你使用所有 3 個變數作為變數(一個用於主體,一個用於謂詞,一個用於賓語)的三元組時,你實際上將列出整個資料庫。這對於小型資料庫可以做到,也可以用於大致瞭解所有可用屬性上的可用資料。
關於巴赫子女的所有原始資訊,在維基資料中可用。
SELECT ?subject ?predicate ?object
WHERE
{
?subject ?predicate ?object.
?subject wdt:P22 wd:Q1339. # subject has father Bach
}
ORDER BY ?subject ?predicate ?object
LIMIT 10000
相同的查詢,但按謂詞分組。
SELECT DISTINCT ?subject ?subjectLabel ?predicate
(GROUP_CONCAT(DISTINCT ?object; SEPARATOR=", ") AS ?objects)
WHERE
{
?subject ?predicate ?object.
?subject wdt:P22 wd:Q1339. # subject has father Bach
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?subject ?subjectLabel ?predicate
ORDER BY ?subject ?subjectLabel ?predicate
LIMIT 10000
從下面的查詢中,你可以發現有關維基資料頁面上次更新日期、語句總數、站點連結數量等的元組。這些分別是schema:dateModified、wikibase:statements 和wikibase:sitelinks。
SELECT ?subject ?subjectLabel ?datemodified ?statements ?sitelinks
WHERE
{
?subject wdt:P22 wd:Q1339. # subject has father Bach
?subject schema:dateModified ?datemodified.
?subject wikibase:statements ?statements.
?subject wikibase:sitelinks ?sitelinks.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}