Получение областей исследования с использованием Microsoft Academi c Graph API - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь получить весь список «Области исследования» от Microsoft Academi c График для уровня 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. Все области обучения (дети, внуки и т. Д. c.) Области исследования "Компьютерные науки".
  2. Не ограничивается первыми 1000 областями обучения (максимальный предел оценки POST) ,

Хотя я делаю это в curl, я также был бы открыт для подхода python в случае, если это лучший выбор.

1 Ответ

0 голосов
/ 21 января 2020

Если ваша цель состоит в том, чтобы перечислить все последующие области обучения в области компьютерных наук, вам нужно будет делать рекурсивные вызовы, поскольку для каждой области обучения индексируются только непосредственные уровни (имеется в виду родители и дети, а не бабушки и дедушки или внуки).

К счастью, это довольно тривиальная вещь для выполнения sh с помощью выражения запроса "Composite (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. Вам просто нужно разбить ваши запросы, используя смещение.

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

...