在我的neo4j数据库中,graphql变异无法按预期工作2种类型

时间:2017-08-09 12:41:45

标签: neo4j cypher graphql-js apollo-server

我正在为我的测试项目使用neo4j dB和apollo-graphql服务器。我正在尝试创建一个Q&amp; A应用程序,其中用户可以创建一个问题(具有唯一ID),然后它将由其他用户回答(类似于stackoverflow但具有非常小的功能)。我想创建“<强大>问题“节点和”用户“节点在我的neo4j数据库中通过变异。

所以,在突变中我创建了用户类型和问题类型。但是当我试图创建用户(创建问题的用户)和问题之间的关系时,突变不能按预期工作。

这是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 db中插入了一个具有唯一userID“1”的虚拟用户。我在graphiQL中运行了这个“ createQuestion ”变种来为现有用户创建一个问题,因此我将userID“1”作为参数传递,

// createQuestion(questionID:Int!,title:String!,details:String !, userID:Int!)

在运行此突变查询后,我希望在现有用户和创建的问题之间获得[:CREATED_BY]的关系, 但我的数据库现在有2个用户具有相同的用户ID“1”(即已插入一个具有相同用户ID“1”的用户,并且此新插入的用户和问题节点之间现在存在关系。)

我需要避免创建具有相同ID的新重复用户,而只是创建现有用户和问题之间的关系。 有人可以让我知道我在这里弄错了什么吗?

1 个答案:

答案 0 :(得分:1)

您必须更改查询:

 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;"

注意我还删除了userID属性,因为您不需要它,因为您已经创建了从User到Question的关系

编辑:

您可以通过两种方式从评论中解决问题:

将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;"