跳轉到內容

SPARQL/三元組

來自華夏公益教科書,開放世界開放書籍

語句“天空是藍色的”包含主體(“天空”)、謂詞(“是”)和賓語(“藍色”)。

SPO 或“主體、謂詞、賓語”被稱為(語義)三元組,在維基資料中通常被稱為關於資料的陳述。

SPO 也用作查詢 RDF 資料結構或任何圖資料庫或三元組儲存(如維基資料查詢服務 (WDQS))的基本語法佈局形式。

另見 w:en:語義三元組

在維基資料查詢服務 (WDQS) 中,三元組用於描述查詢模式SELECT 語句WHERE 子句中。

# ?child  father   Bach
  ?child wdt:P22 wd:Q1339.

在這種情況下,三元組?child wdt:p22 wd:Q1339 指定變數?child 必須具有父/父親巴赫。

三元組的任何部分主體、謂詞和賓語都可能是變數。這使得這種選擇非常靈活。

具有相同主體的三元組

[編輯 | 編輯原始碼]
Example of SPARQL Triples
SPARQL 三元組示例

可以透過新增額外的三元組來新增額外的變數。在最簡單的情況下,這些三元組使用相同的主體。

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 BYGROUP_CONCATDISTINCT,並且所有標籤都應在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:dateModifiedwikibase:statementswikibase: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". }
}

試試吧!


華夏公益教科書