Spring 数据 Neo4j 4.0.0:StackOverFlowError

Spring Data Neo4j 4.0.0 : StackOverFlowError

我正在将 Spring Data Neo4j 4.0.0 与 Neo4j 2.2.1 一起使用,我正在尝试导入一个类似时间树的对象,在根目录下有 2 个级别。保存的对象在最后构建并保存,在保存过程的某个时刻,我得到了这个 Whosebug 错误:

Exception in thread "main" java.lang.WhosebugError
        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)
...

提前致谢,非常感谢您的建议!

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

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

然而,性能仍然不令人满意,因为我可以在不到 1 分钟的时间内使用我以前的 MongoDB 实现导入超过 60,000 条数据。我不知道是不是因为 SDN4,嵌入式 API 是否可以更快。我真的很好奇是否有人对 SDN4 和嵌入式 API.

做过任何基准测试

SDN 4 并非真正用于将对象批量导入 Neo4j。它是一个用于通用 Java 应用程序的对象图映射框架,而不是批量导入器(它给 table 带来了自己的一组特定问题)。一些支持 SDN 运行 预期用例的设计决策与您在尝试设计专用 ETL 时所做的相反。我们还受到 Neo4j 的 HTTP Transactional 端点性能的限制,尽管从绝对意义上讲它绝不慢,但不能希望与 Batch Inserter 竞争。

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