查找DBpedia资源共享同一主题维基链接的SPARQL查询报错求助
问题排查与优化方案
报错原因
你的查询报错是两处基础语法问题导致的:
- SPARQL语法要求所有三元组、过滤语句之间必须用英文句号
.分隔,你漏写了两个分隔符:- 声明
?resource关联摘要的语句末尾没有加. - 声明
?resource关联主题的语句末尾没有加.
- 声明
- 现有写法重复定义了目标资源URI,不符合你不需要重复注入条目的需求。
优化后可直接运行的查询
你不需要写嵌套子查询,可以直接先绑定目标资源、预查询目标资源的主题集合,逻辑更简洁,也不需要重复写目标条目:
-- 查找目标资源的所有维基内链,且内链资源与目标资源共享至少一个主题 SELECT ?item ?resource ?title ?snippet WHERE { # 绑定目标资源,修改此处即可切换查询对象,不需要改其他位置 BIND(<http://dbpedia.org/resource/Artificial_intelligence> AS ?item) # 查询目标资源的所有维基内链 ?item <http://dbpedia.org/ontology/wikiPageWikiLink> ?resource . # 查询内链资源的英文标签 ?resource <http://www.w3.org/2000/01/rdf-schema#label> ?title . FILTER(LANG(?title) = "en") # 查询内链资源的英文摘要 ?resource <http://dbpedia.org/ontology/abstract> ?snippet . FILTER(LANG(?snippet) = "en") # 查询内链资源的主题 ?resource <http://purl.org/dc/terms/subject> ?resourceSubject . # 过滤:该主题属于目标资源本身的主题集合 ?item <http://purl.org/dc/terms/subject> ?resourceSubject . }
逻辑说明
优化后的查询直接通过双绑定主题的方式实现过滤,比嵌套子查询执行效率更高,且只需要修改BIND行的资源URI即可切换查询目标,完全满足你不需要重复注入条目的需求。
内容的提问来源于stack exchange,提问作者John Hammond
相关产品推荐
相关产品推荐

