首页 > 解决方案 > 在 GraphQL 中以最佳方式获取数据

问题描述

如何编写解析器,以便我可以在每个解析器中生成数据库子查询,并有效地组合所有解析器并立即获取数据?

对于以下架构:

type Node {
    index: Int!
    color: String!
    neighbors(first: Int = null): [Node!]!
}

type Query {
    nodes(color: String!): [Node!]!
}

schema {
    query: Query
}

要执行以下查询:

{
    nodes(color: "red") {
        index
        neighbors(first: 5) {
            index
        }
    }
}

数据存储:

在我的数据存储中,节点和邻居存储在单独的表中。我想编写一个解析器,以便我们可以最佳地获取所需的数据。

如果有类似的例子,请分享详细信息。(参考graphql-java得到答案会很有帮助)

标签: graphqlgraphql-java

解决方案


推荐和最常见的方法是使用data loader.

Adata loader收集有关fields从哪个过滤器加载table以及使用哪些where过滤器的信息。

我没有在 Java 中使用过 GraphQL,所以我只能为您提供如何自己实现它的指导。

  1. context创建数据加载器的实例并将其作为参数 传递给解析器。
  2. 您的解析器应该将table name、 列表field names和列表where conditions传递给数据加载器并返回一个承诺。
  3. 一旦所有的解析器都执行了,你的数据加载器应该合并这些列表,这样你最终每个表只有一个查询。
  4. 您应该remove duplicate field命名并combine the where conditions使用or关键字。
  5. 查询执行后,您可以将所有这些数据返回给解析器并让它们过滤数据(因为我们使用or关键字组合了条件)
  6. 作为一项高级功能,您的数据加载器可以在将数据返回到解析器之前应用 where 条件,这样他们就不必过滤它们。

推荐阅读