0

我正在将 Spring Data Neo4j 4.0.0 与 Neo4j 2.2.1 一起使用,并且我正在尝试在根下导入具有 2 个级别的类似时间树的对象。保存的对象在最后构建并保存,在保存过程的某个时刻,我收到了这个 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)
...

提前感谢您,您的建议将不胜感激!

4

2 回答 2

2

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

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

于 2015-06-03T13:06:42.203 回答
0

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

以前,我没有指定深度级别,并且保存的对象越来越大,因为它的子对象的插入也同时运行。所以,在每个保存方法的深度为 1 之后,我终于摆脱了 StackOverFlow 错误。而且,通过不定期保存(我将所有对象放在一个 ArrayList 中并在最后保存它们),我在导入 ca. 1000 个节点(有关系)。

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

于 2015-06-03T08:21:15.317 回答