github - Github GraphQL API v.4.0 游标错误
问题描述
我正在尝试从 Github 获取所有存储库的列表以对其进行一些分析。我从他们的 v3.0 API 开始了我的工作,这是一个 Restful 的 API,然后当我需要更多信息(如星数)时,我从 v3.0 迁移到以 GraphQL 形式提供的 v4.0。现在我每次都请求 100 条记录并递归地执行此操作以便能够获取所有记录。
问题是关于分页工作。要进行分页工作,我必须获取每个请求的 endCursor ,然后在下一个请求中,我必须在属性之后填充此值。现在的问题是数据没有正确分页。例如:
- 请求第一页(没有任何游标)会导致不同的记录。
- 多次请求具有相同光标的页面,也会检索到不同的结果。
- 如果根本不检查这一点,并尝试一个接一个地获取,每 100 条记录与之前的请求有很多重复,这意味着分页无法正常工作。
我发送的查询(在 nodejs 应用程序中)如下:
{
search(query: "is:public", type: REPOSITORY, first: 100, after: "Y3Vyc29yOjEwMA==") {
repositoryCount
userCount
wikiCount
pageInfo {
startCursor
endCursor
hasNextPage
hasPreviousPage
}
edges {
node {
... on Repository {
databaseId
id
name
description
forkCount
isFork
issues {
totalCount
}
labels (first: 100) {
nodes {
name
}
}
languages (first: 100) {
nodes {
name
}
}
licenseInfo {
name
}
nameWithOwner
primaryLanguage {
name
}
pullRequests {
totalCount
}
watchers {
totalCount
}
stargazers {
totalCount
}
}
}
}
}
}
正如我之前所说,第一次,我从搜索输入中删除参数 after,然后使用上一个请求的 endCursor 作为下一个请求的 after 参数。
我是否错过了对光标用途及其用法的理解,或者这是来自 Github 本身的错误(有意/无意)?
解决方案
幸运的是,我现在找到了一种可行的方法。非常感谢@Daniel Rearden 提供的非常有用的提示。我测试了许多查询字符串,发现如果我请求特定的创建日期,那么数据将根据该字段进行排序,在我的测试中,现在顺序保持一致并且光标将有意义。
现在的查询是这样的:
{
search(query: "created:2008-02-08 is:public", type: REPOSITORY, first: 100) {
repositoryCount
userCount
wikiCount
pageInfo {
startCursor
endCursor
hasNextPage
hasPreviousPage
}
edges {
node {
... on Repository {
databaseId
id
name
description
forkCount
isFork
issues {
totalCount
}
labels (first: 100) {
nodes {
name
}
}
languages (first: 100) {
nodes {
name
}
}
licenseInfo {
name
}
nameWithOwner
primaryLanguage {
name
}
pullRequests {
totalCount
}
watchers {
totalCount
}
stargazers {
totalCount
}
createdAt
updatedAt
diskUsage
}
}
}
}
}
现在我唯一应该考虑的是滚动几天并每天多次进行此查询,直到pageInfo.hasNextPage
为真。
到目前为止,我还没有测试这大约 4000 天,可能我无法验证获取的结果是他们数据库中存在的所有数据,但它似乎是最好的解决方案。
推荐阅读
- python - 冒号在 pycharm 中不存在
- ios - URLSession.shared.dataTaskPublisher - 如何将接收到的值转换为字符串?
- linux - Linux shell脚本知道目录(或文件)是否有777权限
- java - 通知未在所选时间显示
- gradle - 从 gradle 任务中删除现有输入
- python - 试图找到最长的子字符串而不重复字符
- visual-studio-code - 自动右括号在 VS Code 中停止工作
- javascript - Bootstrap Popover 无法在 Mapbox Popup 中打开
- deep-learning - Detectron2 Mask R-CNN 细胞分割 - 什么都看不见
- haskell - 使用数据构造函数作为函数参数