跳到内容

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

试试吧!

结果是,当其中一个变量在数据中丢失时,所有变量都将为空。

这在变量紧密关联的情况下可能很有用。


华夏公益教科书