使用多个可选限定符获取多个可选属性(Wikidata查询服务,SPARQL)
我想通过Wikidata查询服务加载特定人类的以下数据: 属性使用多个可选限定符获取多个可选属性(Wikidata查询服务,SPARQL),sparql,wikidata,Sparql,Wikidata,我想通过Wikidata查询服务加载特定人类的以下数据: 属性 出生日期 生活方式 限定符 生活方式的开始时间 生活方式的终结时间 我希望输出中每个人都有一行,不管是没有设置属性/限定符还是设置了多个属性/限定符 我设法创建了一个查询,该查询适用于至少有一种生活方式的人,但如果没有,则查询需要很长时间,而且许多生活方式不是空单元格,而是加载与人无关的开始和结束时间 这是对人类Q185140、Q463434和Q3378937的查询,Q3378937没有生活方式,但生活方式、生活方式开始和生
- 出生日期
- 生活方式
- 生活方式的开始时间
- 生活方式的终结时间
SELECT ?human ?humanLabel
(GROUP_CONCAT(DISTINCT ?lifestyleLabel;separator="|") AS ?lifestyles)
(GROUP_CONCAT(DISTINCT ?lifestyleStart;separator="|") AS ?lifestylesStarts)
(GROUP_CONCAT(DISTINCT ?lifestyleEnd;separator="|") AS ?lifestylesEnds)
(GROUP_CONCAT(DISTINCT ?dateBirth;separator="|") AS ?dateBirths)
WHERE {
VALUES ?human { wd:Q185140 wd:Q463434 wd:Q3378937 } .
OPTIONAL{ ?human p:P1576 ?statement . }
OPTIONAL{ ?statement ps:P1576 ?lifestyle . }
OPTIONAL{ ?statement pq:P580 ?lifestyleStart . }
OPTIONAL{ ?statement pq:P582 ?lifestyleEnd . }
OPTIONAL{ ?human wdt:P569 ?dateBirth . }
SERVICE wikibase:label {
bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" .
?human rdfs:label ?humanLabel .
?lifestyle rdfs:label ?lifestyleLabel .
}
}
GROUP BY ?human ?humanLabel
您可以运行查询并查看输出
如果未设置属性/限定符,我必须更改什么才能获取空单元格??1.使用嵌套的
可选s2。不要以可选开头。3.关于第3点->“我希望输出中每个人都有一行,无论是否设置了属性/限定符或多个属性/限定符。”-因此,如果一个人有多种生活方式,我假设是的。但是:主要的问题是,对于多种生活方式,一切都会混淆,也就是说,你不会知道什么时候开始和结束哪种生活方式之间的关系,因为正如你所知,group_concat
——所以在当前的例子中,“Marianne Thieme”不可能知道它们之间的关系“素食主义|素食主义”和我们去的日期选择():选择人类标签(GROUP_-CONCAT(DISTINCT?lifesty;separator=“|”)作为生活方式)(GROUP_-CONCAT(DISTINCT?dateborning;separator=“|”)作为日期出生)其中{value?human{wd:Q185140 wd:q4634434 wd:Q3378937}。人类wd:P31 wd:Q5。
可选{人类p:P1576?语句。?语句ps:P1576/rdfs:label?Lifestyle标签过滤器(lang(?Lifestyle label)='en')可选{语句pq:P580?Lifestyle Start}可选{语句pq:P582?Lifestyle End}绑定(IF(绑定(?Lifestyle End),CONCAT(“-”,str(?Lifestyle End)),“”)as?lsEndText绑定(CONCAT(str(?Lifestyle label)),“,str(?lifestyleStart),?lsEndText,“)”)作为?生活方式)}可选{人类wdt:P569?日期出生。}服务wikibase:label{bd:serviceParam wikibase:language“[AUTO_language],en”。?人类rdfs:label?人类标签。}GROUP BY?human?humanLabel
@UninformedUser您对Stanislav的3.点的看法是正确的。您的代码很好地解决了您提到的问题,非常感谢!