neo4j - Cypher:建立关系非常缓慢(UNWIND)
问题描述
我正在使用 neo4j python API 并连接到本地数据库。我有一个包含 700.000 个节点的图表。我可以使用以下方法非常快速地创建节点:
with session.begin_transaction() as tx:
cypher_query = 'UNWIND $batch as row ' \
'CREATE (n:Node) ' \
'SET n += row'
tx.run(cypher_query, batch=batch)
该图显示了 4M 关系,我试图通过以下方式创建它们:
with session.begin_transaction() as tx:
cypher_query = 'UNWIND $batch as row ' \
'MATCH (head:Node) WHERE head.id = row.head_id ' \
'MATCH (tail:Node) WHERE tail.id = row.tail_id ' \
'CREATE (head)-[rel:RELATIONSHIP]->(tail) ' \
'SET rel += row.properties'
tx.run(cypher_query, batch=batch)
批量大小为 10K。关系的创建非常缓慢。我计算了一下,大概需要30天。你知道解决方法吗?这么慢正常吗?
解决方案
我找到了一个很好的解决方案。在您的数据库上执行此查询:
CREATE CONSTRAINT node_id ON (n:Node) ASSERT n.id IS UNIQUE
它会加速一切。这个想法如下:如果您使用 匹配节点,则id
必须确保它id
是唯一的。如果不是,则查询的时间复杂度会增加很多。
推荐阅读
- sql - SQL Server 多表别名优先级 > 缺少列别名
- dovecot - dovecot v1 "ST" 标记文件通过命令行删除
- javascript - 如何使用鼠标滚轮插件限制功能?
- javascript - 在Django中将字符串转换为Javascript中的字典列表
- c++ - 类模板的公共继承意外失败
- javascript - 为什么切片这个字符串并使其成为一个数组会将未定义添加到数组的元素中?
- mysql - 将 MAMP/MAMP Pro 4 升级到 5 后如何修复 MySQL 升级错误
- c++ - C ++ - 程序检查向量中指定的单词
- javascript - 为什么我的 Ajax 对象返回为未定义?
- php - 为什么我收到 MySQl 错误