我如何在 Neo4j 中构建投票系统?

How can I structure a voting system in Neo4j?

我有这样的节点和关系:

(u:User)

(t:Topic)-[r:HAS_FACT]->(t:Fact)

(t2:Topic)-[r2:HAS_FACT]->(t:Fact)

或者,简化:

(t:Topic)-[r:HAS_FACT]->(t:Fact)<-[r2:HAS_FACT]-(t2:Topic)

用户可以上传 Facts 并将它们绑定到 Topics。由于互联网的疯狂,我想添加一个投票系统,使用户能够 support/validate/upvote 事实,但他们不只是对事实进行投票,他们需要对主题和事实的组合进行投票。所以我真的认为他们会支持 r 和 r2?

本质上,我想将 User 节点绑定到某种投票系统,该系统以某种方式绑定到 FactTopic 节点的组合。我现在不反对重组任何东西,如果这里有更合理的解决方案,我很乐意这样做!

提前致谢!

听起来您想跟踪 FactTopicUser 的任何特定组合的投票。

为此,您需要在图表中插入一种新型节点,它可以为您跟踪这一点,对此我可以看到两个选项——统计每个主题/事实在单个节点上的所有选票组合或对每个主题/事实/用户投一票。

每个主题/事实的单个节点看起来像

(:Topic)<-[VOTES_FOR_TOPIC]-(votes:Votes {sum: 10})-[:VOTES_FOR_FACT]->(:Fact)
// Each Votes node will have multiple users
(u1:User)-[:UPVOTED]->(votes)
(u2:User)-[:DOWNVOTED]->(votes)

请注意,我假设您可以投反对票和投赞成票,但如果您只能投赞成票,那差别不大。

备选方案是每个 user/topic/fact 组合一个 Vote 节点。除了每个 :Vote 节点只有一个 :User 之外,这看起来与上面相同。假设每张选票如果是正面的则为 1,如果是负面的则为 -1,您可以通过

获得事实和主题组合的完整统计
MATCH (t:Topic) WHERE id(t) = $topic_id
MATCH (f:Fact) WHERE id(f) = $fact_id
MATCH (t)<-[:VOTES_FOR_TOPIC]-(vote:Vote)-[:VOTES_FOR_FACT]->(:Fact)
RETURN sum(vote.value)

我认为这两种解决方案中的任何一种都适合您。请注意,您实际上是在实现一个 hyperedge,在 Neo4j 中,它是使用一个额外的节点完成的。