Cypher中如何表示双向边与节点无连接?现有语句失效求助
解决Cypher查询节点连接场景的问题
看起来你在处理两种节点关系场景的Cypher查询时遇到了语法问题,先帮你拆解问题,再给出对应场景的正确写法:
首先,原语句无法运行的原因
你的语句MATCH (u)<-[r]->(v) WHERE id(u) < id(v) RETURN (u), [r], (v)存在语法错误:Cypher里单个关系r只能有一个方向,<-[r]->这种写法试图让关系同时指向两个节点,是不合法的,这就是语句跑不起来的核心原因。
场景1:查询无连接关系的节点对
要找出完全没有任何关系(不管方向)连接的节点对,可以用笛卡尔积配合NOT EXISTS来过滤:
MATCH (u), (v) WHERE id(u) < id(v) AND NOT EXISTS((u)--(v)) RETURN u, v
MATCH (u), (v):获取所有节点的组合id(u) < id(v):避免返回重复的节点对(比如(u,v)和(v,u)视为同一对)NOT EXISTS((u)--(v)):排除掉存在任何连接的节点对,剩下的就是无连接的节点对
场景2:查询双向连接的节点对
这里分两种常见的“双向连接”定义,对应不同的写法:
情况A:两个节点之间同时存在双向的关系(即u→v和v→u两条边)
需要分别匹配两个方向的关系,再收集起来:
MATCH (u)-[r1]->(v), (u)<-[r2]-(v) WHERE id(u) < id(v) RETURN u, [r1, r2], v
这个语句会返回同时拥有正向和反向边的节点对,以及对应的两条关系。
情况B:只要节点之间存在连接(不管是单向还是双向,忽略方向)
如果你的“双向连接”是指无向的连接关系,可以用无向模式匹配,再收集所有相关关系:
MATCH (u)-[r]-(v) WHERE id(u) < id(v) RETURN u, collect(r), v
(u)-[r]-(v):匹配u和v之间任意方向的关系collect(r):把节点对之间的所有关系(包括多条双向边)收集成列表,和你原语句里的[r]需求一致
内容的提问来源于stack exchange,提问作者xaw
相关产品推荐
相关产品推荐

