2

私はSparkQLとwikidataが初めてで、次のクエリを実行しようとしています:

  • 男性歌手(アーティスト・パフォーマー)
  • 誰が生きている
  • 名 = 6 文字
  • 名に含まれていない ("e"、"i"、"u")

与えられた名前のフィルターに問題があります ("SERVICE wikibase:label" を参照しているためだと思います)。HAVING を使用してみましたが、役に立ちませんでした。クエリをネストしてそれをフィルタリングする正しいアクションですか、それとももっとエレガントな方法がありますか?

#-- 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 

それを試してみてください!

うまくいきませんが、このようなものはうまくいくはずだと思います。

BIND(STRLEN(str(?givennameLabel)) as ?NL)
FILTER (?NL = 6) 
4

1 に答える 1

3

わかりました、問題が見つかったと思います:変数を作成する「魔法の」サービスを呼び出しているようですgivennameLabel。私には奇妙に聞こえますが、それは、変数がフィルタリングの時間にバインドされていないという事実につながる可能性があります。クエリ全体をサブセレクトに入れると、次のように機能します。

#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 個のリソースのみを考慮し、LIMIT がないとタイムアウトにつながります。user3240704 が述べたように、別の解決策は、SERVICE句を避けてrdfs:label代わりに使用することです。

#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
于 2016-08-08T02:40:06.873 に答える