首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Wikibase的质疑:标签REGEX & STRLEN

对Wikibase的质疑:标签REGEX & STRLEN
EN

Stack Overflow用户
提问于 2016-08-08 01:46:39
回答 1查看 647关注 0票数 2

我是SparkQL & wikidata的新手,我试图查询以下内容:

  • 男歌手(艺术家/表演者)
  • 谁还活着
  • 给定名称=6个字符
  • 给定的名称不包含("e“、"i”、"u")

我在命名上的过滤器有问题(我相信这是因为它们引用了"SERVICE wikibase:标签“)。我试着用没有用的方法。是正确的操作来嵌套查询并对其进行筛选,还是有更优雅的方法?

代码语言:javascript
复制
#-- Male artists
SELECT DISTINCT ?m ?givennameLabel (STRLEN(?givennameLabel)AS ?Namechars)
 ?mLabel ?plLabel WHERE {
 ?m wdt:P31 wd:Q5.
 ?m wdt:P21 wd:Q6581097.
 ?m wdt:P735 ?givenname.
 ?m wdt:P27 ?pl.
 ?m (wdt:P106/wdt:P279*) wd:Q483501.
 OPTIONAL { ?m wdt:P175 ?performer. }
 OPTIONAL {?m wdt:P570 ?d } 
 FILTER (!bound(?d))
 SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
FILTER (!regex(?givennameLabel,"(e|i|u)")). #no records
FILTER (STRLEN(?givennameLabel) = 6)        #no records
} #HAVING (!regex(?givennameLabel,"(e|i|u)")) #returns "Bad aggregate"
LIMIT 50 

试试看!

我认为像这样的东西应该能起作用,尽管它不起作用。

代码语言:javascript
复制
BIND(STRLEN(str(?givennameLabel)) as ?NL)
FILTER (?NL = 6) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-08 02:40:06

好的,我想找到了问题:看起来您调用了一些创建变量givennameLabel的“魔术”服务。对我来说,听起来很奇怪,但这可能会导致变量没有绑定到过滤的时间。如果将整个查询放入子选择中,则可以:

代码语言:javascript
复制
#Male artists
SELECT * WHERE {

     {
     SELECT DISTINCT ?m ?givennameLabel (STRLEN(?givennameLabel)AS ?Namechars)
       ?mLabel ?plLabel WHERE {
       ?m wdt:P31 wd:Q5.
       ?m wdt:P21 wd:Q6581097.
       ?m wdt:P735 ?givenname.
       ?m wdt:P27 ?pl.
       ?m (wdt:P106/wdt:P279*) wd:Q483501.
       OPTIONAL { ?m wdt:P175 ?performer. }
       OPTIONAL {?m wdt:P570 ?d } 
       FILTER (!bound(?d))
       SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    } 
    LIMIT 50
    }
  FILTER (!regex(?givennameLabel,"(e|i|u)")).
  FILTER (STRLEN(?givennameLabel) = 6)       
} 

更新

建议的查询只考虑50个资源,没有限制就会导致超时。正如user3240704所提到的,另一种解决方案是避免使用SERVICE子句,而使用rdfs:label

代码语言:javascript
复制
#Male artists
 SELECT DISTINCT ?m ?givennameLabel (STRLEN(?givennameLabel)AS ?Namechars) 
                 ?mLabel ?plLabel 
 WHERE {
   ?m wdt:P31 wd:Q5.
   ?m wdt:P21 wd:Q6581097.
   ?m wdt:P735 ?givenname.
   ?m wdt:P27 ?pl.
   ?m (wdt:P106/wdt:P279*) wd:Q483501.
   OPTIONAL { ?m wdt:P175 ?performer. }
   OPTIONAL {?m wdt:P570 ?d } 
   FILTER (!bound(?d))
   ?givenname rdfs:label ?label 
   FILTER(LANG(?label) ="en"). 
   FILTER (!regex(?label,"(e|i|u)")). 
   FILTER (STRLEN(?label) = 6)}
} 
LIMIT 50
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38820231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档