如何在Apache AGE中匹配属性并删除返回指定边
问题描述
我正在使用PostgreSQL的图数据库扩展Apache AGE,拥有名为sample_graph的图,其中包含Car和Country节点,二者由MadeIn边连接。当前我的MadeIn边没有任何属性,我希望依据边自身的属性删除特定边并返回被删除的边。
当前图状态示例:
Car {name: 'Lamborghini', madeIn: 'Italian'} -[MadeIn]-> Country {name: 'Italian'} Car {name: 'Ford', madeIn: 'America'} -[MadeIn]-> Country {name: 'America'} Car {name: 'Bughatti', madeIn: 'French'} -[MadeIn]-> Country {name: 'French'}
我尝试了如下查询,但它没有删除目标边:
SELECT * FROM cypher('sample_graph', $$ MATCH (a:Car)-[r:MadeIn]->(b:Country) WHERE a.name = 'Lamborghini' AND b.name = 'Italy' DELETE r RETURN r $$) as (r agtype);
问题分析与解决
1. 当前查询的问题
你的查询WHERE条件中b.name = 'Italy'与实际数据里的Country节点名称'Italian'不匹配,导致无法定位到目标边,所以没有执行任何删除操作。另外你提到的“删除了顶点”是误解,DELETE r语法是明确删除边的,只是因为匹配不到目标,才没有效果。
2. 无属性边的删除(通过关联节点定位)
在MadeIn边无属性的情况下,只能通过关联的Car和Country节点属性定位目标边,修正条件后即可删除:
SELECT * FROM cypher('sample_graph', $$ MATCH (a:Car)-[r:MadeIn]->(b:Country) WHERE a.name = 'Lamborghini' AND b.name = 'Italian' DELETE r RETURN r $$) as (r agtype);
该查询会匹配兰博基尼到意大利的MadeIn边,删除后返回这条被删除的边。
3. 依据边自身属性删除的方法(先给边添加属性)
如果确实需要通过边自身属性删除,首先得给MadeIn边添加属性,比如添加production_year属性:
SELECT * FROM cypher('sample_graph', $$ MATCH (a:Car)-[r:MadeIn]->(b:Country) SET r.production_year = 2023 WHERE a.name = 'Lamborghini' RETURN r $$) as (r agtype);
添加属性后,就可以通过边的属性定位并删除:
SELECT * FROM cypher('sample_graph', $$ MATCH (a:Car)-[r:MadeIn]->(b:Country) WHERE r.production_year = 2023 DELETE r RETURN r $$) as (r agtype);
内容的提问来源于stack exchange,提问作者AmrShams07
相关产品推荐
相关产品推荐

