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