2

我刚刚开始使用 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 "异常" : "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'}lang.reflect.Method.invoke(Method.java:616)" ]\n}', u'exception': u'BatchOperationFailedException'}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

4

1 回答 1

0

使用您的确切代码,我无法重现 py2neo 1.5 和 Neo4j 2.0.0-M03 的问题。你能澄清一下你使用的是哪个版本的 py2neo 和 Neo4j 吗?

于 2013-06-10T22:06:39.540 回答