Neo4j:如何使用Cypher删除特定关系?

24

假设我有一个用户:

CREATE (n { name: 'Tamil' })

以及两个角色:

CREATE (n { name: 'developer' } ) 
CREATE (n { name: 'tester' } )

然后,我建立用户与这两个角色之间的关系。

CYPHER 1.9  START a = node(*), b = node(*) 
WHERE a.name = 'Tamil' AND b.name = 'developer' 
CREATE (a)-[r:HAS_ROLE]->(b) 
RETURN r

CYPHER 1.9  START a = node(*), b = node(*) 
WHERE a.name = 'Tamil' AND b.name = 'tester' 
CREATE (a)-[r:HAS_ROLE]->(b) 
RETURN r

现在,我想从用户中删除测试人员角色关系。 我尝试过:

CYPHER 1.9  START a = node:node_auto_index('name:Tamil') 
MATCH a-[r:HAS_ROLE]-() 
RETURN r

但是,它返回了这两个关系。我知道我可以将属性附加到关系上。但是,我不知道cypher语法怎么写。

我是Neo4j的新手。任何建议都将非常有帮助!

谢谢!

2个回答

40

我用这个查询从你原始的图表中删除了这个关系:

START n=node(*) 
MATCH (n)-[rel:HAS_ROLE]->(r) 
WHERE n.name='Tamil' AND r.name='tester' 
DELETE rel

2
在 3.0.3 版本中,您必须更改 MATCH 子句为 MATCH(n)-[rel:HAS_ROLE]->(r),否则会出现错误(请注意 'n' 和 'r' 周围的括号)。 - Maciej
2019年的语法和之前一样吗? - Jessy

1
我找到了它。我将关系更改为具有属性。像这样:
CYPHER 1.9  START a = node(*), b = node(*) 
WHERE a.name = 'Tamil' AND b.name = 'developer' 
CREATE (a)-[r:HAS_ROLE {id: xyz}]->(b) 
RETURN r

CYPHER 1.9  START a = node(*), b = node(*) 
WHERE a.name = 'Tamil' AND b.name = 'tester' 
CREATE (a)-[r:HAS_ROLE {id: abc}]->(b) 
RETURN r

然后,以下代码删除了指定的关系。
CYPHER 1.9  START a = node:node_auto_index('name:Tamil') 
MATCH a-[r:HAS_ROLE]-() 
WHERE r.id = abc
DELETE r;

我不确定这是否是正确的做法,但它有效。


3
这似乎非常违反直觉 - 你怎么知道关系的ID是什么?看看Werner的答案,应该适用于你。 - David Makogon

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