我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文继续描述neo4j+graphql接口,解读一下graphqlmutation逻辑,也就是增删改逻辑。使用的例子还是官方的migration代码。从接口的增删改方面,阐述文章的主体逻辑。

苏南大叔:neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑 - graphql增删改逻辑
neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑(图7-1)

大家好,苏南大叔的平行空间笔记本博客,本文讨论neo4j+graphql官方的migration例子中的增删改mutation逻辑。测试环境:@neo4j/graphql@3.12.0neo4j-driver@5.1.0apollo-server@3.10.3neo4j@4.4.10node@16.14.2

基础代码

本文基础如下文章内容:

测试代码见这里:

本文共有三个类型:UserReviewMovie,描述增删改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)
}

苏南大叔:neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑 - gql定义
neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑(图7-2)

可能需要的清库代码【执行前,请清楚认知自己在干什么!】如下,参考文章:

match (n) detach delete n

单独创建节点

单独创建一个user节点:

mutation Mutation($input: [UserCreateInput!]!) {
  createUsers(input: $input) {
    users {
      username
    }
  }
}
{
  "input": [
    {
      "username": "sunan"
    }
  ]
}

返回值:

{
  "data": {
    "createUsers": {
      "users": [
        {
          "username": "sunan"
        }
      ]
    }
  }
}
这个例子写的也蛮搞笑的,input输入的内容是usernamename。必须返回一个节点,而user就仅仅一个username可用,所以又把它返回来了。搞笑吧?哈哈。

苏南大叔:neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑 - 增加一个新的节点
neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑(图7-3)

执行三次,生成了三个节点。证明执行的是create,而不是merge。这里的内容,可以参考:

修改节点

mutation Mutation($where: UserWhere, $update: UserUpdateInput) {
  updateUsers(where: $where, update: $update) {
    users {
      username
    }
  }
}
{
  "where": {
    "username": "sunan"
  },
  "update": {
    "username": "s"
  }
}
看界面的话,where居然是和input在一起的。

苏南大叔:neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑 - arguments-where-updateinput
neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑(图7-4)

返回值:

{
  "data": {
    "updateUsers": {
      "users": [
        {
          "username": "s"
        }
      ]
    }
  }
}

苏南大叔:neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑 - 修改节点逻辑
neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑(图7-5)

删除节点

这里删除一下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数据)。

苏南大叔:neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑 - 删除节点逻辑
neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑(图7-6)

目前暂时未知这个返回的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": "苏南大叔闯情关"
          }
        }
      }
    }
  ]
}

苏南大叔:neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑 - 同时生成三个节点
neo4j结合graphql,解读 graphql 接口的增删改mutation逻辑(图7-7)

输出值:

{
  "data": {
    "createReviews": {
      "reviews": [
        {
          "author": {
            "username": "sunan"
          },
          "movie": {
            "title": "苏南大叔闯情关"
          },
          "rating": 999
        }
      ]
    }
  }
}

使用user或者movie都不可以同时创建三个节点,因为他们彼此不认识。使用user或者movie只能同时创建两个节点及其对应关系。

相关链接

结束语

更多经验文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   neo4j    graphql