Import 弹簧数据Neo4j 4.0.0:StackOverflower错误

Import 弹簧数据Neo4j 4.0.0:StackOverflower错误,import,neo4j,runtime-error,stack-overflow,spring-data-neo4j-4,Import,Neo4j,Runtime Error,Stack Overflow,Spring Data Neo4j 4,我正在将Spring数据Neo4j 4.0.0与Neo4j 2.2.1一起使用,并且我正在尝试导入一个类似时间树的对象,该对象在根下有两个级别。保存的对象在保存过程结束时生成并保存,在保存过程中的某个时刻,我遇到了以下StackOverFlow错误: Exception in thread "main" java.lang.StackOverflowError at java.lang.Character.codePointAt(Character.java:4668)

我正在将Spring数据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)
...

提前感谢您,我们将非常感谢您的建议

经过几个小时的反复尝试,我终于发现我需要限制我的保存深度级别

以前,我没有指定深度级别,保存的对象越来越大,因为子对象的插入也同时运行。因此,在对每个save方法给出深度1之后,我最终消除了StackOverFlow错误。而且,通过不定期保存(我将所有对象放在ArrayList中,并在最后全部保存),我可以为导入约1000个节点(具有关系)获得1分钟的性能增益(从3.5分钟到2.5分钟)


尽管如此,性能仍然不令人满意,因为使用我以前的MongoDB实现,我可以在不到1分钟的时间内导入60000多个数据。我不知道这是否是因为SDN4,也不知道嵌入API是否会更快。我真的很好奇是否有人在SDN4和嵌入式API上做过任何基准测试。

SDN4并不是用来批量将对象导入Neo4j的。它是一个面向通用Java应用程序的对象图映射框架,而不是一个批处理导入器(这会给表带来自己的一组特定问题)。支持SDN预期用例的一些设计决策与您试图设计专门构建的ETL时所做的相反。我们还受到Neo4j的HTTP事务端点性能的限制,该端点虽然绝对速度不慢,但无法与批处理插入器竞争


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

谢谢您的更新。有两件事——SDN4目前是为与远程Neo4j服务器协同工作而构建的,因此嵌入式系统目前还不存在。在以后的版本中将更加关注性能。使用SDN导入可能不是一个好主意。如果调整java堆栈大小-Xss,会有什么不同吗?最后,如果有某种方法可以私下与我们共享这部分代码以及您的java环境详细信息,请这样做。谢谢,更改java堆栈大小没有帮助。我尝试将其调整为1MB,但性能保持不变。如果你能私下审查我的代码,我会非常高兴。尽管如此,我认为在我的用例中使用SDN4真的不是一个好的决定。很抱歉听到这个消息。不过我还是想看看你的代码。我的电子邮件是Luane在graphaware.com