可以" DISTINCT"在CYPHER查询中,当查询没有返回结果时,会对内存错误负责吗?

时间:2017-12-03 14:11:47

标签: neo4j cypher

处理5000个低密度节点(平均连接数<5)的小图,我得到以下错误,这是我在升级到neo4j 3.3.0之前从未得到的。该图包含900个分子及其支架层次结构,最低可达5个级别。

(:Molecule)<-[:substructureOf*1..5]-(:Scaffold) 

Neo.TransientError.General.StackOverFlowError
There is not enough stack size to perform the current task. This is generally considered to be a database error, so please contact Neo4j support. You could try increasing the stack size: for example to set the stack size to 2M, add `dbms.jvm.additional=-Xss2M' to in the neo4j configuration (normally in 'conf/neo4j.conf' or, if you are using Neo4j Desktop, found through the user interface) or if you are running an embedded installation just add -Xss2M as command line flag.

查询实际上非常简单,我使用不同,因为几条路径可能会导致单个支架。

match (m:Molecule) <-[:substructureOf*3]- (s:Scaffold) return distinct s limit 20

此查询返回上述错误消息,而下一个查询确实有效。

match (m:Molecule) <-[:substructureOf*3]- (s:Scaffold) return s limit 20

有趣的是,查询适用于更大的数据库,在这个较小的数据库中,最深的层次结构恰好是2.因此,最后一个查询的结果是“#34;没有变化,没有记录”&#34;。 / p>

如何将DISTINCT添加到查询失败并显示内存错误?有没有办法避免它,因为我无法猜测每个分子的层次深度可能不同。

我尝试了其他帖子中建议的以下值。     #dbms.memory.heap.initial_size =512米     #dbms.memory.heap.max_size =512米

dbms.memory.heap.initial_size=512m
dbms.memory.heap.max_size=4096m

dbms.memory.heap.initial_size=4096m
dbms.memory.heap.max_size=4096m

这些都没有解决这个问题。 提前感谢任何帮助或线索。

1 个答案:

答案 0 :(得分:0)

感谢您提供更多信息,我能够在Neo4j 3.3.0和3.3.1上复制此内容,这可能与pruning-var-expand操作的行为有关(这有助于在使用时提供帮助) 3.2.x中引入的可变长度扩展和不同结果),并且仅在使用精确数量的扩展(不是范围)时才使用。 Neo4j工程师将研究这个问题。

与此同时,您的要求是我们可以使用不同类型的查询来获取您希望避免此操作的结果。尝试尝试一下这个:

match (s:Scaffold)
where (s)-[:substructureOf*3]->(:Molecule)
return distinct s limit 20

如果您确实需要执行可能产生此错误的查询,您可以通过在CYPHER 3.1之前添加查询来绕过它们,这将使用旧版Cypher生成的计划来执行此操作。没有使用修剪var扩展操作。