首页 > 解决方案 > 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天。你知道解决方法吗?这么慢正常吗?

标签: neo4jcypher

解决方案


我找到了一个很好的解决方案。在您的数据库上执行此查询:

CREATE CONSTRAINT node_id ON (n:Node) ASSERT n.id IS UNIQUE

它会加速一切。这个想法如下:如果您使用 匹配节点,则id必须确保它id是唯一的。如果不是,则查询的时间复杂度会增加很多。


推荐阅读