Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个可选限定符获取多个可选属性(Wikidata查询服务,SPARQL)_Sparql_Wikidata - Fatal编程技术网

使用多个可选限定符获取多个可选属性(Wikidata查询服务,SPARQL)

使用多个可选限定符获取多个可选属性(Wikidata查询服务,SPARQL),sparql,wikidata,Sparql,Wikidata,我想通过Wikidata查询服务加载特定人类的以下数据: 属性 出生日期 生活方式 限定符 生活方式的开始时间 生活方式的终结时间 我希望输出中每个人都有一行,不管是没有设置属性/限定符还是设置了多个属性/限定符 我设法创建了一个查询,该查询适用于至少有一种生活方式的人,但如果没有,则查询需要很长时间,而且许多生活方式不是空单元格,而是加载与人无关的开始和结束时间 这是对人类Q185140、Q463434和Q3378937的查询,Q3378937没有生活方式,但生活方式、生活方式开始和生

我想通过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.点的看法是正确的。您的代码很好地解决了您提到的问题,非常感谢!