我有这个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)
您可以在此处测试代码:
目前,我正在过滤 一个名为"角色扮演视频游戏"的流派。但是,我不希望此字符串出现在结果集中。如何过滤掉这个字符串而不是实际记录?感谢。
答案 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']")