Neo4j图形设计 - 标题/类别节点?

时间:2013-03-29 16:01:12

标签: neo4j

为单个用户提供数千种关系的最佳设计是什么?

(在社交网络应用上工作 - 如果你知道任何“通用”社交网络设计,请指出它们......会有所帮助)

查看此图片 - 状态更新代表一个链接列表,而兴趣代表misc interest ..这些兴趣可能真正为单个用户带来数千个节点 - 这不会导致某种超级节点问题吗?

图1

Figure

为这些兴趣设置类别或“标题”节点是否更好的设计,然后这两个兴趣属于该类别节点?我认为,当您最初处理用户节点和几个关系/标头节点时,它可能更有效,而不是可能有数千个节点直接与用户节点相关。

实施例: 图2     用户
    |
    +兴趣+
               + -----兴趣
               + -----兴趣
               + -----等......

并且不应该有利益也有“子标题”类别节点,如“书籍”,“电影”,“产品”之类的:

**FIGURE 3**
User
|
+ interests+ 
           + books+
           |      + interest
           |      + interest
           |      + interest
           + movies+<br>
                   + interest
                   + interest
                   + interest

(显然我是neo的n00b)

以下是我的问题:

  1. 哪种模式最适合高性能,可扩展,类似Facebook的系统 - 一个没有类别,或者一个?请记住表现..

  2. 兴趣可能并不总是爆发到数千个节点 - 可能是十几个或100个 - 添加类别设计是否增加了太多的开销?考虑尝试找到喜欢你所做同事的朋友 - 添加类别会增加太多开销吗?

  3. 后面的图片 - 那些带有类别和子类别节点的图片 - 它们看起来更好但是对性能,组织等没有任何作用吗?

  4. 代替类别节点,是否应该只有一个类别属性来描述它所属的类别?是否会在索引上添加带有category属性的节点与具有类别节点一样好?

  5. 关于问题4,在索引上添加带有类别的节点会更好吗?

  6. 这种结构的缺点是什么?它们有什么真正的优势吗?

1 个答案:

答案 0 :(得分:2)

我认为当你的兴趣扩大到数十万或数百万个连接时,兴趣类别是一个好主意,如果只有几千个连接它仍然可以运行得足够好。也许这甚至可以让您在实际需要时将用户节点发展为可能。 (就像推特上不同的超级明星处理方式)。

这一切还取决于您的使用案例,您希望通过模型回答哪些类型的查询,这些查询仅限于类别,还是始终在所有类别中查询以下兴趣?

您需要始终考虑的一点是,触及的关系数量会随着您遍历到图表中的每一步而呈指数级增长。因此请注意,如果您从用户查询其所有朋友或朋友的朋友及其所有兴趣,那么触及的元素数量会很快增长。确保您的服务器有足够的内存,以便在内存中保留足够大的图形部分,以便快速响应您的请求。

并确保尽早进行性能测试和负载测试(例如使用数据生成器)。

顺便说一下。为了过滤掉,每个兴趣都有一个独特的关系类型甚至是明智的,这样你就可以在不实际跟踪你不感兴趣的rels的情况下尽早过滤。

索引通常有助于全局类别,您可以使用其名称和用户ID为您的类别编制索引,但是您有用户时间类别索引条目也可以快速增长。

我认为如果您的用例实际上是针对每个类别而不是针对所有兴趣(特别是所有用户和所有兴趣),那么类别方法应该可以很好地扩展。