2014-09-24 73 views
0

我是neo4j的新手,我需要使用neo4j進行某種輪詢web應用程序。如何在neo4j中實現數據模型。用戶,問題和答案

用戶用幾個選項詢問問題以獲得答案。用戶邀請其他用戶回答此問題。用戶通過選擇一個或多個選項來回答問題。應該可以查詢投票結果。

我有3種類型的節點:User,Question,Option

首先我在想這個模型。

  1. (User)-[:ASKS]->(Question)
  2. (Question)-[:INVITES]->(User)
  3. (Question)-[:HAS]->(Option)
  4. (User)-[:CHOOSES]->(Option)

但在這種情況下,如果我需要把所有的問題,當前的用戶說,我需要從User去所有他選擇了(所有問題)Options。然後弄清楚,這個用戶回答哪個問題。

然後我想連接UserQuestion,而不是連接UserAnswer。新的關係有一個屬性,用於存儲用戶選擇回答此問題的Option ID。

  1. (User)-[:ASKS]->(Question)
  2. (Question)-[:INVITES]->(User)
  3. (Question)-[:HAS]->(Option)
  4. (User)-[:ANSWERS {optionIds: [...]}]->(Question)

但在這裏,它是很難對投票結果的查詢。 (5個用戶選擇了option1,2個用戶選擇了option2,...)。 而且好像將一個節點的id存儲在另一個節點/關係中不是在neo4j中執行任何操作的正確方法。

現在,我想這樣做:

  1. (User)-[:ASKS]->(Question)
  2. (Question)-[:INVITES]->(User)
  3. (Question)-[:HAS]->(Option)
  4. (User)-[:CHOOSES]->(Option)
  5. (User)-[:ANSWERS]->(Question)

你認爲哪種方式更好?預先感謝您的幫助。

回答

1

我認爲你不應該太在意遍歷一個額外的關係從用戶到他的每個答案。你可能會很容易過度複雜你的模型和你的代碼。並非每個查詢都需要一步完成。

選項2不是用圖形數據庫「做事情的正確方法」。選項3增加了冗餘性和複雜性。所以,對我來說,你的第一個選擇可能是好的,這取決於你的用例。

但是,說「問題邀請用戶」是不直觀的。另外,如果您希望允許單個問題擁有多個提問者和多個被邀請者,則無法知道哪個提問者邀請哪個被邀請者。

這個怎麼樣模式:

(:User)-[:SENDS]->(:Invitation) 
(:Question)<-[:FOR]-(:Invitation)-[:TO]->(:User) 
(:Question)-[:HAS]->(:Option) 
(:User)-[:CHOOSES]->(:Option) 

的邀請節點可以跟蹤誰問的人是怎樣的問題。此外,閱讀關係更直觀,因此更易於維護。

0

下面的查詢將返回您,問題,選項,並收集用戶相對於選項 匹配 (問:用戶) - [:問] - (問題:問題) - [:有] - (o :選項)

與提問者,問題,選項,節點((O) - [:的answere] - ()))作爲asweredNodecollection //評論:以上asweredNodecollection是2個維陣列,在第二dimentiona它包含兩個節點,索引0選項0和索引1回答用戶 返回asker,question,collect({option:option,ansered:asweredNodecollection})作爲輸出

如果你想得到所有的選項由Answered用戶選擇特定的問題,然後你可以做這樣的事情。 可選匹配(o) - [:回答] - (aswereUser:用戶) 返回問題,問題: aswereUser,作爲選擇收集(o)

相關問題