从结果集中筛选出字符串

时间:2017-05-28 08:44:04

标签: sparql wikidata

我有这个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 个答案:

答案 0 :(得分:1)

SPARQL非常简单,只需将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))

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

for node in tree.findall(".//node/attr/int[@name='chem']")