【问题标题】:How is representing all information in Nodes vs Attributes affect storage, computations?在节点和属性中表示所有信息如何影响存储、计算?
【发布时间】:2012-06-15 13:28:23
【问题描述】:

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

以下是同一数据的两种不同表示形式。 总体而言,哪种机制适用于哪些条件?

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

在存储、计算方面有什么区别

【问题讨论】:

    标签: graph neo4j graph-databases


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢彼得。除非来自 Neo4j 内部的人告诉他,否则他没有做出决定的依据。我在哪里可以找到有关 Neo4j 的事实,例如“通常,属性是延迟加载的,并且在缓存中保存成本更高,尤其是字符串。”如果我们可以通过 Neo4j 网站获得这些信息,那真的会对我们的决定产生重大影响。
    • Peter 来自 neo4j 内部 :-) 你看过手册中的性能指南吗:docs.neo4j.org/chunked/stable/performance-guide.html
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答。这与编写查询的难易程度无关,而是问的问题,它在存储和计算方面对性能的影响
    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多