0

我在Neo4j 2.2.1中使用了Spring Data Neo4j 4.0.0,我试图在根目录下导入一个类似timetree的对象。提前Spring Data Neo4j 4.0.0:StackOverFlowError

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) 
... 

谢谢你,你的建议将非常感激:保存的目的是建立和结束,并在保存过程中的一些点保存,我得到这个计算器的错误!

回答

2

SDN 4并非真正用于批量导入Neo4j中的对象。它是一个用于通用Java应用程序的对象图映射框架,而不是批量导入器(它将自己的特定问题带到表中)。一些支持SDN预期用例的设计决定与您在尝试设计专用ETL时所做的相反。我们也受到Neo4j的HTTP Transactional端点的性能的限制,尽管这绝对不是很慢,但它不能希望与批处理插入器竞争。

我们将来会对性能进行一些改进,当Neo4j的新二进制协议发布时(2.3),我们将把它作为我们的传输协议。我们期望这可以将数据库之间的传输速度提高至少一个数量级。但是,请不要期望这些更改会从根本上改变SDN 4的行为特征。虽然未来版本可能能够比目前更快地加载几千个节点,但它仍然不会成为ETL工具,而我不会期望它被这样使用。

0

经过几个小时的反复试验,最后我发现我需要限制保存深度。

此前,我没有指定深度级别,并且保存的对象越来越大,因为其子项的插入也同时运行。所以,在每次保存方法的深度为1后,我最终摆脱了StackOverFlow错误。而且,通过不经常保存(我将所有对象放在ArrayList中并将它们全部保存在最后),我可以在1分钟内获得性能提升(从3.5分钟到2.5分钟)以导入ca. 1000个节点(有关系)。

尽管如此,性能仍然不令人满意,因为我可以在不到1分钟的时间内使用我以前的MongoDB实现导入超过60,000个数据。我不知道是不是因为SDN4,以及嵌入式API可以更快。如果有人对SDN4和嵌入式API进行了任何基准测试,我真的很好奇。

+0

感谢您的更新彼得。几件事SDN4目前是为搭配远程Neo4j服务器而设计的,因此嵌入式系统目前并不适用。在以后的版本中将会更加关注性能。使用SDN导入可能不是一个好主意。如果调整java堆栈大小-Xss,它会有什么区别吗?最后,如果有某种方式可以私密地与我们分享这部分代码,请连同您的java env详细信息。谢谢 – Luanne

+0

不,它没有帮助改变java堆栈大小。我试图将其调整到1MB,但性能保持不变。如果你私下复习我的代码,我会很高兴。尽管如此,我认为在我的使用案例中使用SDN4并不是一个好的决定。 –

+0

很抱歉听到这个消息。尽管如此,我还是想看看你的代码。我的电子邮件地址是graphaware dot com的luanne – Luanne

相关问题