Neo4j 3.4.0社区版:如何用Cypher/APOC正确清除手动索引?
如何用Cypher/APOC清除Neo4j 3.4.0社区版的手动关系索引
咱们一步一步来解决你的问题,先处理眼前的权限错误,再讲正确清除索引的方法:
1. 先解决权限错误
你遇到的Neo.ClientError.Security.Forbidden错误,是因为当前neo4j用户的权限被限制为只读模式了。社区版的话,你可以通过以下方式调整:
- 首先检查当前用户的权限:
SHOW ROLES FOR user 'neo4j'; - 如果结果显示用户只有
reader角色,需要赋予写权限:GRANT WRITE ON DATABASE * TO user 'neo4j'; - 要是你没开启认证(或者测试环境),也可以临时修改
neo4j.conf里的dbms.security.auth_enabled=false,重启Neo4j后就能跳过权限检查(生产环境不建议这么做)。
2. 正确清除手动关系索引的两种方式
方式一:直接删除整个索引(推荐,高效)
如果你的目标是完全清除这个手动索引,直接用APOC的删除索引方法就行,比逐个删除索引里的关系快得多:
CALL apoc.index.removeRelationshipIndex('HAS_VALUE_ON');
执行后可以用下面的查询验证索引是否已删除:
CALL db.indexes() YIELD name, type WHERE type = 'RELATIONSHIP' AND name = 'HAS_VALUE_ON' RETURN name;
如果没有返回结果,说明索引已经被成功删除。
方式二:逐个删除索引中的关系(适合只清除部分数据的场景)
如果你只想移除索引里的所有关系但保留索引本身,需要修正你之前的查询——APOC的apoc.index.relationships不需要用*:*,直接用*就能匹配索引里的所有关系:
CALL apoc.index.relationships('HAS_VALUE_ON', '*') YIELD rel CALL apoc.index.removeRelationshipByName('HAS_VALUE_ON', rel) RETURN count(*) AS removedRelationshipsCount;
这个查询会返回从索引中移除的关系数量,方便你验证结果。
额外提示
如果之后需要重新创建这个手动关系索引,可以用类似下面的语句(根据你的实际关系类型和要索引的属性调整):
CALL apoc.index.createRelationshipIndex('HAS_VALUE_ON', ['HAS_VALUE_ON'], ['value']);
内容的提问来源于stack exchange,提问作者alexanoid
相关产品推荐
相关产品推荐

