Neo4j と py2neo を使い始めたばかりです。neo4j データベースの一括データ読み込みのために、py2neo で利用可能なバッチ機能を試しています。
基本的なレベルでは、py2neo の WriteBatch を使用して、2 つのノードを作成し (または既に存在する場合はそれらを取得し)、デフォルトの重みでそれらの間の関係を作成します (または関係が既に存在する場合は重みを増やします)。
このドキュメントでは、2 つの新しいノードを作成し、それらの間の関係を形成する方法のみを説明しています。私は次の行に沿って何かを調べています:
from py2neo import neo4j, cypher
graphdb = neo4j.GraphDatabaseService()
topic_index = graphdb.get_or_create_index(neo4j.Node, "node_index")
batch = neo4j.WriteBatch(graphdb)
batch.get_or_create_indexed_node('node_index', 'name', 'Alice', {'name': 'Alice'})
batch.get_or_create_indexed_node('node_index', 'name', 'Bob', {'name': 'Bob'})
batch.get_or_create_indexed_relationship('rel_index', 'type', 'KNOWS', 0, 'KNOWS', 1, {})
results = batch.submit()
ただし、これは次のエラーで失敗します。
SystemError: {u'stacktrace': [u'org.neo4j.server.rest.batch.NonStreamingBatchOperations.invoke(NonStreamingBatchOperations.java:63)', u'org.neo4j.server.rest.batch.BatchOperations.performRequest(BatchOperations .java:178)'、u'org.neo4j.server.rest.batch.BatchOperations.parseAndPerform(BatchOperations.java:149)'、u'org.neo4j.server.rest.batch.NonStreamingBatchOperations.performBatchJobs(NonStreamingBatchOperations.java :48)'、u'org.neo4j.server.rest.web.BatchOperationService.batchProcess(BatchOperationService.java:117)'、u'org.neo4j.server.rest.web.BatchOperationService.performBatchOperations(BatchOperationService.java:71) )', u'java.lang.reflect.Method.invoke(Method.java:616)'], u'message': u'{\n "メッセージ" : "入力文字列の場合: \"{0}\" "、\n"exception": "BadInputException",\n "stacktrace": [ "org.neo4j.server.rest.web.RestfulGraphDatabase.extractNodeId(RestfulGraphDatabase.java:162)", "org.neo4j.server.rest.web.RestfulGraphDatabase. extractNodeIdOrNull(RestfulGraphDatabase.java:151)"、"org.neo4j.server.rest.web.RestfulGraphDatabase.addToRelationshipIndex(RestfulGraphDatabase.java:813)"、"java.lang.reflect.Method.invoke(Method.java:616) "、"org.neo4j.server.web.Jetty6WebServer.invokeDirectly(Jetty6WebServer.java:273)"、"org.neo4j.server.rest.batch.NonStreamingBatchOperations.invoke(NonStreamingBatchOperations.java:55)"、"org.neo4j .server.rest.batch.BatchOperations.performRequest(BatchOperations.java:178)"、"org.neo4j.server.rest.batch.BatchOperations.parseAndPerform(BatchOperations.java:149)", "org.neo4j.server.rest.batch.NonStreamingBatchOperations.performBatchJobs(NonStreamingBatchOperations.java:48)", "org.neo4j.server.rest.web.BatchOperationService.batchProcess(BatchOperationService.java:117)", "org.neo4j.server.rest.web.BatchOperationService.performBatchOperations(BatchOperationService.java:71)"、"java.lang.reflect.Method.invoke(Method.java:616)" ]\n}'、u'例外': u'BatchOperationFailedException'}lang.reflect.Method.invoke(Method.java:616)" ]\n}', u'exception': u'BatchOperationFailedException'}lang.reflect.Method.invoke(Method.java:616)" ]\n}', u'exception': u'BatchOperationFailedException'}
「Bad Input Exception」に基づいて、start_node および end_node 引数に問題があると確信しています。基本的には、以前の get_or_create ノードと関係を参照したいと思います。バッチでこれらをどのように参照しますか?
更新: 多くの実験の後、このエラーを再現する可能な方法を絞り込みました - get_or_create のノードのいずれかがグラフに既に存在する場合、バッチ操作は既存のノードに対応するインデックスで不正な入力エラーで失敗します. また、実行した内容を正確に表示するようにコードを更新しました。このコードを初めて実行すると成功します (両方のノードがグラフに存在しません)。再度実行すると失敗します。
py2neo バージョン: 1.5
neo4j バージョン: 1.8.2