分页

这是 GraphQL Library 7 版本的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL Library 5 LTS 版本

Neo4j GraphQL 库提供了两种分页机制

  • 基于偏移的分页 - 基于偏移量的分页,通常与通过页面进行导航相关联。

  • 基于游标的分页 - 基于游标的分页,通常与无限滚动的应用程序相关联。

基于偏移的分页

基于偏移的分页,通常与通过页面进行导航相关联,可以通过在查询数据时使用 offsetlimit 选项来实现。

使用以下类型定义

type User @node {
    name: String!
}

通过执行以下查询获取第一批 10 条记录

query {
    users(limit: 10) {
        name
    }
}

然后在后续调用中,引入 offset 参数,并在每次调用时递增 10。

使用以下方式获取第二页

query {
    users(offset: 10, limit: 10) {
        name
    }
}

使用以下方式获取第三页

query {
    users(offset: 20, limit: 10) {
        name
    }
}

以此类推。

页面总数

您可以使用该类型的 count 查询获取记录总数,然后将该数字除以每页的条目数,以计算页面总数。这可以确定最后一页是哪一页,以及是否还有下一页。

有关如何执行这些查询的详细信息,请参阅 Count 查询。

分页关联字段

假设在上述的 User 类型之外,还有一个 Post 类型,并且一个 User 拥有多个 Post。您也可以获取一个 User,随后对其帖子进行分页。

query {
  users(where: { name: { eq: "Billy" } }) {
    name
    posts(offset: 20, limit: 10) {
      content
    }
  }
}

基于游标的分页

在关联字段上,您可以利用基于游标的分页,这通常与无限滚动的应用程序相关联。

使用以下类型定义

type User @node {
    name: String!
    posts: [Post!]! @relationship(type: "HAS_POST", direction: OUT)
}

type Post @node {
    content: String!
}

如果您想一次获取用户 “John Smith” 的 10 条帖子,首先需要获取 10 条。

query {
  users(where: { name: { eq: "John Smith" } }) {
    name
    postsConnection(first: 10) {
      edges {
        node {
          content
        }
      }
      pageInfo {
        endCursor
        hasNextPage
      }
    }
  }
}

在返回值中,如果 hasNextPagetrue,则将 endCursor 作为下一个查询的参数(获取 10 条)。您可以使用变量来实现,例如以下查询中的 $after

query Users($after: String) {
    users(where: { name: { eq: "John Smith"} }) {
        name
        postsConnection(first: 10, after: $after) {
            edges {
                node {
                    content
                }
            }
            pageInfo {
                endCursor
                hasNextPage
            }
        }
    }
}

您可以持续进行,直至返回的 hasNextPagefalse ——这表示已到达数据的末尾。

totalCount

Connection 字段还提供了一个 totalCount 字段,可用于计算页码。如果您想使用游标进行分页,但在应用中使用页码,这将非常有用。

添加 totalCount 字段,它返回与使用的过滤器匹配的结果总数,例如

query Users {
  users(where: { name: { eq: "John Smith" } }) {
    name
    postsConnection(first: 10) {
      edges {
        node {
          content
        }
      }
      pageInfo {
        endCursor
        hasNextPage
      }
      totalCount
    }
  }
}