【问题标题】:StackOverflowError when executing cypher queries through Neo4J REST API通过 Neo4J REST API 执行密码查询时出现 StackOverflowError
【发布时间】: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) - 它应该会对查询的性能产生很大影响。
  • 非常感谢 :).. 通过在节点上创建索引,我能够在几秒钟内上传一批边。

标签: rest neo4j cypher


【解决方案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。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多