在节点之间创建关系时,Neo4j中的ServiceUnavailable

时间:2018-04-03 12:19:18

标签: sql ubuntu neo4j graph-databases

我刚开始使用Neo4j并试图为大量数据创建关系。

我已经添加了一些关系,现在在尝试创建关系时会看到以下错误。

  

ServiceUnavailable WebSocket连接失败。由于安全   您的Web浏览器中的约束,失败的原因不是   这个Neo4j驱动程序可用。请使用您的浏览器开发   控制台,以确定失败的根本原因。常见原因   使用错误的连接URL包括数据库不可用   或临时网络问题。如果您已启用加密,请确保   您的浏览器配置为信任Neo4j所具有的证书   配置使用。 WebSocket readyState是:3

这是我正在尝试运行的查询

MATCH (p:students),(c:results)
WHERE p.id = c.student_id
create (c)-[:scored]->(p)

学生和考试各有约300000个节点。

只有在创建关系时才会发生这种情况。 但是当我为同一场比赛运行一个返回查询时,并没有发生这种情况

MATCH (p:students),(c:results)
WHERE p.id = c.student_id
return c.student_id

我尝试检查日志但找不到任何解决方案。有人可以帮助我理解错误指示的内容以及如果有人遇到类似问题如何解决。

注意:我在带有远程主机的Ubuntu机器上运行它。

1 个答案:

答案 0 :(得分:1)

一次创建300000个关系可能是一项代价高昂的操作,主要是在堆使用方面,因为您在单个事务中执行此操作。

更好的方法是批量插入(通常每个事务10k是一个最佳点)。 APOC Procedures是此问题的首选解决方案,尤其是apoc.periodic.iterate()

CALL apoc.periodic.iterate(
 'MATCH (p:students),(c:results)
  WHERE p.id = c.student_id
  RETURN p, c',
 'CREATE (c)-[:scored]->(p)',
 {iterateList:true, parallel:false}) YIELD batches, total, errorMessages
RETURN batches, total, errorMessages

要检查的另一件大事是你在两个上都有索引(或唯一约束):students(id)和:results(student_id)所以你的查找很快,否则周期性迭代会挂起,因为这会变得很高成本操作。

对原始查询运行EXPLAIN并确保它首先使用NodeByLabelScan为其中一个节点,然后使用NodeByIndexSeek查找其他节点。