如何使用Cypher在Memgraph中正确创建双向关系?
在Memgraph中用Cypher创建双向关系的正确方法
你尝试的几种创建方式都存在问题,对应的错误原因和正确实现方式如下:
你遇到的错误场景
场景1:使用双向箭头创建关系
执行查询:
CREATE (p1:Person {name: 'Harry'}), (p2:Person {name: 'Anna'}) CREATE (p1)<-[r1:MARRIED_TO]->(p2) RETURN r1;
得到错误:Bidirectional relationship are not supported when creating an edge
原因:Memgraph不支持在CREATE语句中使用双向箭头语法,关系创建必须明确方向。
场景2:使用无方向语法创建关系
执行查询:
CREATE (p1:Person {name: 'Harry'}), (p2:Person {name: 'Anna'}) CREATE (p1)-[r:MARRIED_TO]-(p2) RETURN r;
得到相同错误,原因同上:CREATE时必须指定关系的方向,无方向语法仅适用于MATCH查询。
场景3:重复声明变量
执行查询:
CREATE (p1:Person {name: 'Harry'}), (p2:Person {name: 'Anna'}) CREATE (p1)-[r:MARRIED_TO]->(p2) CREATE (p1)<-[r:MARRIED_TO]-(p2) RETURN r;
得到错误:Redeclaring variable: r.
原因:同一个查询中变量r被重复使用,每个关系变量需要唯一命名。
正确的实现方式
Memgraph的底层关系是有向的,要实现"双向关系"的效果,需要创建两条方向相反的同类型关系,具体写法如下:
方式1:使用不同变量创建两条关系
CREATE (p1:Person {name: 'Harry'}), (p2:Person {name: 'Anna'}) CREATE (p1)-[r1:MARRIED_TO]->(p2), (p2)-[r2:MARRIED_TO]->(p1) RETURN r1, r2;
方式2:不使用变量直接创建
如果不需要返回关系,可以省略变量名:
CREATE (p1:Person {name: 'Harry'}), (p2:Person {name: 'Anna'}) CREATE (p1)-[:MARRIED_TO]->(p2), (p2)-[:MARRIED_TO]->(p1);
查询双向关系的技巧
后续查询时,无需区分方向,可以用无方向的匹配语法,自动匹配任意方向的关系:
MATCH (a:Person)-[:MARRIED_TO]-(b) WHERE a.name = 'Harry' RETURN b;
内容的提问来源于stack exchange,提问作者TenTonBonton
相关产品推荐
相关产品推荐

