如何在Wikidata SPARQL查询中获取事件的实例所属类?
修改SPARQL查询以获取事件所属类
要获取每个事件的所属类,你需要在查询中添加对事件直接类型(wdt:P31,即“实例”属性)的查询,并将类的变量和标签加入结果集。以下是修改后的完整查询:
SELECT ?event ?eventLabel ?eventClass ?eventClassLabel ?date ?location WITH { SELECT DISTINCT ?event ?eventClass ?date ?location WHERE { # 定位内华达的地理坐标 wd:Q1227 wdt:P625 ?nevada. # 筛选属于“时空发生的事件”及其子类的实例 ?event wdt:P31/wdt:P279* wd:Q1190554. # 获取事件的直接所属类 ?event wdt:P31 ?eventClass. # 获取事件的发生时间或起始时间 OPTIONAL { ?event wdt:P585 ?date. } OPTIONAL { ?event wdt:P580 ?date. } # 获取事件的地理位置 ?event wdt:P625 ?location. # 筛选内华达400公里范围内的事件 FILTER(geof:distance(?location, ?nevada) < 400). } LIMIT 1000 } AS %i WHERE { INCLUDE %i # 为事件和类获取多语言标签 SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" . } }
关键修改说明:
- 在子查询的
SELECT和WHERE中新增了?eventClass变量,通过?event wdt:P31 ?eventClass获取事件的直接所属类(比如Las Vegas Grind对应的“音乐节”类)。 - 如果需要获取类的所有父类(比如从“音乐节”向上追溯到“文化活动”),可以把
?event wdt:P31 ?eventClass改成?event wdt:P31/wdt:P279* ?eventClass,但这样会返回多个父类结果,需要根据需求调整。 - 在主查询的
SELECT中添加了?eventClass和?eventClassLabel,确保结果中包含类的ID和对应的人类可读标签。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

