在我的neo4j db中,graphql突变在两种类型中没有像预期的那样工作

在我的neo4j db中,graphql突变在两种类型中没有像预期的那样工作,neo4j,cypher,graphql-js,apollo-server,Neo4j,Cypher,Graphql Js,Apollo Server,我在测试项目中使用Neo4JDB和apollo graphql服务器。我正在尝试创建一个问答应用程序,其中用户可以创建一个问题(具有唯一id),然后由其他用户回答(类似于stackoverflow,但功能非常少)。我希望通过变异在neo4j db中的“问题”节点和“用户”节点之间创建关系 因此,在我创建的用户类型和问题类型的突变中。但是,当我试图在用户(创建问题的人)和问题之间建立关系时,突变并没有像预期的那样起作用 下面是graphql模式 type Question { questi

我在测试项目中使用Neo4JDB和apollo graphql服务器。我正在尝试创建一个问答应用程序,其中用户可以创建一个问题(具有唯一id),然后由其他用户回答(类似于stackoverflow,但功能非常少)。我希望通过变异在neo4j db中的“问题”节点和“用户”节点之间创建关系

因此,在我创建的用户类型和问题类型的突变中。但是,当我试图在用户(创建问题的人)和问题之间建立关系时,突变并没有像预期的那样起作用

下面是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数据库中插入了一个具有唯一userID“1”的虚拟用户。我在graphiQL中运行了这个“createQuestion”变异,为现有用户创建了一个问题,因此我将userID“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;"
注意,我还从问题中删除了userID属性,因为您不需要它,因为您已经在用户和问题之间创建了关系

编辑:

您可以通过以下两种方式从注释中解决问题:

通过向问题添加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;"
let query=”
合并(u:Users{userID:{userID}})

MERGE(u)非常感谢,它按我预期的方式工作。对于userID=1,产生了预期的关系和结果。但后来我尝试为另一个用户(userID=2)创建另一个具有相同问题id的问题,现在在我的neo4j数据库中,相同的问题(questionID=1)已经[:CREATED_BY]与用户1和新用户2的关系。你能告诉我在这种情况下应该怎么做吗?添加了一个例子谢谢@Tomaž,我尝试了你提到的两种方法,但似乎仍然为多个用户创建了相同的问题id。由于neo4j不支持唯一标识符,所以我也不能为问题id创建唯一id,我陷入了深深的困境现在有问题。你能在这里帮助我吗?是的,相同的问题ID,但不是相同的节点,因此每个用户都有自己的问题ID 1…取决于你的应用程序…neo4j支持使用apoc libraryOMG生成唯一的ID!如此快速的响应!!你太酷了…我想你有一个观点…我想我会用你的答案解决。最后,您能否发送一个重要的链接,让neo4j支持使用apoc库生成唯一ID?