OpenAlex API查询庆应、早稻田大学符合条件成果无匹配的问题排查
问题排查:OpenAlex API查询遗漏庆应义塾大学、早稻田大学数据
我需要统计1980年至今,概念层级为0且引用次数>5的学术成果数量。已筛选出层级为0的concept_ids并存储,将API查询结果保存至CSV后,发现**庆应义塾大学(Keio University)和早稻田大学(Waseda University)**无匹配记录,但手动验证确认两校存在符合要求的论文,现排查以下代码问题:
import requests import json import pandas as pd year_range = range(1980, 2024) year_list = list(year_range) concepts_ids = {'C127313418', 'C17744445', 'C121332964', 'C41008148', 'C144024400', 'C33923547', 'C138885662', 'C185592680', 'C15744967', 'C127413603', 'C142362112', 'C95457728', 'C205649164', 'C39432304', 'C144133560', 'C162324750', 'C71924100', 'C192562407', 'C86803240'} # Lists to store data concept_id_list = [] year_list_result = [] institution_list = [] count_list = [] institution_name = [] for concept_id in concepts_ids: for year in year_list: api_url = f'https://api.openalex.org/works?filter=publication_year:{year},cited_by_count:%3E5,concepts.id:{concept_id}&group_by=authorships.institutions.lineage' response = requests.get(api_url) json_data = response.json() # Extract relevant information for entry in json_data.get('group_by', []): concept_id_list.append(concept_id) year_list_result.append(year) institution_list.append(entry.get('key')) count_list.append(entry.get('count')) institution_name.append(entry.get('key_display_name')) # Create a DataFrame result_df1 = pd.DataFrame({ 'concept_id': concept_id_list, 'year': year_list_result, 'institution': institution_list, 'count': count_list, 'institution_name' : institution_name}) # Display the DataFrame print(result_df1)
问题根源分析
- 分组字段错误:代码中使用
group_by=authorships.institutions.lineage,lineage返回的是机构的层级ID链(包含上级/附属机构),而非学校自身ID。庆应义塾、早稻田大学的论文可能关联下属院系ID,导致数据被归到了层级路径的其他节点,而非学校本身。 - 潜在分页遗漏:OpenAlex分组查询默认仅返回前200条结果,若符合条件的机构数量超过阈值,会直接丢失后续数据。
修复方案
1. 修改分组字段为机构自身ID
将group_by参数改为authorships.institutions.id,直接按学校自身ID统计:
api_url = f'https://api.openalex.org/works?filter=publication_year:{year},cited_by_count:>5,concepts.id:{concept_id}&group_by=authorships.institutions.id'
(注:%3E是>的URL编码,直接写>5即可,requests会自动处理编码)
2. 补充分页逻辑避免数据遗漏
添加分页遍历,确保获取所有符合条件的机构数据:
for concept_id in concepts_ids: for year in year_list: page = 1 while True: api_url = f'https://api.openalex.org/works?filter=publication_year:{year},cited_by_count:>5,concepts.id:{concept_id}&group_by=authorships.institutions.id&page={page}&per_page=200' response = requests.get(api_url) json_data = response.json() group_entries = json_data.get('group_by', []) if not group_entries: break # 原数据提取逻辑不变 for entry in group_entries: concept_id_list.append(concept_id) year_list_result.append(year) institution_list.append(entry.get('key')) count_list.append(entry.get('count')) institution_name.append(entry.get('key_display_name')) page += 1
3. 可选:精准锁定目标院校
若需直接过滤出庆应义塾和早稻田大学,可在过滤条件中添加机构名称:
api_url = f'https://api.openalex.org/works?filter=publication_year:{year},cited_by_count:>5,concepts.id:{concept_id},authorships.institutions.name:Keio University|Waseda University&group_by=authorships.institutions.id&page={page}&per_page=200'
额外验证建议
- 手动查询OpenAlex中目标学校的论文,确认其
authorships.institutions.id和lineage字段值,对比分组结果是否匹配; - 核对指定的
concept_ids是否确实存在于目标论文的concepts.id列表中。
内容的提问来源于stack exchange,提问作者Nick Lee
相关产品推荐
相关产品推荐

