如何在Neo4j中重命名关系?

20

在导入了大量节点之后,我才意识到我创建的关系名为START,这是一个保留关键字。通过Cypher控制台查询数据库时,总是会报告保留关键字的错误:

SyntaxException: 保留关键字 "start n=node(0) match n<-[:START]-r return count(r)"

唯一想到的解决方法是创建一个带有不同名称的新副本关系,然后删除旧的关系。

是否有一种简单的方法来重命名所有这些关系,或者在Cypher中转义保留关键字的方法?

4个回答

34

要达到重命名的效果,您可以按以下方式创建新文件并删除旧文件:

match (n1)-[old:`Start`]->(n2)
create (n1)-[new:StartDate]->(n2)
delete old

注意:使用像 `Start` 周围的反引号来转义保留关键字


2
Neo4j 2.x的最佳答案是,如果您想避免再次执行时出现重复,还可以将“create”替换为“merge”。 - Andrew Lank
7
这种方法无法保留先前关系的属性。 - walv

7

你是正确的。你不能重命名已经存在的关系。你需要遍历所有关系,并在并行中创建新的关系(包括所有属性),然后删除旧的关系。

你可能还想考虑在cypher查询中用反引号引用保留字START,并保留原来的关系:

start n=node(0) match n<-[:`START`]-r return count(r)

我想让新添加的关系保持相同的关系ID,我该怎么做? - Avinash

4
您可以使用apoc插件来重命名标签和关系。您还可以使用它来选择要重命名的关系子集。例如,下面的查询将仅重命名Jim和Alistair之间的关系。
MATCH (:Engineer {name: "Jim"})-[rel]->(:Engineer {name: "Alistair"})
WITH collect(rel) AS rels
CALL apoc.refactor.rename.type("COLLEAGUES", "FROLLEAGUES", rels)
YIELD committedOperations
RETURN committedOperations

2
match (n1)-[old:`Start`]->(n2)
create (n1)-[new:StartDate {propName:old.propName, ...}]->(n2)
delete old

1
不鼓励只提供代码的答案。请点击[编辑]并添加一些概括您的代码如何回答问题的话,或者解释您的答案与之前的答案/回答有何不同。[来自审核] - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接