DBpedia实体查询wikiPageWikiLink计数与经纬度异常问题求助
问题排查与修复方案
问题原因分析
- 计数错误原因:当前GROUP BY子句错误包含了被计数的
?o变量和聚合结果?num,会导致每一条wikiPageWikiLink对应单独分组,计数结果固定为1,无法汇总得到单个实体的链接总数。 - 虚假经纬度原因:DBpedia存在部分脏数据,部分实体关联了不符合地理常识的经纬度值,原查询没有对经纬度的合法范围做限制,导致异常值被返回。
修复后的SPARQL查询
SELECT ?label ?subject ?lat ?long ?startDate (count(?o) as ?num) WHERE { ?subject geo:lat ?lat. ?subject geo:long ?long. ?subject rdfs:label ?label. ?subject dbo:startDate ?startDate. ?subject dbo:wikiPageWikiLink ?o FILTER (lang(?label) = 'en') # 过滤合法经纬度范围 FILTER (?lat >= -90 && ?lat <=90) FILTER (?long >= -180 && ?long <=180) } # 仅按实体核心属性分组,移除?o和?num GROUP BY ?label ?subject ?lat ?long ?startDate LIMIT 1000
优化补充说明
如果同一个实体存在多组合法经纬度,导致同一实体返回多条结果,可以修改查询使用SAMPLE聚合函数固定取一组经纬度:
SELECT ?label ?subject (SAMPLE(?lat) as ?validLat) (SAMPLE(?long) as ?validLong) ?startDate (count(?o) as ?num) WHERE { ?subject geo:lat ?lat. ?subject geo:long ?long. ?subject rdfs:label ?label. ?subject dbo:startDate ?startDate. ?subject dbo:wikiPageWikiLink ?o FILTER (lang(?label) = 'en') FILTER (?lat >= -90 && ?lat <=90) FILTER (?long >= -180 && ?long <=180) } GROUP BY ?label ?subject ?startDate LIMIT 1000
内容的提问来源于stack exchange,提问作者Arun R
相关产品推荐
相关产品推荐

