Database Neo4J-嵌套节点在JVM上导致java.lang.OutOfMemoryError

Database Neo4J-嵌套节点在JVM上导致java.lang.OutOfMemoryError,database,neo4j,cypher,data-modeling,Database,Neo4j,Cypher,Data Modeling,我刚刚开始练习Neo4J,在阅读了一些文档和教程之后,我创建了我的数据模型,在处理嵌套节点、与具有相同标签的另一个节点相关的节点等时遇到了一个问题(关系的级别没有上限) 所以基本上一个类型属于一个人,然后每个类型都可以是另一个类型的子类型。我试图读取与一个人相关的所有类型(以及与最高类型节点相关的子类型节点)。每个人有2000-3000个类型,嵌套类型节点的深度可达10层 以下是我正在尝试的: MATCH (p:Person{name: 'Bill'})-[*0..]-(t:Type) RE

我刚刚开始练习Neo4J,在阅读了一些文档和教程之后,我创建了我的数据模型,在处理嵌套节点、与具有相同标签的另一个节点相关的节点等时遇到了一个问题(关系的级别没有上限)

所以基本上一个类型属于一个人,然后每个类型都可以是另一个类型的子类型。我试图读取与一个人相关的所有类型(以及与最高类型节点相关的子类型节点)。每个人有2000-3000个类型,嵌套类型节点的深度可达10层


以下是我正在尝试的:

MATCH (p:Person{name: 'Bill'})-[*0..]-(t:Type) RETURN p, t
这会导致JVM内存不足,DB目前托管在一个内存为2GB的盒子上,但稍后会升级,但我仍然觉得我遗漏了一些东西,这样的查询怎么会需要这么多内存

如果我以深度限制运行同一查询,查询在深度5之前运行良好,因此

MATCH (p:Person{name: 'Bill'})-[*0..4]-(t:Type) RETURN p, t
这个查询工作正常,为一个人返回了大约2308个节点和2307个关系


解决方案是否只是将DB托管在一个内存更多的盒子上,但即使如此,当DB同时收到多个请求时会发生什么


我觉得我遗漏了什么。

无界变长路径是众所周知的内存和时间密集型路径,因为搜索树的大小随着搜索深度呈指数增长

除此之外,我认为还有另一个原因让你的查询耗时这么长。查询的关系模式(
-[*0..]-
)是非定向的。因此,可变长度搜索将不仅仅从子类型返回到其父类型,还将从父类型返回到其所有子类型。这将导致搜索许多您并不真正感兴趣的类型(可能是所有类型),并且您的结果将无效

由于您的数据模型的关系都指向一个
人的方向,因此这可能对您更有效(即,您可以使其使用高于4的上限;在本例中,我使用了10):


MATCH(p:Person{name:'Bill'})无界变长路径是众所周知的内存和时间密集型路径,因为搜索树的大小随搜索深度呈指数增长

除此之外,我认为还有另一个原因让你的查询耗时这么长。查询的关系模式(
-[*0..]-
)是非定向的。因此,可变长度搜索将不仅仅从子类型返回到其父类型,还将从父类型返回到其所有子类型。这将导致搜索许多您并不真正感兴趣的类型(可能是所有类型),并且您的结果将无效

由于您的数据模型的关系都指向一个
人的方向,因此这可能对您更有效(即,您可以使其使用高于4的上限;在本例中,我使用了10):


MATCH(p:Person{name:'Bill'})您可能希望在这里使用APOC过程。您似乎对路径本身不感兴趣,只对节点感兴趣,因此过程
apoc.path.subgraphNodes()
可能会起到作用(确保您使用的是关系的子节点遵循的正确方向):


MATCH(p:Person{name:'Bill'})您可能希望在这里使用APOC过程。您似乎对路径本身不感兴趣,只对节点感兴趣,因此过程
apoc.path.subgraphNodes()
可能会起到作用(确保您使用的是关系的子节点遵循的正确方向):


MATCH(p:Person{name:'Bill'})嘿,塞伯山姆,谢谢你的回答,事实上,这确实让我能够让它以高于4的上限工作,实际上我现在可以将它设置为无限,内存也很好。。我不知道设置为非定向时变长搜索需要多少内存。嘿,cybersam,谢谢你的回答,确实这让我可以让它以高于4的上限工作,实际上我现在可以将它设置为无限,内存很好。。我不知道设置为非定向时变长搜索需要多少内存。我研究了apoc过程,但决定不使用它们,至少现在不使用。没问题。不过,出于将来的考虑,至少在Neo4j 3.2发布之前,APOC使用“NODE_GLOBAL”唯一性(包括subgraphNodes())的路径扩展过程往往比Cypher的变长模式匹配快得多,因为涉及到无限长路径和互连图。对于树形图,Cypher应该工作得很好。我已经研究了apoc程序,但决定不使用它们,至少现在是这样。没问题。不过,出于将来的考虑,至少在Neo4j 3.2发布之前,APOC使用“NODE_GLOBAL”唯一性(包括subgraphNodes())的路径扩展过程往往比Cypher的变长模式匹配快得多,因为涉及到无限长路径和互连图。不过,对于树图,Cypher应该可以很好地工作。
MATCH (p:Person {name: 'Bill'})<-[*..10]-(t:Type)
RETURN p, t
MATCH (p:Person{name: 'Bill'})<-[:BELONGS_TO]-(t:Type)
CALL apoc.path.subgraphNodes(t, {relationshipFilter:'CHILD_OF>'}) YIELD node
RETURN p, node