如何在Neo4j中表示网络的线条

时间:2014-12-27 15:21:51

标签: neo4j

我正在尝试在Neo4j中实现数据模型。该模型在城市和街道上有兴趣点。街道连接点。 最初我认为点和街道都应该在图数据库中表示为节点。 在这两种不同类型的节点之间存在关系(“点与......连接”)。 现在我想的是,不是将街道表示为节点,而是将街道表示为关系(“连接两点”)可能更为正确 这实际上是我的问题。在模型中表示网络(线路部分)的更正确的方法是什么:节点或关系?

1 个答案:

答案 0 :(得分:3)

关系和节点之间唯一的主要区别是两个节点之间必须存在关系。这意味着如果您没有存储它连接的两个兴趣点,您将无法存储特定街道。因此,如果您认为这是一个问题,您可能希望将街道存储为节点。如果您确定如果您的数据库中存在街道上存在的兴趣点,那么您只想存储街道,那么将街道表示为关系更有意义。

通常,您应该尽量避免在只打算用于查找它们之间关系的节点中存储属性。在这种情况下,您可以在每个兴趣点节点中提及可能的故事情节“点与...相关联”属性。这可行,但基本上只是说两点之间存在关系而没有实际使用关系。同样,如果您希望能够存储没有兴趣点的街道,这可能是必要的,您可以通过离开“存储”没有兴趣点的街道来存储“ point与“property as NULL”相关联,但我建议不要这样做。

要考虑的另一件事是你将存储在关系中。如果你选择街道为节点的模型,那么很难表示像兴趣点之间的距离这样的数量,而不会在图表中专门为这些属性添加关系,这些属性也可能是街道关系的属性。

更新:我想添加一个示例查询,以展示如何使街道关系简化您的逻辑,并使您的数据库使用更简单,更直观。

想象一下,您希望找到A点和B点之间感兴趣点最少的路径。

这是关系模型的查询结果:

MATCH (a:Point {name: "foo"}), (b:Point {name: "bar"}),
  p = shortestPath(a-[*:Street]-b)
RETURN p

通过在适当的地方使用关系,您可以启用Neo4j的功能,从而可以通过相对简单的查询完成大量工作。很难想象在模型中编写此查询的方法,您将街道表示为节点,但它很可能会更复杂,效率更低。