如何在SPARQL查询中精确匹配仅含指定属性值的对象?
SPARQL精确匹配指定属性值(无额外值)
要实现仅返回只拥有Johann和Sebastian这两个名字的主体,核心思路是排除那些存在其他wdt:P735(名字)值的条目,这里有两种可靠的实现方式:
方法一:用FILTER NOT EXISTS排除额外值
直接过滤掉存在指定名字之外的其他名字的主体:
SELECT DISTINCT ?person ?personLabel WHERE { # 确保主体拥有Johann和Sebastian两个名字 ?person wdt:P735 wd:Q4844560, wd:Q11122389 . # 排除存在其他名字的情况 FILTER NOT EXISTS { ?person wdt:P735 ?otherName . FILTER (?otherName NOT IN (wd:Q4844560, wd:Q11122389)) } SERVICE wikibase:label { bd:serviceParam wikibase:language "en" } }
原理:先匹配拥有目标两个名字的主体,再通过FILTER NOT EXISTS检查该主体是否存在不在指定列表里的其他名字,存在则排除。
方法二:用子查询统计属性值数量
通过统计主体的wdt:P735值的数量,确保恰好是2个:
SELECT DISTINCT ?person ?personLabel WHERE { ?person wdt:P735 wd:Q4844560, wd:Q11122389 . # 子查询统计当前person的名字数量 { SELECT ?person (COUNT(DISTINCT ?name) AS ?nameCount) WHERE { ?person wdt:P735 ?name } GROUP BY ?person HAVING (?nameCount = 2) } SERVICE wikibase:label { bd:serviceParam wikibase:language "en" } }
原理:先筛选出拥有目标名字的主体,再通过子查询统计每个主体的名字总数,只保留数量为2的条目,这样就确保没有额外的名字。
注意:如果同一个名字可能被多次关联(比如不同语言或重复声明),COUNT(DISTINCT ?name)能避免重复计数,保证统计的是不同名字的数量。
内容的提问来源于stack exchange,提问作者user2099465
相关产品推荐
相关产品推荐

