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
结束语
更多经验文章,请点击苏南大叔的博客:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。