是否应将具有属性的边建模为图数据库中的节点?

时间:2013-12-08 22:51:09

标签: neo4j

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

我需要回答的问题包括:

  • 纽约,波士顿和蒙特利尔最长的路径是什么?
  • 从迈阿密到蒙特利尔的最短路径是什么,不包括蒙特利尔和波士顿之间的路段(大概是因为其他玩家选择了路线)?
  • 使用红色红色存在哪些4段?

我的问题是:城市之间的路线/路段应该是节点,还是应该是关系?我可以两种方式看到它。制作节点有什么好处,而不是关系?

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

1 个答案:

答案 0 :(得分:4)

我在做出这个决定时常常问自己的一条规则是:如果我将它作为一个节点,我是否需要或改进,即:通过一个节点,我可以将其他关系连接到它。您提到您需要将用户或所有者与该关系联系起来,在这种情况下,它是节点的良好候选者(代表您的路线

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

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

另请注意,如果您需要搜索属于某人的路线,那么将它作为一种关系会更快,然后将其构建为索引,因为我认为您可能在某些时候有很多很多路线,从而使它成为一个巨大的指数,但我在这一点上可能是错的,但它不考虑。

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

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

要排除,看看WHERE子句,因为你最有可能做什么r<>东西。