2017-05-28 19 views
0

我有這個SPARQL腳本旨在對維基數據工作:從結果中篩選出的字符串設定

SELECT 
    ?game 
    (group_concat(distinct  ?gameLabel ; separator = ", ") AS  ?gameLabels) 
    (group_concat(distinct  ?genreLabel ; separator = ", ") AS  ?genreLabels) 
    WHERE { 
    ?game wdt:P31 wd:Q7889; 
    wdt:P136 wd:Q744038. 
    OPTIONAL {?game wdt:P136  ?genre} 
    SERVICE wikibase:label { 
     bd:serviceParam wikibase:language "en". 
      ?game rdfs:label  ?gameLabel. 
      ?genre rdfs:label  ?genreLabel. 
    } 
} GROUP BY $game 
ORDER BY ASC (?gameLabel) 

您可以測試這裏的代碼:

https://query.wikidata.org/

目前,我過濾一種名爲「角色扮演視頻遊戲」的類型。但是,我不希望該字符串出現在結果集中。如何過濾掉這個字符串而不是實際的記錄?謝謝。

回答

1

SPARQL是非常簡單的,只需添加FILTEROPTIONAL條款:

SELECT 
    ?game 
    (group_concat(distinct  ?gameLabel ; separator = ", ") AS  ?gameLabels) 
    (group_concat(distinct  ?genreLabel ; separator = ", ") AS  ?genreLabels) 
    WHERE { 
    ?game wdt:P31 wd:Q7889 ; 
      wdt:P136 wd:Q744038. 
    OPTIONAL {?game wdt:P136 ?genre . FILTER(?genre != wd:Q744038)} 
    SERVICE wikibase:label { 
     bd:serviceParam wikibase:language "en". 
      ?game rdfs:label  ?gameLabel. 
      ?genre rdfs:label  ?genreLabel. 
    } 
} GROUP BY ?game 
ORDER BY ASC (?gameLabel) 

注意,這並不能過濾掉類型爲「動作角色扮演遊戲」。如果你也想忽略這個(因爲它看起來像子類型),你必須將其添加爲第二個條件爲FILTER

FILTER(?genre != wd:Q744038 && ?genre != wd:Q1422746) 

,或者如果你更多的資源,它更緊湊

FILTER(?genre NOT IN (wd:Q744038, wd:Q1422746))