2017-08-09 113 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,我現在處於深陷困境之中。您能幫我嗎? –

相關問題