据我所知,一旦加载了Spring数据中的NodeEntity Neo4j,默认行为就是通过只获取相关节点的ids来延迟加载其关系。虽然在大多数情况下似乎都很好,但我对所谓的“超级节点”(与其他节点有大量关系的节点)的情况表示怀疑。这种节点,即使它们本身很小,也会保存大量的it,使用比我们想要的内存更多的内存,而且可能没有有效地“懒惰地加载”.
所以我的问题是-我该如何处理这种超级节点?
我的第一个想法是简单地从这种节点中删除所有@RelatedTo/@RelatedToVia映射(或者至少是那些具有“众多”关系类型的映射),并在需要对这些关系进行操作时简单地绕过SDN,在其他情况下使用SDN。它似乎有意义吗?在这种情况下,你有其他的建议或经验吗?
发布于 2015-08-08 09:56:11
对于超级节点,我只是不指定超级节点实体上的关系。但只在相关节点上。
如果您对这种关系感兴趣,您可以查找相关节点并跟踪到超级节点。
或者,如果您确实需要加载数百万的关系,请使用密码语句。
为此,您还可以将许多关系放在一个单独的节点上,或者添加一个树状子结构,该子结构还允许处理子选择。
发布于 2015-08-07 03:44:54
我没有和SDN合作过,但是我会尝试一下metanodes的近似。在这种近似下,您将构建一个结构,将关系的总数除以metanodes的数量(如果一个节点有1000个连接,并且使用10个metanodes,则每个metanode将有100个连接,而超级节点仅为4个。您可以在折叠图像:http://i.stack.imgur.com/DMQGs.png中看到一个图形表示。
通过这种方式,您可以很好地控制有多少关系可以有一个节点,因此有多少节点将被SDN最大加载。
你可以在http://neo4j.com/book-learning-neo4j/上读到更多关于它的信息,也可以在这个类似的文章中读到Neo4j how to avoid supernodes。
发布于 2015-08-07 08:35:50
首先,您能提供您正在使用的SDN的版本吗?这样我们就可以将这个问题针对正确的库维护人员了。
第二,虽然我并不真正了解SDN的内部结构,但与其他OGM一起工作过,但我对LazyLoading的理解与您所提供的非常不同,原因很简单,懒惰加载ids可能非常有害,因为如果另一个进程正在删除具有这些ids之一的节点,则可能会损坏数据。
通常,它在其他OGM中很常见,在对象没有表示关系的注释的情况下,您只需从他的元数据和加载的节点重新创建对象。
但是,如果它有关系,那么您将创建该对象的代理,该代理将扩展实体本身。
代理上的实体值不会在第一个实例中实例化,然后您将覆盖所有的getter,并在代理中添加检索相关节点的方法(因此将在代理中注入实体管理器)。
因此,基本上,一个代理将是空的,直到您调用它上的一个getter。
您还可以通过创建扩展默认存储库的自定义存储库来“细化”这种行为,从某种意义上说,您可以选择只使用LAZY_LOAD一种关系类型和EAGER_LOAD其他类型的关系。
在某些情况下,albert描述的方法很有意义,但是在基本OGM方面很难实现,最好有一个BehaviorComponent在生命周期事件中为您处理这个问题,或者在getter方法中添加某种分页,我认为它现在不是OGM的一部分。
https://stackoverflow.com/questions/31876328
复制相似问题