0

私は、Neo4j 2.2.1 で Spring Data Neo4j 4.0.0 を使用しており、ルートの下に 2 つのレベルを持つ timetree のようなオブジェクトをインポートしようとしています。保存されたオブジェクトがビルドされ、最後に保存され、保存プロセスのある時点で、次の 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 トランザクション エンドポイントのパフォーマンスによっても制約を受けます。これは、絶対的に遅いわけではありませんが、たとえばバッチ インサーターと競合することは期待できません。

今後パフォーマンスを改善する予定であり、Neo4j の新しいバイナリ プロトコルがリリースされたら (2.3)、それを転送プロトコルとしてプラグインする予定です。これにより、データベースとの間の転送速度が少なくとも 1 桁向上すると予想されます。ただし、これらの変更によって SDN 4 の動作特性が根本的に変わるとは思わないでください。将来のバージョンでは、現在よりもはるかに高速に数千ノードをロードできるようになるかもしれませんが、それでも ETL ツールにはなりません。それがそのように使用されることは期待できません。

于 2015-06-03T13:06:42.203 に答える
0

数時間の試行錯誤の後、最終的に、保存深度レベルを制限する必要があることがわかりました。

以前は、深さのレベルを指定しなかったため、子の挿入も同時に実行されるため、保存されたオブジェクトがどんどん大きくなっていきました。したがって、すべての保存メソッドに深さ 1 を指定した後、最終的に StackOverFlow エラーを取り除きました。また、定期的に保存しない (すべてのオブジェクトを ArrayList に入れ、最後にすべて保存する) ことで、約 1 分間のインポートで 1 分間のパフォーマンス向上 (3.5 分から 2.5 分) が得られます。1000 ノード (関係あり)。

それにもかかわらず、以前の MongoDB 実装では 1 分足らずで 60,000 を超えるデータをインポートできたため、パフォーマンスはまだ満足のいくものではありません。それが SDN4 のせいなのか、Embedded API で高速化できるのかはわかりません。SDN4 と組み込み API のベンチマークを行った人がいるかどうか、非常に興味があります。

于 2015-06-03T08:21:15.317 に答える