SPARQL/OPTIONAL
外观
< SPARQL
使用一个 三元组 ?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
结果是,当其中一个变量在数据中丢失时,所有变量都将为空。
这在变量紧密关联的情况下可能很有用。