Some results are best achieved via recursion, functions being able to “call themselves from within their own code.” Using the Microsoft Graph API, recursion is necessary when querying large datasets because the API responses can only return so many records at a time. Whenever there are still more records to query, the response object includes the @odata.nextLink property and a $skiptoken parameter. This essentially performs as a placeholder, indicating where the subsequent query should resume:

To query and process the next bunch of records, store the @odata.nextLink property value:
[System.String] $nextLink = ""
if ($Response.'@odata.nextLink'.Length -ne 0) {
$nextLink = $Response.'@odata.nextLink'
}
And use the stored @odata.nextLink value as a parameter to a GET function:
if ($nextLink -ne "") {
Get-RecursiveListOfUsers `
-GraphAPIEndpoint "$nextLink"
}
Not a complete picture, but this is the gist of using recursion with the Graph API. To see the full script, find it here on my GitHub.
Conclusion:
Microsoft Graph API responses often can’t return all items. However, to help developers get these remaining items in manageable chunks, Microsoft does provide the @odata.nextLink property, which helps partition these larger data sources.
“Somebody has to take responsibility for being a leader.”
Toni Morrison
#BlackLivesMatter