neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑
发布于 作者:苏南大叔 来源:程序如此灵动~
本文继续描述neo4j+graphql接口,解读一下graphql的mutation逻辑,也就是增删改逻辑。使用的例子还是官方的migration代码。从接口的增删改方面,阐述文章的主体逻辑。

大家好,苏南大叔的程序如此灵动博客,本文讨论neo4j+graphql官方的migration例子中的增删改mutation逻辑。测试环境:@neo4j/graphql@3.12.0,neo4j-driver@5.1.0,apollo-server@3.10.3,neo4j@4.4.10,node@16.14.2。
基础代码
本文基础如下文章内容:
测试代码见这里:
本文共有三个类型:User、Review、Movie,描述增删改mutation逻辑。gql定义如下:
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)
"""
)
}
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)
}
type User {
username: String!
reviews: [Review!]! @relationship(type: "AUTHORED", direction: OUT)
}
可能需要的清库代码【执行前,请清楚认知自己在干什么!】如下,参考文章:
match (n) detach delete n单独创建节点
单独创建一个user节点:
mutation Mutation($input: [UserCreateInput!]!) {
createUsers(input: $input) {
users {
username
}
}
}{
"input": [
{
"username": "sunan"
}
]
}返回值:
{
"data": {
"createUsers": {
"users": [
{
"username": "sunan"
}
]
}
}
}这个例子写的也蛮搞笑的,input输入的内容是username:name。必须返回一个节点,而user就仅仅一个username可用,所以又把它返回来了。搞笑吧?哈哈。

执行三次,生成了三个节点。证明执行的是create,而不是merge。这里的内容,可以参考:
修改节点
mutation Mutation($where: UserWhere, $update: UserUpdateInput) {
updateUsers(where: $where, update: $update) {
users {
username
}
}
}{
"where": {
"username": "sunan"
},
"update": {
"username": "s"
}
}看界面的话,where居然是和input在一起的。

返回值:
{
"data": {
"updateUsers": {
"users": [
{
"username": "s"
}
]
}
}
}
删除节点
这里删除一下user节点:
mutation DeleteUsers($where: UserWhere, $delete: UserDeleteInput) {
deleteUsers(where: $where, delete: $delete) {
bookmark
}
}{
"where": {
"username": "s"
},
"delete": {
"reviews": [
{
"delete": {
"author": {
"where": {
"node": {
"username": "s"
}
}
}
}
}
]
}
}输出结果:
{
"data": {
"deleteUsers": {
"bookmark": "FB:kcwQ1Rw1ry+DTlyFLS2rX0WnOMkBRpA="
}
}
}按照常理来说,这个删除数据,也不需要啥返回值吧。但是这个graphql强制要求返回值。而且这个删除就需要一个where就可以了吧?这里还能输入一个input(例子里面级联删除了对应的Reviews数据)。

目前暂时未知这个返回的bookmark的用途,没有数据被删除的时候,也会返回这个bookmark。
级联创建数据
这里做个级联创建的例子,一个语句创建三个节点,并建立对应的两条关系。
mutation CreateReviews($input: [ReviewCreateInput!]!) {
createReviews(input: $input) {
reviews {
author {
username
}
movie {
title
}
rating
}
}
}{
"input": [
{
"author": {
"create": {
"node": {
"username": "sunan"
}
}
},
"content": "ok",
"createdAt": "2099-12-12 08:00",
"rating": 999,
"movie": {
"create": {
"node": {
"title": "苏南大叔闯情关"
}
}
}
}
]
}
输出值:
{
"data": {
"createReviews": {
"reviews": [
{
"author": {
"username": "sunan"
},
"movie": {
"title": "苏南大叔闯情关"
},
"rating": 999
}
]
}
}
}使用user或者movie都不可以同时创建三个节点,因为他们彼此不认识。使用user或者movie只能同时创建两个节点及其对应关系。
相关链接
- https://newsn.net/say/neo4j-win.html
- https://newsn.net/say/graphql-apollo.html
- https://newsn.net/say/graphql.html
结束语
更多经验文章,请点击苏南大叔的博客: