Отфильтровать строку из набора результатов

У меня есть этот скрипт 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/

В настоящее время я фильтрую по жанру "ролевая видеоигра". Однако я не хочу, чтобы эта строка отображалась в наборе результатов. Как отфильтровать только эту строку, но не фактические записи? Спасибо.


person posfan12    schedule 28.05.2017    source источник


Ответы (1)


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)

Обратите внимание, что это не отфильтровывает жанр «ролевая игра в жанре экшн». Если вы также хотите опустить это (поскольку это похоже на поджанр), вы должны добавить это в качестве второго условия к FILTER:

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

или если у вас больше ресурсов, это более компактно

FILTER(?genre NOT IN (wd:Q744038, wd:Q1422746))
person UninformedUser    schedule 28.05.2017