我正在学习图形数据库(Neo4j是具体的),我选择模拟游戏Ticket to Ride。游戏由每个将城市相互连接的玩家组成。有些城市之间有两条路径,可能有不同的颜色。例如,从纽约到波士顿,您可以选择花两张红色或两张黄牌。从蒙特利尔到波士顿,有两条路,但它们接受任何颜色,从蒙特利尔到纽约,你只能花3张蓝卡。
我需要回答的问题包括:
我的问题是:城市之间的路线/路段应该是节点,还是应该是关系?我可以两种方式看到它。制作节点有什么好处,而不是关系?
我需要在路线上记住的唯一属性是玩家拥有该路线,或者某些哨兵值(与NULL不同)以表示路线尚未拥有。
答案 0 :(得分:4)
我在做出这个决定时常常问自己的一条规则是:如果我将它作为一个节点,我是否需要或改进,即:通过一个节点,我可以将其他关系连接到它。您提到您需要将用户或所有者与该关系联系起来,在这种情况下,它是节点的良好候选者(代表您的路线
(Boston:Place)-[:route]->(x:Route)-[:route]->(Montreal:Place)
这里使用标签,如果在Neo4j 2.0 +
另请注意,如果您需要搜索属于某人的路线,那么将它作为一种关系会更快,然后将其构建为索引,因为我认为您可能在某些时候有很多很多路线,从而使它成为一个巨大的指数,但我在这一点上可能是错的,但它不考虑。
至于最长和最短,你总是可以使用
shortestPath((n1:Place)-[r:route:*..]-(n2:Place))
要排除,看看WHERE子句,因为你最有可能做什么r<>东西。