【发布时间】:2014-12-28 08:34:12
【问题描述】:
我正在尝试在 Neo4j 中实现数据模型。该模型在城市和街道上有兴趣点。街道连接点。 最初我认为点和街道都应该在图形数据库中表示为节点。 在这两种不同类型的节点之间存在关系(“点连接”)。 现在我在想这样的可能性,而不是将街道表示为节点,也许将街道表示为关系更正确(“连接两点”) 这实际上是我的问题。在模型中表示网络(线部分)更正确的方法是:用节点还是用关系?
【问题讨论】:
标签: neo4j
我正在尝试在 Neo4j 中实现数据模型。该模型在城市和街道上有兴趣点。街道连接点。 最初我认为点和街道都应该在图形数据库中表示为节点。 在这两种不同类型的节点之间存在关系(“点连接”)。 现在我在想这样的可能性,而不是将街道表示为节点,也许将街道表示为关系更正确(“连接两点”) 这实际上是我的问题。在模型中表示网络(线部分)更正确的方法是:用节点还是用关系?
【问题讨论】:
标签: neo4j
关系和节点之间唯一的主要区别是关系必须存在于两个节点之间。这意味着如果您不存储连接的两个兴趣点,您将无法存储特定街道。因此,如果您认为这是一个问题,您可能希望将街道存储为节点。如果您确定仅在街道上存在数据库中的兴趣点时才想存储街道,那么将街道表示为关系会更有意义。
一般来说,您应该尽量避免将属性存储在您只打算用于查找它们之间的关系的节点中。在这种情况下,您提到可能在每个兴趣点节点中记录“点与”属性。这会起作用,但本质上只是说两点之间存在关系,而没有实际使用关系。同样,如果您希望能够存储不存在兴趣点的街道,这可能是必要的,您可以通过将“点与“属性为 NULL 相关联,但我建议不要这样做。
要考虑的另一件事是您将在关系中存储什么。如果您使用街道是节点的模型,那么如果不将关系添加到您的图表中专门针对这些属性(也可能是街道关系的属性),就很难表示兴趣点之间的距离等数量。
更新:我想我会添加一个示例查询来展示如何使街道关系简化您的逻辑并使您的数据库的使用更加简单和直观。
假设您希望在 A 点和 B 点之间找到兴趣点最少的路径。
这是查询在关系模型中的样子:
MATCH (a:Point {name: "foo"}), (b:Point {name: "bar"}),
p = shortestPath(a-[*:Street]-b)
RETURN p
通过在适当的地方使用关系,您可以启用 Neo4j 的功能,允许您使用相对简单的查询完成大量工作。在将街道表示为节点的模型中,很难想出一种方法来编写此查询,但它很可能会更复杂且效率更低。
【讨论】: