Neo4j MATCH模式疑问:为何(a)-->(b)-->(c)允许a==c而另一模式不行
关于Neo4j匹配模式
(a)-->(b)<--(c) 的疑问 场景复现
用Neo4j在线控制台做测试:
先执行创建关系的语句:
match (n{name:"Neo"})-->(t{name:"Trinity"}) create (t)-[:LOVES]->(n)最终的图结构是:Neo和Trinity之间有两条方向相反的关系——一条是Neo指向Trinity,另一条是Trinity指向Neo(LOVES类型)。
执行这条查询:
match (a)-->(b)-->(c) return a,b,c结果里出现了
a和c是同一个节点的情况,也就是匹配到了「Neo→Trinity→Neo」这条路径。但执行另一条查询时:
match (a)-->(b)<--(c) return a,b,c却没有返回任何结果。
问题解析
你之前觉得如果a==c,(a)-->(b)<--(c)就等价于(a)-->(b),这是理解错了:
- 模式
(a)-->(b)<--(c)的要求是:b节点同时存在两条入边——一条来自a(也就是a有出边指向b),另一条来自c(也就是c有出边指向b)。 - 当你假设
a和c是同一个节点时,这个模式就要求该节点有两条出边指向b,但你的图里Neo和Trinity之间各只有一条指向对方的边,没有重复的出边,所以自然匹配不到。 - 而
(a)-->(b)-->(c)是匹配连续的路径:先有a→b,再有b→c,当c=a时,刚好对应「Neo→Trinity→Neo」这条完整的连续路径,所以能查到结果。
说白了,(a)-->(b)<--(c)是找b被a和c同时指向的情况,不是找b有一条入边且a、c是同一个节点——除非同一个节点给b连了两条出边,否则这个模式就不会命中。
内容的提问来源于stack exchange,提问作者sadcat_1
相关产品推荐
相关产品推荐

