SPARQL查询Wikidata时如何按关联属性筛选目标变量
SPARQL查询修复方案
问题原因
你原有查询中两次独立使用p:P735匹配属性,会分别匹配任意两个名字属性节点,导致rank和first_name没有绑定到同一个名字实例上,因此对rank的筛选不会作用到对应的first_name。
修复思路
将同一个名字属性节点下的序号限定pq:P1545和名字取值ps:P735写在同一个属性声明块中,让二者关联对应。
修正后的查询代码
SELECT DISTINCT ?full_name ?full_nameLabel ?first_nameLabel ?rank WHERE { VALUES ?full_name {wd:Q254} . ?full_name p:P735 [ pq:P1545 ?rank ; ps:P735 ?first_name ] . FILTER (?rank = "2") SERVICE wikibase:label { bd:serviceParam wikibase:language "en" } }
执行上述查询即可正确获取到莫扎特的第二个名Chrysostom。
优化说明
原有筛选使用的regex(?rank, "2")可能误匹配序号为"12"、"21"等包含字符2的结果,替换为直接相等匹配?rank = "2"更精准,查询效率也更高。
内容的提问来源于stack exchange,提问作者ArcticBearing
相关产品推荐
相关产品推荐

