在我的 neo4j 数据库中,graphql 突变对于 2 种类型没有按预期工作
In my neo4j db, the graphql mutation is not working as expected for 2 types
我正在为我的测试项目使用 neo4j dB 和 apollo-graphql 服务器。我正在尝试创建一个问答应用程序,用户可以在其中创建一个问题(具有唯一 ID),然后其他用户将回答该问题(类似于 Whosebug,但功能非常少)。我想在“[=28] 之间建立关系=]Questions”节点和“Users”节点通过突变在我的 neo4j 数据库中。
所以,在我创建 User Type 和 Question Type 的突变中。但是当我试图在用户(创建问题的人)和问题之间建立关系时,突变没有按预期工作。
这是 graphql 模式...
type Question {
questionID: Int! # unique id for a particular question
title: String! # Question Title
details: String!
createdBy: User!
}
type User {
userID: Int!
name: String!
email: String
questions: [Question] # specific questions related to the user
}
type Mutation {
createUser(name: String!, userID: Int!): [User]
createQuestion(questionID: Int!, title: String!, details: String!,userID: Int! ): Question
这里是解析器的突变片段...
Mutation: {
createQuestion(_,params){
let session = driver.session();
let query = "MERGE (q:Questions {questionID:{questionID},title:
{title},details:{details},userID:{userID}})-[:CREATED_BY]->
(u:Users{userID:{userID}}) RETURN q;"
return session.run(query,params)
.then( result => {
return result.records.map( record => {
return record.get("q").properties
}
)
}
)
},
}
在 运行 此突变查询之前,我已经在 neo4j 数据库中插入了一个具有唯一用户 ID“1”的虚拟用户。我 运行 graphiQL 中的这个“createQuestion”突变为现有用户创建一个问题,所以我传递了用户 ID“1”作为参数,
//createQuestion(questionID: Int!, title: String!, details: String!,userID: Int!)
并且在 运行 这个变异查询之后,我希望在现有用户和创建的问题之间获得 [:CREATED_BY] 的关系,
但是我的数据库现在有 2 个用户具有相同的用户 ID“1”(即,已经插入了一个具有相同用户 ID“1”的用户,并且现在这个新插入的用户和问题节点之间存在关系)。
我需要的是避免创建具有相同 id 的新重复用户,而只是在现有用户和问题之间创建关系。 有人可以让我知道我在这里弄错了什么吗?
您必须更改查询:
let query = "
MERGE (u:Users{userID:{userID}})
MERGE (q:Questions {questionID:{questionID},title:
{title},details:{details},userID:{userID}})
MERGE (q)-[:CREATED_BY]->(u)
RETURN q;"
因为您已经有了 questionID,我猜这是一个唯一标识符,我会将查询更改为:
let query = "
MERGE (u:Users{userID:{userID}})
MERGE (q:Questions {questionID:{questionID})
ON CREATE SET q.title=
{title},q.details={details}
MERGE (q)-[:CREATED_BY]->(u)
RETURN q;"
请注意,我还从问题中删除了用户 ID 属性,因为您不需要它,因为您已经创建了从用户到问题的关系
编辑:
您可以通过两种方式解决评论中的问题:
通过将 UserID 属性 添加到问题:
let query = "
MERGE (u:Users{userID:{userID}})
MERGE (q:Questions {questionID:{questionID},userID:{userID}})
ON CREATE SET q.title= {title},q.details={details},
MERGE (q)-[:CREATED_BY]->(u)
RETURN q;"
或与本地合并:
let query = "
MERGE (u:Users{userID:{userID}})
MERGE (u)<-[:CREATED_BY]-(q:Questions {questionID:{questionID}})
ON CREATE SET q.title= {title},q.details={details},
RETURN q;"
我正在为我的测试项目使用 neo4j dB 和 apollo-graphql 服务器。我正在尝试创建一个问答应用程序,用户可以在其中创建一个问题(具有唯一 ID),然后其他用户将回答该问题(类似于 Whosebug,但功能非常少)。我想在“[=28] 之间建立关系=]Questions”节点和“Users”节点通过突变在我的 neo4j 数据库中。
所以,在我创建 User Type 和 Question Type 的突变中。但是当我试图在用户(创建问题的人)和问题之间建立关系时,突变没有按预期工作。
这是 graphql 模式...
type Question {
questionID: Int! # unique id for a particular question
title: String! # Question Title
details: String!
createdBy: User!
}
type User {
userID: Int!
name: String!
email: String
questions: [Question] # specific questions related to the user
}
type Mutation {
createUser(name: String!, userID: Int!): [User]
createQuestion(questionID: Int!, title: String!, details: String!,userID: Int! ): Question
这里是解析器的突变片段...
Mutation: {
createQuestion(_,params){
let session = driver.session();
let query = "MERGE (q:Questions {questionID:{questionID},title:
{title},details:{details},userID:{userID}})-[:CREATED_BY]->
(u:Users{userID:{userID}}) RETURN q;"
return session.run(query,params)
.then( result => {
return result.records.map( record => {
return record.get("q").properties
}
)
}
)
},
}
在 运行 此突变查询之前,我已经在 neo4j 数据库中插入了一个具有唯一用户 ID“1”的虚拟用户。我 运行 graphiQL 中的这个“createQuestion”突变为现有用户创建一个问题,所以我传递了用户 ID“1”作为参数,
//createQuestion(questionID: Int!, title: String!, details: String!,userID: Int!)
并且在 运行 这个变异查询之后,我希望在现有用户和创建的问题之间获得 [:CREATED_BY] 的关系, 但是我的数据库现在有 2 个用户具有相同的用户 ID“1”(即,已经插入了一个具有相同用户 ID“1”的用户,并且现在这个新插入的用户和问题节点之间存在关系)。
我需要的是避免创建具有相同 id 的新重复用户,而只是在现有用户和问题之间创建关系。 有人可以让我知道我在这里弄错了什么吗?
您必须更改查询:
let query = "
MERGE (u:Users{userID:{userID}})
MERGE (q:Questions {questionID:{questionID},title:
{title},details:{details},userID:{userID}})
MERGE (q)-[:CREATED_BY]->(u)
RETURN q;"
因为您已经有了 questionID,我猜这是一个唯一标识符,我会将查询更改为:
let query = "
MERGE (u:Users{userID:{userID}})
MERGE (q:Questions {questionID:{questionID})
ON CREATE SET q.title=
{title},q.details={details}
MERGE (q)-[:CREATED_BY]->(u)
RETURN q;"
请注意,我还从问题中删除了用户 ID 属性,因为您不需要它,因为您已经创建了从用户到问题的关系
编辑:
您可以通过两种方式解决评论中的问题:
通过将 UserID 属性 添加到问题:
let query = "
MERGE (u:Users{userID:{userID}})
MERGE (q:Questions {questionID:{questionID},userID:{userID}})
ON CREATE SET q.title= {title},q.details={details},
MERGE (q)-[:CREATED_BY]->(u)
RETURN q;"
或与本地合并:
let query = "
MERGE (u:Users{userID:{userID}})
MERGE (u)<-[:CREATED_BY]-(q:Questions {questionID:{questionID}})
ON CREATE SET q.title= {title},q.details={details},
RETURN q;"