首页 文章

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

提问于
浏览
0

我正在为我的测试项目使用neo4j dB和apollo-graphql服务器 . 我正在尝试创建一个Q&A应用程序,用户可以在其中创建一个问题(具有唯一ID)然后它将被其他用户回答(类似于stackoverflow但具有非常小的功能) . 我想创建“ Questions " node and " 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 db中插入了一个具有唯一userID "1"的虚拟用户 . 我把这个“ createQuestion " mutation in graphiQL to create a question for the existing user and so I passed userID " 1”作为参数,

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

And after running this mutation query, I was hoping to get a relation of [:CREATED_BY] between the existing user and the question created, 但是我的数据库现在有2个用户具有相同的用户ID "1"(即已插入一个具有相同用户ID "1"的用户,并且此新插入的用户和问题节点之间现在存在关系) .

我需要的是避免创建具有相同id的新重复用户,而只是创建现有用户和问题之间的关系 . So could someone please let me know what I have mistaken here ?

1 回答

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

相关问题