多级路径匹配没有数据

  • nebula 版本:2.0.1

  • 部署方式:分布式

  • 是否为线上版本:Y

  • 问题的具体描述
    三级路径查询,最后一个节点不能匹配数据

v1:手机号节点,v2:是手机APP,v3:也是手机号节点同v1

关系如下:

查询方法:根据用户id查询到手机号节点(v1),然后再查找APP节点(v2),然后根据匹配的app再反向查询手机号节点(v3其实就是v1)如下查询:
match (u:t_user{uid:‘1001’}) -[e1:e_register]->(v1)–>(v2)<–(v3) RETURN v3;



v2节点有数据:

(admin@nebula) [data]>  match (u:t_user{uid:'1001'}) -[e1:e_register]->(v1)-->(v2)   RETURN v2.did, v1.mobile;
+------------------------------------------------------------------+---------------+
| v2.did                                                     | v1.mobile     |
+------------------------------------------------------------------+---------------+
| "d1118" | "13120930000" |
+------------------------------------------------------------------+---------------+

v3节点没有数据(是不是bug?)

(admin@nebula) [data]>  match (u:t_user{uid:'1001'}) -[e1:e_register]->(v1)-->(v2)<--(v3)   RETURN v3;
Empty set (time spent 19326/19797 us)

实际上v3到v2是有数据的:

 (admin@nebula) [data]> match (d:t_app{did:'d1118'})<--(m) return m
+--------------------------------------------------------------------+
| m                                                                  |
+--------------------------------------------------------------------+
| ("13120930000" :t_mobile{dt: "2021-08-06", mobile: "13120930000"}) |
+--------------------------------------------------------------------+
Got 1 rows (time spent 78056/78612 us)

这里面有两种情况:

  1. 如果 边v1->v2 和 边v3->v2 是同一个边(v1->v2没有别的边),则
match (u:t_user{uid:'1001'}) -[e1:e_register]->(v1)-->(v2)<--(v3)   RETURN v3

返回的是 Empty set,因为 v1->v2 和 v3->v2 是同一条边,查询的时候会过滤掉,又由于没有别的边,所以返回 Empty。这个在 neo4j 里也是这个逻辑。
2. 如果 v1 到 v2 有两个及以上不同的边,则上述match语句会返回这些边的起点v3(最新的版本,2.0.1版本有个bug,也不能返回所有的v3)

(root@nebula) [my_space]> insert edge t_use_1() values 13120930000->1118:()
(root@nebula) [my_space]> match (u:t_user{uid:'1001'}) -[e1:e_register]->(v1)-->(v2)<--(v3) return v3
+------------------------------------------------------------------+
| v3                                                                            |
+------------------------------------------------------------------+
| (13120930000 :t_mobile{dt: "2021-08-08", mobile: "13120930000"}) |
+------------------------------------------------------------------+
| (13120930000 :t_mobile{dt: "2021-08-08", mobile: "13120930000"}) |
+------------------------------------------------------------------+
Got 2 rows (time spent 6487/6891 us)

在2.0.1版本里有个相关的bug:

请参阅下

对的。但不同边类型是可以查出结果的。
我本地测试是对的:

(czp@nebula) [test]> match p=(v1:A{id:1})-->(v2)<--(v3) where id(v1)==id(v3) return p
+-----------------------------------------------------------------------------+
| p                                                                           |
+-----------------------------------------------------------------------------+
| <("a1" :A{id: 1})-[:E@0 {}]->("a2" :A{id: 2})<-[:E1@0 {}]-("a1" :A{id: 1})> |
+-----------------------------------------------------------------------------+
| <("a1" :A{id: 1})-[:E1@0 {}]->("a2" :A{id: 2})<-[:E@0 {}]-("a1" :A{id: 1})> |
+-----------------------------------------------------------------------------+

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。

浙ICP备20010487号