我如何在 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
节点绑定到某种投票系统,该系统以某种方式绑定到 Fact
和 Topic
节点的组合。我现在不反对重组任何东西,如果这里有更合理的解决方案,我很乐意这样做!
提前致谢!
听起来您想跟踪 Fact
、Topic
和 User
的任何特定组合的投票。
为此,您需要在图表中插入一种新型节点,它可以为您跟踪这一点,对此我可以看到两个选项——统计每个主题/事实在单个节点上的所有选票组合或对每个主题/事实/用户投一票。
每个主题/事实的单个节点看起来像
(: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 中,它是使用一个额外的节点完成的。
我有这样的节点和关系:
(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
节点绑定到某种投票系统,该系统以某种方式绑定到 Fact
和 Topic
节点的组合。我现在不反对重组任何东西,如果这里有更合理的解决方案,我很乐意这样做!
提前致谢!
听起来您想跟踪 Fact
、Topic
和 User
的任何特定组合的投票。
为此,您需要在图表中插入一种新型节点,它可以为您跟踪这一点,对此我可以看到两个选项——统计每个主题/事实在单个节点上的所有选票组合或对每个主题/事实/用户投一票。
每个主题/事实的单个节点看起来像
(: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 中,它是使用一个额外的节点完成的。