跳到內容

SPARQL/OPTIONAL

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

使用一個 三元組 ?person wdt:P569 ?birth_date 可以檢索一個人的出生日期。但可能存在某些情況下,一個人的出生日期未知。在這種情況下,此三元組將充當選擇器:只有具有出生日期的人才會被選中。

但這並不是我們想要的結果:我們主要希望包括這個人,如果還有其他資料可用,我們希望列出這些資料,但我們不想讓這些資料限制我們的結果列表。

解決方法是告訴 WDQS 這些三元組是 OPTIONAL

SELECT ?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". }
}
ORDER BY ?child

試試吧!

如果沒有 OPTIONAL,奧巴馬的兩個孩子都不會被顯示出來,因為任何一個孩子的死亡日期都沒有填寫。

一般情況下,您不應該將所有可選的三元組都包含在一個 OPTIONAL { } 語句中。

SELECT ?child ?childLabel ?genderLabel ?birth_date ?date_of_death
WHERE
{
  ?child wdt:P22 wd:Q76.# ?child  has father   Obama
  OPTIONAL{ ?child wdt:P21 ?gender.            # In general you should NOT include all optional triplets into one sentence   
            ?child wdt:P569 ?birth_date. 
            ?child wdt:P570 ?date_of_death. 
          }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?child

試試吧!

結果是,當其中一個變數在資料中丟失時,所有變數都將為空。

這在變數緊密關聯的情況下可能很有用。


華夏公益教科書