我正在尝试查询拥有 Linkedin 标识符、ISINS、LEI 或英文网站的企业。如果可能的话,我只想要每个公司一行数据。
我正在努力解决最后一部分,我想我成功地确定了我只想填充英文网站,但实际的 URL 并未填充在结果中。
SELECT DISTINCT ?item ?itemLabel ?linkedin ?isin ?lei ?website WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
{
SELECT DISTINCT ?item ?linkedin ?isin ?lei ?website WHERE {
?item wdt:P31 wd:Q4830453.
{
?item wdt:P4264 ?linkedin.}
UNION
{
?item wdt:P946 ?isin.}
UNION
{
?item wdt:P1278 ?lei.}
UNION
{
?item wdt:P856 ?statement0.
?statement0 p:P856 [ps:P856 ?website ; pq:P407 wd:Q1860] }
}
LIMIT 100
}
}
其他数据正在填充,但网站尚未填充。我还获得了每个公司的多条记录。
首先要注意的是
?item wdt:P856 ?statement0.
?statement0 p:P856 [ps:P856 ?website ; pq:P407 wd:Q1860]
不是您想要的,只需使用
?item p:P856 [ps:P856 ?website ; pq:P407 wd:Q1860] .
。
实现此目的的正确方法是首先选择所有至少具有一个此类语句的
?item
(使用 UNION
),然后使用 OPTIONAL
获取所有且仅在 中实际指定的语句?item
。
生成的查询类似于:
SELECT DISTINCT ?item ?itemLabel ?linkedin ?isin ?lei ?website WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
OPTIONAL { ?item wdt:P4264 ?linkedin . }
OPTIONAL { ?item wdt:P946 ?isin . }
OPTIONAL { ?item wdt:P1278 ?lei . }
OPTIONAL { ?item p:P856 [ps:P856 ?website ; pq:P407 wd:Q1860] . }
{
SELECT DISTINCT ?item WHERE {
?item wdt:P31 wd:Q4830453 .
{ ?item wdt:P4264 ?linkedin . }
UNION
{ ?item wdt:P946 ?isin . }
UNION
{ ?item wdt:P1278 ?lei . }
UNION
{ ?item p:P856 [ps:P856 ?website ; pq:P407 wd:Q1860] . }
hint:SubQuery hint:runOnce true .
}
LIMIT 100
}
hint:Prior hint:runFirst true .
}