Получение областей обучения с помощью Microsoft Academic Graph API
Я пытаюсь получить весь список "Область исследования" из Microsoft Academic Graph для уровня 0 FieldOfStudy "Компьютерные науки". Пока у меня есть следующий код 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'
Это не вызывает ошибок, но требует дополнительных исправлений, чтобы получить:
- Все подотрасли (дети, внуки и др.) По направлению "Информатика".
- Не ограничиваясь первыми 1000 областями исследований (максимальный предел оценки POST).
Хотя я делаю это в curl, я также был бы открыт для подхода Python, если это лучший выбор.
1 ответ
Если ваша цель состоит в том, чтобы перечислить все дочерние области обучения в области компьютерных наук, вам нужно будет делать рекурсивные вызовы, поскольку для каждой области исследования индексируются только непосредственные уровни (то есть родители и дети, а не бабушки и дедушки или внуки).
К счастью, это довольно тривиальная задача, которую можно выполнить с помощью выражения запроса "Составной (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);
}
}
}
}
Чтобы использовать это, просто вызовите его с идентификатором Computer Science ID, то есть:
var descendants = new SortedSet<long>();
GetAllDescendantFieldsOfStudy(41008148, 0, ref descendants);
К сожалению, невозможно обойти максимальное количество результатов, равное 1000. Вам просто нужно разбить запросы, используя смещение.
Надеюсь это поможет!