Получение областей обучения с помощью 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'

Это не вызывает ошибок, но требует дополнительных исправлений, чтобы получить:

  1. Все подотрасли (дети, внуки и др.) По направлению "Информатика".
  2. Не ограничиваясь первыми 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. Вам просто нужно разбить запросы, используя смещение.

Надеюсь это поможет!

Другие вопросы по тегам