【问题标题】:How can I structure a voting system in Neo4j?如何在 Neo4j 中构建投票系统?
【发布时间】:2021-12-01 21:05:44
【问题描述】:

我有这样的节点和关系:

(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。由于互联网的疯狂,我想添加一个投票系统,使用户能够支持/验证/支持事实,但他们不只是支持事实,他们需要支持主题和事实的组合。所以我真的认为他们会支持 r 和 r2 吗?

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

提前谢谢你!

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    听起来您想跟踪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)
    

    请注意,我假设您可以投反对票和投赞成票,但如果您只能投赞成票,则没有太大区别。

    另一种选择是每个用户/主题/事实comvination 一个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 中是使用额外的节点完成的。

    【讨论】:

    • 哇,这是个好主意,现在很明显了。只是为了确保我理解,第一个会计算从那个节点有多少关系,第二个会总结有多少投票节点图链接到主题和事实节点?我想我要做的是为一个主题/事实组合提供一个投票记录,然后我将拥有多个用户->该投票节点,然后将该投票节点连接到一个主题和一个事实。这感觉就像它可以轻松扩展到将来可能需要投票的任何内容。非常感谢,现在真的很明显!
    • > 确保我理解,第一个将计算从那个节点有多少关系,第二个将总结有多少投票节点图链接到主题和事实节点?是的,这听起来很对!如您所说,第一个实现可能是扩展性更好的实现。
    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多