从结果集中过滤掉字符串

Filter out string from result set

我有这个用于维基数据的 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/

目前,我正在过滤 一个名为 "role-playing video game" 的流派。但是,我不希望这个字符串出现在结果集中。如何过滤掉这个字符串而不是实际记录?谢谢

SPARQL 非常简单,只需将 FILTER 添加到 OPTIONAL 子句:

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)

请注意,这不会过滤掉类型 "action role-playing game"。如果你也想省略这个(因为它看起来像一个子流派)你必须将它作为第二个条件添加到 FILTER:

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

或者如果你有更多的资源,它会比

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