SPARQL按标签查询筛选器位置

SPARQL按标签查询筛选器位置,sparql,wikidata,Sparql,Wikidata,我是SPARQL新手,需要一个查询来获取位于特定城市(财产“总部位置”)的所有企业。 该位置应作为字符串传递,如“纽约市” 我目前只能查询特定于一个城市的所有业务(基于实体)。我的查询如下所示: SELECT DISTINCT ?item ?itemLabel ?website ?location WHERE { ?item (p:P31/(wdt:P279*)) ?item_s_0Statement. ?item_s_0Statement (ps:P31/(wdt:P279*)) wd

我是SPARQL新手,需要一个查询来获取位于特定城市(财产“总部位置”)的所有企业。 该位置应作为字符串传递,如“纽约市”

我目前只能查询特定于一个城市的所有业务(基于实体)。我的查询如下所示:

SELECT DISTINCT ?item ?itemLabel ?website ?location WHERE {
  ?item (p:P31/(wdt:P279*)) ?item_s_0Statement.
  ?item_s_0Statement (ps:P31/(wdt:P279*)) wd:Q4830453.
  ?item p:P159 ?location.
  ?location ps:P159 wd:Q60.
  OPTIONAL { ?item wdt:P856 ?website. }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en, de". }
}
此示例返回位于Q60(纽约市)的所有业务。
应该是查询只使用“纽约市”作为字符串,这样它很容易被替换。

您的意思是:
选择不同的?项目?项目标签?网站?位置{?项目(p:P31/(wdt:P279*))?项目声明。?项目声明(ps:P31/(wdt:P279*))wd:Q4830453。?项目p:P159?位置。?位置ps:P159?位置。?位置rdfs:label“New York City”@en。可选{项目wdt:P856?网站。}服务wikibase:label{bd:serviceParam wikibase:language“en,de”}
?关于此查询的一条注释:显然需要提前知道确切的标签。如果有些地方有相同的标签,你就迷路了。顺便说一下,这就是为什么RDF中的实体由URI标识的原因。除了按精确标签匹配进行查找之外,任何内容都需要通过
regex
或类似方式进行某种字符串匹配。@AKSW您建议如何使用regex编写它,而不仅仅是引用标签?我不建议,我只是说一些正则表达式或其他类型的字符串函数可能在某种程度上比使用精确的标签有所帮助。我不知道您的用途/案例,但假设输入是“纽约市”——这与标签不匹配,因为所有内容都区分大小写。在这里,一些规范化(如使标签和输入字符串小写)可能会有所帮助。例如,
VALUES?inputStr{“HERE_YOUR_INPUT_STRING”}放置rdfs:label?label filter(lcase(str(?label))=lcase(?inputStr))
-我想你得到的想法是这样的:
SELECT DISTINCT?item?itemlab?website?位置,{?item(p:P31/(wdt:P279*)?item_0语句。?item_0语句(ps:P31/(wdt:P279*))wd:Q4830453。?项目p:P159?位置。?位置ps:P159?位置。?位置rdfs:label“New York City”@en。可选{项目wdt:P856?网站。}服务wikibase:label{bd:serviceParam wikibase:language“en,de”}
?关于此查询的一条注释:显然需要提前知道确切的标签。如果有些地方有相同的标签,你就迷路了。顺便说一下,这就是为什么RDF中的实体由URI标识的原因。除了按精确标签匹配进行查找之外,任何内容都需要通过
regex
或类似方式进行某种字符串匹配。@AKSW您建议如何使用regex编写它,而不仅仅是引用标签?我不建议,我只是说一些正则表达式或其他类型的字符串函数可能在某种程度上比使用精确的标签有所帮助。我不知道您的用途/案例,但假设输入是“纽约市”——这与标签不匹配,因为所有内容都区分大小写。在这里,一些规范化(如使标签和输入字符串小写)可能会有所帮助。例如,
VALUES?inputStr{“HERE\u YOUR\u INPUT\u STRING”}放置rdfs:label?label filter(lcase(str(?label))=lcase(?inputStr))
-我想你明白了