【发布时间】:2016-11-14 13:57:23
【问题描述】:
我使用的是 Neo4j 3.0.7 版
我正在从数据集中读取边列表,我需要使用 REST API 批量传递这些边。 我使用以下查询格式通过 REST API 的单个 Cypher 查询创建多个节点(如果它们已经不存在)及其在 Neo4j 中的关系。我获得一条边的两个顶点,并根据这些顶点的顶点 ID 设置节点属性。
{
"query":
"MATCH (n { name: 0 }), (m { name:1 })
CREATE (n)-[:X]->(m)
WITH count(*) as dummy
MATCH (n { name: 0 }), (m { name: 6309 })
CREATE (n)-[:X]->(m)"
}
这种方法适用于一批 10 条边,但是当我尝试通过单个 Cypher 查询发送一批 1000 条边(节点及其关系)时,我得到一个 StackOverflowError 异常。有没有更好的方法来完成这项任务?
感谢您的帮助。
从响应中得到的错误:
{
"exception" : "StackOverflowError",
"fullname" : "java.lang.StackOverflowError",
"stackTrace" : [ "scala.collection.TraversableOnce$class.$div$colon(TraversableOnce.scala:151) ..."
}
【问题讨论】:
-
如果你使用这种方法插入大约 1000 个节点,你会得到一个巨大的 Cypher 查询。 StackOverflowError 可能是解析器在该查询上失败的症状。
-
我的回答解决了问题吗?如果是这样,您能否将答案标记为已接受?
-
我尝试了您提到的方法,但是这样发送一条边大约需要 3 分钟,因此发送一批 1000 条边需要几个小时。除了这种方式之外,还有其他最佳方法可以在最短的时间内发送一批边吗?
-
3 分钟对于插入一条边来说是相当多的。您的数据库中有很多节点(如数百万)吗?无论如何,您正在使用
name属性来查找节点,这意味着值得在此属性上放置一个索引。例如,如果您有Person节点,则使用CREATE INDEX ON :Person(name)对它们进行索引(此示例取自 Cypher reference card) - 它应该会对查询的性能产生很大影响。 -
非常感谢 :).. 通过在节点上创建索引,我能够在几秒钟内上传一批边。