Github GraphQL API v.4.0 游标错误

Posted

技术标签:

【中文标题】Github GraphQL API v.4.0 游标错误【英文标题】:Github GraphQL API v.4.0 cursor misworks 【发布时间】:2020-02-04 17:09:15 【问题描述】:

我正在尝试从 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 本身的错误(有意/无意)?

【问题讨论】:

我怀疑问题在于search 没有公开对结果进行排序的方法。如果像REST API一样,默认排序may be the search ranking,当你的查询是"is:public"时就没有意义了。当您将特定关键字添加到搜索中时,您可以看到结果更加一致。部分问题是您还在查询一个变化非常迅速的数据集。如果您在数据集中包含特定关键字,则结果会更加一致。 @DanielRearden 我认为 github 文档对于这个主题非常混乱和薄弱,但如果你是对的,那么有没有办法在 is:public 之前放置一个搜索词来强制结果按照 a 排序像他们的身份一样一致的方式?我试过databaseId:>0 is:public,但结果为空。 【参考方案1】:

幸运的是,我现在找到了一种可行的方法。非常感谢@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 天没有对此进行测试,可能我无法验证获取的结果是他们数据库中存在的所有数据,但它似乎是最好的解决方案。

【讨论】:

为了完整起见,我发现第一个包是在2007-10-29上创建的。

以上是关于Github GraphQL API v.4.0 游标错误的主要内容,如果未能解决你的问题,请参考以下文章

GitHub采用了新的GraphQL API

Graphql实践使用 Apollo(iOS) 访问 Github 的 Graphql API

markdown Github API v4 GraphQL

GitHub V4 GraphQL API with Java 使用一些 GraphQL Java 库(如果可用)

Graphql实践使用 Apollo(iOS) 访问 Github 的 Graphql API

Graphql实践使用 Apollo(iOS) 访问 Github 的 Graphql API