2017-08-09 3 views
0

私のテストプロジェクトにはneo4j dBとapollo-graphqlサーバを使用しています。私はQ &を作成しようとしています。ユーザーが(一意のIDを持つ)質問を作成して、他のユーザーから回答を得ることができるアプリです(stackoverflowに似ていますが、最低限の機能を備えています)。 "質問 "ノードと" ユーザー "ノードを突然変異によってneo4jdbに追加しました。私のneo4j dbでは、graphqlの突然変異が2つのタイプに対して期待通りに機能しません

したがって、私が作成した突然変異でユーザータイプと質問タイプ。しかし、ユーザー(質問を作成した人)と質問との関係を作成しようとすると、突然変異が期待どおりに機能していません。ここで

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でダミーのユーザーを挿入していた... ...

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 

graphqlスキーマであり、ここで、リゾルバからの変異スニペットである「1」この突然変異クエリーを実行する前にneo4j dbに入れてください。そして、私は既存のユーザーのための質問を作成するにはgraphiQLに、この「createQuestion」突然変異を走ったので、私は、ユーザーID「1」を引数として、

// createQuestion(questionID渡されます。int!タイトル:文字列!詳細は:文字列、ユーザーID:!!INT)

そして、この変異クエリを実行した後、私はの関係を得るために期待していた[:CREATED_BY]既存のユーザーと問題作成の間、 しかし、私のデータベースは、今2を持っています同じユーザID「1」(すなわち、同じユーザID「1」を有するもう1人のユーザが挿入され、この新たに挿入されたユーザと質問ノードとの間に関係がある)を有するユーザ。

私が必要とするのは、同じIDを持つ新しい重複ユーザーを作成せずに、既存のユーザーと質問との関係を作成することです。 誰かが私にここで間違っていることを教えてもらえますか?

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

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すでに場所では、持っていると私は、クエリを変更します

答えて

1

あなたのクエリを変更する必要がありますユーザーから質問への関係を既に作成しているので、質問からuserIDプロパティも削除しました。

編集:

次の2つの方法でのコメントから問題を解決することができます

:質問への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 dbに同じ質問(questionID = 1)に[:CREATED_BY]という関係があります。この場合、どうすればいいのか教えてください。 –

+0

例を追加 –

+0

ありがとう@Tomaž、私はあなたが言及した両方の方法を試みたが、同じQuestionIDが複数のユーザーのために作成されているようだ。そして、neo4jが一意識別子をサポートしていないので、質問IDのために一意のIDを作成することはできません。私は今、深刻な問題に陥っています。 –

関連する問題