【发布时间】:2013-06-10 11:41:55
【问题描述】:
我刚刚开始使用 Neo4j 和 py2neo。我正在试验 py2neo 中可用的批处理功能,用于对 neo4j 数据库进行批量数据加载。
在基本级别上,我想创建两个节点(或者如果它们已经存在则获取它们)并使用 py2neo 中的 WriteBatch 在它们之间创建一个具有默认权重的关系(或者如果关系已经存在则增加权重)。
文档仅解释了如何创建两个新节点并在它们之间建立关系。我正在研究以下内容:
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 "message" : "对于输入字符串:\"{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'exception': u'BatchOperationFailedException'}
基于“错误输入异常”,我很确定这是 start_node 和 end_node 参数的问题。基本上,我想参考前面的get_or_create节点和关系。批量中如何引用这些?
更新:经过大量实验,我缩小了重现此错误的可能方法 - 如果 get_or_create 中的任何一个节点已存在于图中,则批处理操作将失败,并在对应的索引上出现错误输入错误现有节点。我还更新了代码以准确显示我运行的内容。第一次运行此代码成功(图中两个节点都不存在)。再次运行失败。
py2neo 版本:1.5
neo4j 版本:1.8.2
【问题讨论】: