0

在使用图数据库(我的案例 Neo4j)时,我们可以通过多种方式表示相同的信息。使每个实体成为节点并通过关系连接所有实体,或者只是将实体添加到 Node.diff 的属性列表中

以下是相同数据的两种不同表示形式。 所有信息都表示为节点 信息表示为特定节点的属性 总体而言,哪种机制适用于哪些条件?

我的用例涉及从不同节点遍历数据库直到 4 个深度,并通过连接的节点或属性检查信息(基于它是哪种方法)。一个感兴趣的问题可能是,“谁是约翰去斯坦福的朋友?”

存储,计算方面有什么区别

4

2 回答 2

1

通常,属性是延迟加载的,并且在缓存中保存的成本更高,尤其是字符串。节点和关系对于遍历最有效,特别是因为关系类型与关系记录一起存储,因此在用于遍历时不会触发属性加载。

此外,平衡图(即,没有多少具有超过 10K 关系的密集节点)是最有效的遍历。

我会尝试将大多数重复出现的属性建模为连接到实体的节点,从而使用图形本身来索引这些值,而不必恢复过滤属性值或使用昂贵的索引查找来索引属性。

于 2012-06-18T08:59:06.900 回答
0

第一个要好得多,因为您正在查询诸如斯坦福之类的实体,并且该实体与许多人员节点相关。我认为建模为节点更直观,更容易查询。在您的第二个模型中,“找到所有上过斯坦福的人”并不是一件容易的事,因为您没有地方可以开始遍历。我将主要使用属性来描述节点/实体,使用它们来过滤查询的结果,例如谁是 2010 年去斯坦福大学的约翰的朋友。在这种情况下,年份属性将仅用于修剪结果. 取决于您的用例 - 如果年份真的很重要并且驱动大量查询或用于表示时间线,您甚至可以将年份建模为连接到斯坦福的节点。

于 2012-06-16T05:09:09.647 回答