Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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
Sparql 小组讨论不起作用_Sparql - Fatal编程技术网

Sparql 小组讨论不起作用

Sparql 小组讨论不起作用,sparql,Sparql,我在没有使用group_concat的情况下编写了一个查询,返回了9行,每一行对应爱因斯坦的职业 当我在occupation列上添加group_concat时,该列为null。我不明白我做错了什么。我希望看到的是在职业栏中有一行有9种职业 下面是一个简单的查询 SELECT ?item ?itemLabel ?genderLabel (GROUP_CONCAT(?occupationLabel) AS ?occupations) WHERE { ?item wdt:P31 wd:Q5.

我在没有使用group_concat的情况下编写了一个查询,返回了9行,每一行对应爱因斯坦的职业

当我在occupation列上添加group_concat时,该列为null。我不明白我做错了什么。我希望看到的是在职业栏中有一行有9种职业

下面是一个简单的查询

SELECT ?item ?itemLabel ?genderLabel (GROUP_CONCAT(?occupationLabel) AS ?occupations)
WHERE {
  ?item wdt:P31 wd:Q5.
  ?item ?label "Albert Einstein"@en.
  ?item wdt:P21 ?gender .
  ?item wdt:P106 ?occupation .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?item ?itemLabel ?genderLabel

编辑:

下面是生成重复值的代码

SELECT ?item ?itemLabel ?genderLabel (GROUP_CONCAT(?occupationLabel) AS ?occupations)
WHERE {
  ?item wdt:P31 wd:Q5.
  ?item ?label "Albert Einstein"@en.
  ?item wdt:P21 ?gender .
  OPTIONAL {
    ?item wdt:P106 ?occupation .
    ?occupation rdfs:label ?occupationLabel
    FILTER(LANGMATCHES(LANG(?occupationLabel), 'en'))
  }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?item ?itemLabel ?genderLabel
运行此查询可提供以下信息:

教授物理学家物理学家发明家教育家 教育家大学教师学术科学作家非虚构 作家科学哲学家理论物理学家

教授和物理学家是复制品


第二次编辑

另外值得注意的是,当我将查询修改为不使用
rdfs:label
时,我在“职业”列中得到了正确的具体结果(我已将括号和标签添加到URL中):


因此,我想我现在的问题是,每个ID是否可以获得一个标签?

大致的想法是使用专用的SPARQL三重模式来获得标签,而不是“标签服务”:


它不适用于Wikidata标签服务。您必须使用“好的旧”SPARQL,即
?职业rdfs:label?职业标签。过滤器(langmatches(lang(?职业标签),'en'))
或类似以下内容:
服务wikibase:label{bd:serviceParam wikibase:language“en”。?项目rdfs:label?项目标签。?性别rdfs:label?性别标签。?职业rdfs:label?职业标签}
@AKSW,谢谢你的帮助。我刚才在另一篇文章中找到了相同的语法,是的,这确实有帮助。不过,我现在对结果有另一个问题。即使我使用了
distinct
,结果集中仍然会出现重复。您知道这是为什么吗?您使用
distinct
where?在
组内\u concat
?您从哪里获得副本?请使用
SERVICE-wikibase:label{bd:serviceParam-wikibase:language“en”。?项目rdfs:label?项目标签。?性别rdfs:label?性别标签。?职业rdfs:label?职业标签}
感谢您的解释。您能告诉我是否可以使用此查询进行不区分大小写的搜索吗?使用标准SPARQL,这将非常昂贵,因为您必须扫描数据集中的所有文字值并进行字符串比较:
?项?标签?labelValue。过滤器(lcase(str(?labelValue))=lcase(“阿尔伯特·爱因斯坦”)
我不确定这是否会扩展。或
过滤器(包含(lcase(str(?labelValue),“albert”))
或者,您可以使用带有
i
标志的
regex
函数,但这也很昂贵。最好的情况是使用全文索引,不确定WikidataOk是否存在某些内容。Wikidata未启用全文搜索,但可以通过Blazegraph端点进行搜索。我想您必须使用
过滤器>-基于解决方案。好的,谢谢,AKSW。我担心你会这么说。我已经尝试了你的建议,并且在字符串比较和正则表达式上尝试了连接超时。谢谢你让我指向Blazegraph。我今天会研究这个问题。再次感谢你,伙计!
http://www.wikidata.org/entity/Q121594 (professor) 
http://www.wikidata.org/entity/Q169470 (physicist) 
http://www.wikidata.org/entity/Q205375 (inventor) 
http://www.wikidata.org/entity/Q1231865 (educationalist)
http://www.wikidata.org/entity/Q1622272 (university teacher)
http://www.wikidata.org/entity/Q3745071 (science writer)
http://www.wikidata.org/entity/Q15980158 (non-fiction writer)
http://www.wikidata.org/entity/Q16389557 (philosopher of science)
http://www.wikidata.org/entity/Q19350898(theoretical physicist)
SELECT ?item ?itemLabel ?genderLabel (GROUP_CONCAT(?occupationLabel) AS ?occupations)
WHERE {
  ?item wdt:P31 wd:Q5.
  ?item ?label "Albert Einstein"@en.
  ?item wdt:P21 ?gender .
  OPTIONAL {
    ?item wdt:P106 ?occupation .
  }
  SERVICE wikibase:label { 
    bd:serviceParam wikibase:language "en". 
    ?item rdfs:label ?itemLabel . 
    ?gender rdfs:label ?genderLabel . 
    ?occupation rdfs:label ?occupationLabel 
  }
}
GROUP BY ?item ?itemLabel ?genderLabel