在当前的 Web 开发领域中,随着前端技术的快速发展,很多厂商都推出了自己的前端框架,例如 React、Vue、Angular 等。但是,这些框架只是实现了前端和用户交互的功能,而后端结构的搭建和管理依旧需要进行开发和管理。本篇文章将介绍如何使用 GraphQL 和 Neo4j 构建服务,为前端提供数据、业务逻辑和多种数据的查询功能。
GraphQL
GraphQL 是一种数据查询和操作语言,它被设计为用于构建客户端和服务器之间的 API。GraphQL 不同于传统的 RESTful API,它采用的是一个强类型的数据查询语言。GraphQL 暴露了一套类型系统,允许客户端明确地表达他们的查询意图,并允许服务器执行和验证这些查询。
GraphQL 的优点:
- 前端可以按照自己的需求来查询所需数据。
- 能够获取指定字段,减少了从服务端返回大量无用数据的情况。
- 通过数据的关系结构能够正确的进行字段嵌套,简化前端和后端交互的程序。
开发使用 GraphQL 需要遵循以下的步骤:
1.定义 GraphQL schema
GraphQL 的 schema 定义了所有可以被查询的字段和类型。入门的 GraphQL schema 如下所示:
---- ----- - ------ ------ -
这个 schema 定义了一个 Query 类型,并且该类型支持一种叫做 hello 的字段,该字段返回的类型是 String。
2. 实现 GraphQL resolver
定义 schema 后,还需要定义 resolver,它们是负责获取数据的函数。下面的例子示范了如何实现 resolver:
----- ---- - - ------ -- -- ------ -------- --
在这里,我们在根对象上实现了 hello 查询的解析器。它实际上是一个普通的 JavaScript 函数,可以获取任何需要的数据,例如从数据库或者其他 API 获取。
3. 启动 Express 服务器
Express 是 Node.js 的一个框架,用于构建 Web 应用和 API。下面的代码展示如何启动一个 GraphQL 服务器。
----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- - ----------- - - ------------------- ----- ------ - ------------- ---- ----- - ------ ------ - --- ----- ---- - - ------ -- -- ------ -------- -- ----- --- - ---------- ------------------- ------------- ------- ------- ---------- ----- --------- ----- ---- ---------------- -- -- -------------------- ------- ------ --- ------- -- --------------------------
在以上代码中,我们构建了一个 GraphQL schema,并通过 graphqlHTTP 函数生成了一个将 schema 传递到请求中的中间件,然后将其传递给 Express 应用程序。此时,您需要访问 http://localhost:4000/graphql,就可以使用 GraphiQL 工具进行测试了。
Neo4j
Neo4j 是一个开源的、高性能、且符合 ACID 原则的图形数据库,能够处理大规模的、高度互联的数据。使用 Neo4j,可以轻松地存储和查询高度相关的数据,例如社交网络、网络安全、语义网、推荐引擎、内部数据交换以及其他各种用例。
1. 安装 Neo4j 并创建图
可以通过以下命令来下载、安装和启动 Neo4j 数据库。
---- -- ------------------------------------------------------------------------------------------ - --- --- - -- ---------------------------- -------------- --
通过上述命令,我们可以部署一个 Neo4j 数据库实例并启动服务。此时,您可以访问 http://localhost:7474,然后进入数据库可视化界面。
现在,我们可以通过 Cypher 查询语言,来创建一个新的节点和关系:
------ ----------- ------ ------ ------ ----------------------------------------- ------ ------ ------ ----------------- ------ ---- -- ----
以上命令创建了两个新节点,它们代表着两个人(zzq 和 wgj),然后创建了一条 FRIEND 关系,用于表示这两个人是朋友关系。
2. 安装 Neo4j GraphQL-js 和 graphql-tools
为了使用 Neo4j 和 GraphQL 构建一个服务,需要安装以下 npm 包:
--- ------- ---------------- -------------
通过 neo4j-graphql-js,现在可以通过 Cypher 查询语言来访问 GraphQL API。因此,我们可以通过 GraphQL 来查询我们刚刚创建的数据。
GraphQL + Neo4j
1. 定义 schema
下面的例子定义了一个我们可以查询的简单的 schema,用于访问 Neo4j 数据库中的 Person 和 FRIEND 类型。
---- ------ - ----- ------ ------ ------ - ---- ------ - ----- ------ --- ------ - ---- ----- - -------- -------- -------- -------- -
2.通过 Cypher 查询数据
我们现在可以通过使用 graphql-tools 来生成我们的 resolvers,来将 schema 与数据进行关联。
----- - ------------------- - - ---------------------------- ----- - ------------ - - ------------------------- ----- ----- - ------------------------ ----- -------- - - ---- ------ - ----- ------ ------ ------ - ---- ------ - ----- ------ --- ------ - - --- ----- ---- ------- --- --- --------- ------- ------- ---- - ------- --- ------- --- --- ------- ---- ---- ----- - -------- -------- -------- -------- - -- ----- ------ - ------------- ------------------------ ------------------------- ----------- -- ----- ------ - --------------------- -------- --- ----- ------ - --- -------------- ------- -------- - ------ - --- ----------------------- --- -- -- -------------------- ------ ----- -- ----------
这里我们使用 Apollo Server 作为 GraphQL 的实现,然后将其和 neo4j-graphql-js 进行整合,实现了对我们已经创建的数据进行查询。
3.查询数据
我们将如何查询我们的 Neo4j 图形数据库,并且在 GraphQL API 中返回它。
----- ---------- - ------- - ---- ----- - - ----- ---------- - ------- - ---- - ---- ----- - -- - ---- ----- - - -
现在,您就可以运行上述查询,验证您的 GraphQL API 是否可以正确返回您期望的数据。
总结
本文通过介绍 GraphQL 和 Neo4j,演示了如何使用它们构建一个 GraphQL API 来查询美食家的数据。通过结合 Neo4j 和 GraphQL 可以更便捷地构建并查询一个高度互联的数据集。同样,您可以使用它们来构建其他类型的 API,例如社交网络、勾当、语义网络等。
现在,您已经成功地创建并测试了一个 GraphQL API,并意识到了它的优势,那么如何应用这些知识呢?首先你可以尝试去构建一个自定义的 GraphQL API,并将它与自己的应用进行整合。其次,如果您想进一步学习 GraphQL 和 Neo4j,可以阅读官方文档,或者参考 社区提供的周边工具包,以便更轻松地完成下一步的学习。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6645b000d3423812e43b5102