【问题标题】:Should edges with properties be modeled as nodes in graph databases?是否应该将具有属性的边建模为图形数据库中的节点?
【发布时间】:2013-12-08 22:51:08
【问题描述】:

我正在学习图形数据库(具体来说是 Neo4j),我选择为游戏建模Ticket to Ride。游戏由每个玩家将城市相互连接起来。一些城市之间有两条路径,可能有不同的颜色。例如,从纽约到波士顿,你可以选择花两张红牌或两张黄牌。从蒙特利尔到波士顿,有两条路,但他们接受任何颜色,从蒙特利尔到纽约,你只能花3张蓝卡。


(来源:daysofwonder.com

我需要回答的问题有:

  • 穿过纽约、波士顿和蒙特利尔的最长路径是什么?
  • 从迈阿密到蒙特利尔的最短路径是什么,不包括蒙特利尔和波士顿之间的路段(可能是因为其他玩家走了这条路线)?
  • 4 的哪些部分使用红色存在?

我的问题是:城市之间的路线/路段应该是节点,还是应该是关系?我可以看到它的两个方面。让它们成为节点而不是关系有什么好处?

我需要在路线上记住的唯一属性是玩家拥有该路线,或者一些标记值(与 NULL 不同)来指示路线尚未拥有。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    我在做这个决定时经常问自己的一个规则是:如果我把它变成一个节点,我是否需要或改进一些东西,也就是说:有了一个节点,我可以将其他关系连接到它。您提到您需要将用户或所有者与该关系相关联,在这种情况下,它是一个很好的节点候选者(代表您的路线

    (Boston:Place)-[:route]->(x:Route)-[:route]->(Montreal:Place)
    

    如果在 Neo4j 2.0+ 上,这里使用标签

    还要注意,如果您需要搜索属于某人的路线,将其作为关系会更快,然后将其构建到索引中,因为我认为您可能在某个时候有很多很多路线,因此使它成为一个相当大的索引,但在这一点上我可能是错的,但它是值得考虑的。

    至于最长和最短,你总是可以使用

    shortestPath((n1:Place)-[r:route:*..]-(n2:Place))
    

    要排除,请查看 WHERE 子句,因为您很可能会做 WHERE r 一些事情。

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 2016-01-17
      • 2021-08-13
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多