通过Neo4J REST API执行cypher查询时的StackOverflowError

时间:2016-11-14 13:57:24

标签: rest neo4j cypher

我正在使用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) ..."
}

1 个答案:

答案 0 :(得分:1)

您可以使用UNWIND获取单个查询:

UNWIND [[0,1], [0,6309]] AS pair
MATCH (n {name: pair[0]}), (m {name: pair[1]})
CREATE (n)-[:X]->(m)

UNWIND之后插入节点对作为双元素列表的列表。由于查询使用name属性来查找节点,因此值得为其添加索引。例如,如果您没有Person个节点,请使用以下命令对其进行索引:

CREATE INDEX ON :Person(name)

(另见Cypher reference card。)