我正在使用Spring Data Neo4j 4.0.0和Neo4j 2.2.1,我试图在根目录下导入一个类似时间树的对象。保存的对象是在最后构建并保存的,在保存过程的某个时刻,我收到了StackOverFlow错误:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Character.codePointAt(Character.java:4668)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3693)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
at java.util.regex.Pattern$Branch.match(Pattern.java:4500)
at java.util.regex.Pattern$Branch.match(Pattern.java:4500)
at java.util.regex.Pattern$Branch.match(Pattern.java:4500)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4466)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4177)
at java.util.regex.Pattern$Curly.match(Pattern.java:4132)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
at java.util.regex.Pattern$Branch.match(Pattern.java:4502)
at java.util.regex.Pattern$Branch.match(Pattern.java:4500)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715)
at java.util.regex.Pattern$Start.match(Pattern.java:3408)
at java.util.regex.Matcher.search(Matcher.java:1199)
at java.util.regex.Matcher.find(Matcher.java:618)
at java.util.Formatter.parse(Formatter.java:2517)
at java.util.Formatter.format(Formatter.java:2469)
at java.util.Formatter.format(Formatter.java:2423)
at java.lang.String.format(String.java:2792)
at org.neo4j.ogm.cypher.compiler.IdentifierManager.nextIdentifier(IdentifierManager.java:48)
at org.neo4j.ogm.cypher.compiler.SingleStatementCypherCompiler.newRelationship(SingleStatementCypherCompiler.java:71)
at org.neo4j.ogm.mapper.EntityGraphMapper.getRelationshipBuilder(EntityGraphMapper.java:357)
at org.neo4j.ogm.mapper.EntityGraphMapper.link(EntityGraphMapper.java:315)
at org.neo4j.ogm.mapper.EntityGraphMapper.mapEntityReferences(EntityGraphMapper.java:262)
at org.neo4j.ogm.mapper.EntityGraphMapper.mapEntity(EntityGraphMapper.java:154)
at org.neo4j.ogm.mapper.EntityGraphMapper.mapRelatedEntity(EntityGraphMapper.java:524)
at org.neo4j.ogm.mapper.EntityGraphMapper.link(EntityGraphMapper.java:324)
at org.neo4j.ogm.mapper.EntityGraphMapper.mapEntityReferences(EntityGraphMapper.java:262)
at org.neo4j.ogm.mapper.EntityGraphMapper.mapEntity(EntityGraphMapper.java:154)
at org.neo4j.ogm.mapper.EntityGraphMapper.mapRelatedEntity(EntityGraphMapper.java:524)
...
提前感谢您,我们非常感谢您的建议!
答案 0 :(得分:2)
SDN 4并非真正用于将对象批量导入Neo4j。它是用于通用Java应用程序的对象图映射框架,而不是批量导入程序(它将自己特定的一组问题带到表中)。支持SDN预期用例的一些设计决策与您尝试设计专用ETL时所做的相反。我们也受到Neo4j的HTTP Transactional端点性能的限制,虽然绝对意义上并不慢,但不能希望与批量插入器竞争。
我们将来会对性能进行一些改进,当Neo4j的新二进制协议发布时(2.3),我们将把它作为我们的传输协议插入。我们希望这可以提高进出数据库的传输速度至少一个数量级。但是,请不要指望这些更改会从根本上改变SDN 4的行为特征。虽然未来版本可能能够比目前更快地加载几千个节点,但它仍然不会是ETL工具,而且我我不希望它被这样使用。
答案 1 :(得分:0)
经过几个小时的反复试验,我发现我需要限制我的保存深度。
之前,我没有指定深度级别,并且保存的对象越来越大,因为其子项的插入也同时运行。因此,在每个save方法的深度为1之后,我终于摆脱了StackOverFlow错误。并且,通过不定期保存(我将所有对象放在ArrayList中并将它们全部保存在最后),导入ca的性能提升1分钟(从3.5分钟到2.5分钟)。 1000个节点(有关系)。
尽管如此,性能仍然不尽如人意,因为我可以在不到1分钟的时间内使用我以前的MongoDB实现导入超过60,000个数据。我不知道是不是因为SDN4而且嵌入式API会更快。如果有人对SDN4和嵌入式API进行了任何基准测试,我真的很好奇。