使用学术图形 API 检索研究领域Microsoft



我正在尝试从学术图表中检索整个列表"研究领域"Microsoft用于0级研究领域"计算机科学"。到目前为止,我有以下 curl 代码来检索一般字段:

curl -X POST 
https://api.labs.cognitive.microsoft.com/academic/v1.0/evaluate 
-H 'Cache-Control: no-cache' 
-H 'Content-Type: application/x-www-form-urlencoded' 
-H 'Ocp-Apim-Subscription-Key: my_subscription_key' 
-d 'expr=Ty%3D'''6'''&attributes=Id%2CFL%2CFN%2CFC.FN%2CFP.FN%2CFC.FId%2CFP.FId'

这不会引发任何错误,但它需要进一步修改,以便检索:

  1. "计算机科学"研究领域的所有子研究领域(孩子,孙子等(。
  2. 不限于前 1000 个研究领域(POST 评估的最大限制(。

虽然我在 curl 中这样做,但如果它是更好的选择,我也会对 python 方法持开放态度。

如果您的目标是枚举计算机科学下的所有后代研究领域,则需要进行递归调用,因为每个研究领域(指父母和孩子,而不是祖父母或孙子孙女(仅索引即时级别。

幸运的是,使用查询表达式"复合(FP.FId=parent_fos_id("。

下面是一些示例 C# 代码,用于获取所有后代研究领域(抱歉,我不精通 Python,但应该很容易弄清楚我在做什么(:

static void GetAllDescendantFieldsOfStudy(long fieldOfStudyId, int level, ref SortedSet<long> descendants)
{
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "_subscription_key_");
var jsonString = 
client
.GetStringAsync(
new Uri($"https://api.labs.cognitive.microsoft.com/academic/v1.0/evaluate?expr=Composite(FP.FId={fieldOfStudyId})&model=latest&count=1000&offset=0&attributes=Id,DFN"))
.Result;
var jsonObject = Newtonsoft.Json.Linq.JObject.Parse(jsonString);
var childCount = jsonObject["entities"].Count();
if (childCount > 0)
{
var children = jsonObject["entities"];
foreach (var child in children)
{
var childId = child.Value<long>("Id");
if (!descendants.Contains(childId))
{
descendants.Add(childId);
Console.WriteLine($"{new String('t', level)}Expanding {child.Value<string>("DFN")}");
GetAllDescendantFieldsOfStudy(childId, level + 1, ref descendants);
}
}
}
}

要使用它,只需使用计算机科学 ID 调用它,即:

var descendants = new SortedSet<long>();
GetAllDescendantFieldsOfStudy(41008148, 0, ref descendants);

不幸的是,没有办法绕过 1000 的最大结果计数。您只需要使用偏移量分解您的请求。

希望这有帮助!

相关内容

  • 没有找到相关文章

最新更新