如何用SPARQL查询Wikidata中曾效力两支运动队的教练
查询曾效力两支不同运动队的教练的SPARQL方案
要实现查询曾在不同时期效力两支运动队的教练,核心是关联同一教练在两支球队的任职记录,同时可通过时间属性区分任职时期。以下是具体的修改方案:
基础版:仅确认曾效力两支球队
如果只需要筛选出曾为两支指定球队工作过的教练,无需严格区分时期,可以用以下查询:
SELECT DISTINCT ?coach ?coachLabel WHERE { # 第一支球队(示例为Q7156)的任职记录 wd:Q7156 p:P286 ?team1Stmt. ?team1Stmt ps:P286 ?coach. # 第二支球队(替换为目标球队的Wikidata ID)的任职记录 wd:Qxxxx p:P286 ?team2Stmt. ?team2Stmt ps:P286 ?coach. # 过滤掉同一球队的重复记录 FILTER (wd:Q7156 != wd:Qxxxx) SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".} }
- 使用
DISTINCT避免同一教练出现重复结果 p:P286指向任职的语句节点,ps:P286提取语句中的教练实体- 替换
wd:Qxxxx为你要查询的第二支球队的Wikidata ID
进阶版:严格区分不同任职时期
如果需要确保教练在两支球队的任职是不同时期(无重叠),可以加入时间属性过滤:
SELECT ?coach ?coachLabel ?team1Label ?team2Label ?startTime1 ?endTime1 ?startTime2 ?endTime2 WHERE { # 第一支球队的任职记录及时间 wd:Q7156 p:P286 ?team1Stmt. ?team1Stmt ps:P286 ?coach; pq:P580 ?startTime1; # 任职开始时间 pq:P582 ?endTime1. # 任职结束时间 # 第二支球队的任职记录及时间 wd:Qxxxx p:P286 ?team2Stmt. ?team2Stmt ps:P286 ?coach; pq:P580 ?startTime2; pq:P582 ?endTime2. # 确保球队不同且任职时期无重叠 FILTER (wd:Q7156 != wd:Qxxxx) FILTER (?endTime1 < ?startTime2 || ?endTime2 < ?startTime1) SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".} } ORDER BY ?coachLabel
- 通过
pq:P580和pq:P582获取任职的开始/结束时间 - 第二个
FILTER确保两段任职时间没有重叠,符合“不同时期”的要求 - 返回字段包含球队标签和时间,方便查看具体任职信息
内容的提问来源于stack exchange,提问作者manu_romero_411
相关产品推荐
相关产品推荐

