表示节点和属性中的所有信息如何影响存储和计算?

时间:2012-06-15 13:28:24

标签: graph neo4j graph-databases

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

以下是相同数据的两种不同表示。 All info represented as Nodes Info represented as Properties of specific Nodes 总的来说,哪种机制适合哪种条件?

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

存储,计算方面的区别

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

第一个更好,因为您正在查询斯坦福等实体,并且该实体与许多人节点相关。我认为建模为节点更直观,更容易查询。 “找到所有前往斯坦福大学的人”在你的第二个模型中做起来并不容易,因为你没有地方可以开始穿越。 我主要使用属性来描述节点/实体使用它们来过滤来自查询的结果,例如:谁是约翰的朋友谁在2010年去了斯坦福。在这种情况下,年份属性将只用于修剪结果。取决于您的使用案例 - 如果年份非常重要并且会引发大量查询或用于表示时间表,您甚至可以将年份建模为连接到斯坦福的节点。