neo4j结合graphql,解读 gql / cql / graphql 之间的关系
发布于 作者:苏南大叔 来源:程序如此灵动~
接着对neo4j和graphql的第一个例子做解读,本文着重解读gql中定义的结构、neo4j中的节点及关系、graphql中的衍生接口中的对应关系。当然,graphql的接口衍生的太多(不得不诟病一下),本身的结构还是挺清晰明了的。

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文还是继续解读neo4j+graphql的第一个例子migration。测试环境:@neo4j/graphql@3.12.0,neo4j-driver@5.1.0,apollo-server@3.10.3,neo4j@4.4.10,node@16.14.2。
基本资料
测试代码地址:

neo4j browser的地址:
apollo server提供的graphiql的地址:
本文截图中的节点的创建,请参考:
gql定义
原版的定义内容如下:

这个定义中,一共定义了三个类型,分别是:Movie、Review、User。
对应于neo4j的话,就是三个节点类型(Movie、Review、User)。
对于graphql来说,就是六组操作。既(query和mutation)和(Movie、Review、User)的排列组合。
user类型
这个user类型的定义,是最简单的。定义如下:
type User {
username: String!
reviews: [Review!]! @relationship(type: "AUTHORED", direction: OUT)
}authored:著作、写作、编写。到neo4j里面进行解释的话,就是:
User标签的系列节点,有一个字符串类型的username属性。Review标签的系列节点,它和User标签的节点,是一(User)对多(Review)的。- 两者之间的关系是:(:User)->[:AUTHORED]->(:Review)

在graphql里面显示的话,和User有关的查询接口有:
| 大类 | 接口名称 | 说明 |
|---|---|---|
query | users | 查询所有User |
query | usersAggregate | 查询User数量 |
query | usersConnection | 分页查询User |
mutation | createUsers | 创建Users |
mutation | deleteUsers | 删除Users |
mutation | updateUsers | 更新Users |
Movie类型
type Movie {
title: String!
reviews: [Review!]! @relationship(type: "HAS_REVIEW", direction: OUT)
averageRating: Float!
@cypher(
statement: """
MATCH (this)-[:HAS_REVIEW]->(r:Review)
RETURN avg(r.rating)
"""
)
}
标签为Movie的节点,
- 有个
title的字符串属性。 Movie标签节点和Review的标签节点的关系是:(:Movie)->[:HAS_REVIEW]->(:Review)- 有个
averageRating的浮点数属性,但是它是通过cql运算获得的。
在graphql里面显示的话,和Movie有关的查询接口有:
| 大类 | 接口名称 | 说明 |
|---|---|---|
query | Movies | 查询所有Movie |
query | MoviesAggregate | 查询Movie数量 |
query | MoviesConnection | 分页查询Movie |
mutation | createMovies | 创建Movies |
mutation | deleteMovies | 删除Movies |
mutation | updateMovies | 更新Movies |
Review类型
type Review {
id: ID! @id
rating: Float!
createdAt: DateTime!
content: String!
author: User! @relationship(type: "AUTHORED", direction: IN)
movie: Movie! @relationship(type: "HAS_REVIEW", direction: IN)
}
根据经验,这个标签为Review的节点,拥有rating、createAt、content以及id属性。重点说一下这个id属性,它和节点自带的<id>是不一样的。这里的id: ID! @id是个自动生成的id,类似:216f50b5-08f0-4834-a298-e1c5ea76994a(具体的算法待后续文章解释)。而节点自带的<id>的取值就是单纯的整形数字。
Review具有的neo4j关系是:
- (:User)->[:AUTHORED]->(:Review)
- (:Movie)->[:HAS_REVIEW]->(:Review)

在graphql里面显示的话,和Review有关的查询接口有:
| 大类 | 接口名称 | 说明 |
|---|---|---|
query | Reviews | 查询所有Review |
query | ReviewsAggregate | 查询Review数量 |
query | ReviewsConnection | 分页查询Review |
mutation | createReviews | 创建Reviews |
mutation | deleteReviews | 删除Reviews |
mutation | updateReviews | 更新Reviews |
相关链接
- https://newsn.net/say/neo4j-win.html
- https://newsn.net/say/neo4j-match-node.html
- https://newsn.net/say/graphql-apollo.html
结束语
下面的链接是相关经验文章的合集,请点击查看: