对Wikibase的查询:label REGEX&;斯特伦

对Wikibase的查询:label REGEX&;斯特伦,regex,sparql,strlen,wikidata,Regex,Sparql,Strlen,Wikidata,我是SparkQL和wikidata的新手,我正在尝试查询以下内容: 男歌手(艺术家/表演者) 谁还活着 给定名称=6个字符 给定名称不包含(“e”、“i”、“u”) 我对给定名称的过滤器有问题(我相信这是因为它们引用了“服务wikibase:label”)。我试过用“拥有”这个词,但没有用。是将查询和筛选嵌套在上面的正确操作,还是有更优雅的方法 #——男性艺术家 选择不同的?m?givennameLabel(STRLEN(?givennameLabel)作为?Namechars) ?标签?

我是SparkQL和wikidata的新手,我正在尝试查询以下内容:

  • 男歌手(艺术家/表演者)
  • 谁还活着
  • 给定名称=6个字符
  • 给定名称不包含(“e”、“i”、“u”)
我对给定名称的过滤器有问题(我相信这是因为它们引用了“服务wikibase:label”)。我试过用“拥有”这个词,但没有用。是将查询和筛选嵌套在上面的正确操作,还是有更优雅的方法

#——男性艺术家
选择不同的?m?givennameLabel(STRLEN(?givennameLabel)作为?Namechars)
?标签?标签在哪里{
?m wdt:P31 wd:Q5。
?m wdt:P21 wd:Q6581097。
m wdt:P735?吉文纳姆。
?m wdt:P27?pl。
?m(wdt:P106/wdt:P279*)wd:Q483501。
可选{?m wdt:P175?执行者。}
可选{?m wdt:P570?d}
滤子(!界(?d))
服务wikibase:标签{bd:serviceParam wikibase:语言“en”。}
过滤器(!regex(?givennameLabel,“(e | i | u)”)。#无记录
过滤器(STRLEN(?givennameLabel)=6)#无记录
}#HAVING(!regex(?givennameLabel,“(e | i | u)”)#返回“坏聚合”
限制50

我认为这样的事情应该行得通,尽管它不起作用

BIND(STRLEN(str(?givennameLabel))as?NL)
过滤器(?NL=6)
好的,我想我发现了问题:看起来你调用了一些“神奇”服务,它创建了一些变量
givennameLabel
。对我来说听起来很奇怪,但这可能会导致一个事实,即变量在过滤时不受约束。如果将整个查询放在子选择中,它将起作用:

#男性艺术家
选择*WHERE{
{
选择不同的?m?givennameLabel(STRLEN(?givennameLabel)作为?Namechars)
?标签?标签在哪里{
?m wdt:P31 wd:Q5。
?m wdt:P21 wd:Q6581097。
m wdt:P735?吉文纳姆。
?m wdt:P27?pl。
?m(wdt:P106/wdt:P279*)wd:Q483501。
可选{?m wdt:P175?执行者。}
可选{?m wdt:P570?d}
滤子(!界(?d))
服务wikibase:标签{bd:serviceParam wikibase:语言“en”。}
} 
限制50
}
过滤器(!regex(?givennameLabel,“(e | i | u)”)。
过滤器(STRLEN(?givennameLabel)=6)
} 
更新

建议的查询只考虑50个资源,没有限制会导致超时。如用户3240704所述, 另一种解决方案是避免使用

SERVICE
子句,而是使用
rdfs:label

#男性艺术家
选择不同的?m?givennameLabel(STRLEN(?givennameLabel)作为?Namechars)
?mLabel?plLabel
在哪里{
?m wdt:P31 wd:Q5。
?m wdt:P21 wd:Q6581097。
m wdt:P735?吉文纳姆。
?m wdt:P27?pl。
?m(wdt:P106/wdt:P279*)wd:Q483501。
可选{?m wdt:P175?执行者。}
可选{?m wdt:P570?d}
滤子(!界(?d))
?givenname rdfs:标签?标签
过滤器(LANG(?label)=“en”)。
过滤器(!regex(?label,“(e | i | u)”)。
过滤器(STRLEN(?label)=6)}
} 
限制50

必须在分组后过滤结果。过滤器是正确的。查询是否返回没有(regex和strlen)过滤器的结果?如果是,则只使用其中一个过滤器。是的,一旦两行都被注释掉,查询将返回预期结果。如果应用了任一筛选器,则不会返回任何结果。我还在测试行中的字符数(STRLEN(?givennameLabel)作为?Namechars)问题是
givennameLabel
没有绑定…我没有看到任何三重模式,只有过滤器谢谢!我遇到了“magic”服务,它似乎可以工作,但如果我扩展范围(注释掉限制),查询可能会超时。我将研究另一种方法,如您所述,使用三重模式,或者绑定givennameLabelI最终绑定?标签,从而扩展范围
?givenname rdfs:label?标签过滤器(LANG(?label)=“en”)。过滤器(!regex(?label,“(e | i | u)”)。过滤器(STRLEN(?label)=6)
对,这可能是查询
rdfs:label
的更好的解决方案。我想知道
wikibase:label
服务的背后是什么,以及它是如何工作的。我将查看文档。好的,这是一个标签服务,具有一些很好的特性,如语言回退等:这是我第一次查询SparQL/Wiki数据。我觉得我现在明白多了,谢谢你耐心的回答。TDLR:wikibase:label服务就像一个字典,您不能对它进行查询。如果要查询数据,请绑定值