2017-08-09 12 views
0

我正在为我的测试项目使用neo4j dB和apollo-graphql服务器。我试图创建一个应用程序,其中用户可以创建一个问题(具有唯一的ID),然后它将由其他用户回答(类似于stackoverflow但具有非常小的功能)。我想创建“问题“节点和”用户“节点在我的neo4j数据库中通过变异。在我的neo4j数据库中,graphql变异没有像预期的那样工作2种类型

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

这里是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 
     } 
     ) 
     } 
    ) 
    }, 
    } 

我已经插入了独特的用户ID虚拟用户“1”在运行这个变异查询之前在neo4j db中。我跑graphiQL这个“createQuestion”突变创造一个问题为现有的用户,所以我通过用户ID“1”的说法,

// createQuestion(questionID:诠释!标题:字符串!细节:字符串,用户ID:智力)

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

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

回答

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属性,因为您不需要它,因为您已经创建了用户与问题的关系

编辑:

可以解决从评论的问题有两种方式:通过添加用户名财产问题

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

非常感谢,它按我期望的方式工作。对于userID = 1,产生了预期的关系和结果。但后来我试图创建另一个问题与其他用户(userID = 2)相同的问题ID,现在在我的neo4j数据库,相同的问题(questionID = 1)与用户1和新用户2都有[:CREATED_BY]关系。你能告诉我在这种情况下该怎么办? –

+0

增加了一个例子 –

+0

Thanks @Tomaž,我尝试了你提到的两种方式,但仍然是相同的QuestionID似乎是为多个用户创建的。而且由于neo4j不支持uniqueidentifiers,所以我无法为问题ID创建唯一的ID,我现在处于深陷困境之中。您能帮我吗? –

相关问题