如何统计Wikidata中共享属性值的同类型实体数量?
优化Wikidata SPARQL查询:统计共享属性值的实体数量
原查询通过直接匹配两两共享属性值的实体,会产生大量笛卡尔积计算,当数据集规模较大时极易超时。可以通过先聚合属性值的关联实体数,再筛选统计目标实体的方式优化:
prefix wdt: <http://www.wikidata.org/prop/direct/> prefix wd: <http://www.wikidata.org/entity/> SELECT (COUNT(DISTINCT ?entity) AS ?sharedCount) WHERE { # 子查询:找出被至少2幅画作共享的P180属性值 { SELECT ?val WHERE { ?entity wdt:P31 wd:Q3305213 ; wdt:P180 ?val . } GROUP BY ?val HAVING (COUNT(DISTINCT ?entity) >= 2) } # 关联所有使用这些共享属性值的画作 ?entity wdt:P31 wd:Q3305213 ; wdt:P180 ?val . }
优化说明
- 子查询阶段:先对每个
P180属性值进行分组,统计关联的画作数量,只保留那些被至少2幅画共享的属性值,大幅缩小后续处理的数据范围。 - 主查询阶段:仅针对筛选后的共享属性值,关联对应的画作并去重统计总数,避免了原查询中所有画作两两匹配的冗余计算,显著提升查询效率。
内容的提问来源于stack exchange,提问作者Moissinac
相关产品推荐
相关产品推荐

