Spring Data Neo4j内存消耗"超级节点"实体

时间:2015-08-07 11:11:11

标签: java neo4j spring-data-neo4j

据我所知,一旦加载了Spring Data Neo4j中的NodeEntity,默认行为就是通过仅获取相关节点的id来延迟加载其关系。 虽然在大多数情况下它似乎相当不错,但我对所谓的超级节点" - 与其他节点有很多关系的节点。这种类型的节点,即使它们本身很小,也会拥有大量的ID,使用的内存比我们希望的更多,并且可能没有足够的负载和#34;实际上......

所以我的问题是 - 我该如何处理那种超级节点?

我的第一个想法是简单地从那种节点中删除所有@ RelatedTo / @ RelatedToVia映射(或者至少是那些关系类型为#34;众多"的映射)并且在对那些节点进行操作时简单地绕过SDN需要关系,并在其他情况下使用SDN。 它似乎有意义吗?在这种情况下你有其他一些建议或经验吗?

3 个答案:

答案 0 :(得分:2)

我没有使用过SDN,但我会试一下metanodes的近似值。使用此近似值,您可以构建一个结构,将关系总数分为元节点数(如果一个节点有1000个连接,并且您使用10个元节点,则每个元节点将有100个连接,而超级节点只有4个您可以在下面的图像中看到图形表示:http://i.stack.imgur.com/DMQGs.png

通过这种方式,您可以很好地控制节点可以拥有多少关系,从而可以控制SDN最多加载多少节点。

您可以在http://neo4j.com/book-learning-neo4j/以及此类似帖Neo4j how to avoid supernodes

中详细了解相关信息

答案 1 :(得分:1)

首先,您能否提供您正在使用的SDN版本,以便我们可以将问题定位到图书馆的正确维护者。

其次,虽然我不太了解SDN的内部结构但是与其他OGM一起工作很多,但是我对LazyLoading的理解与你提供的那个完全不同,原因很简单,延迟加载id可以是如果另一个进程正在删除其中一个具有其中一个ID的节点,那么您可能会损坏数据,这是非常有害的。

通常,在其他OGM中很常见,如果对象没有表示关系的注释,则只需从元数据和加载的节点重新创建对象。

但是,如果它有关系,那么您将创建该对象的代理,以扩展实体本身。

代理上的实体值不会在第一个实例中实例化,然后您将覆盖所有getter并在代理中添加用于检索相关节点的方法(因此实体管理器将注入代理中)。 / p>

所以基本上,代理将为空,直到你调用其中一个getter。

你也可以"细粒"这种行为通过创建扩展默认存储库的自定义存储库,在某种意义上,您可以选择仅 LAZY_LOAD 一种关系, EAGER_LOAD 其他关系。

albert 描述的方法在某些情况下很有意义,但是在基本的OGM方面很难实现,你最好有一个在生命周期事件,或者为getter方法添加某种分页,我认为这不是OGM的一部分。

答案 2 :(得分:1)

对于超级节点,我只是没有指定超级节点实体上的关系。但仅限于相关节点。

如果您对这种关系感兴趣,您可以查找相关节点并关注超级节点。

或者,如果您确实需要加载数百万个关系,请使用cypher语句。

您还可以将多个关系放在一个单独的节点上,或者添加一个树状子结构,这也允许处理子选择。