MATCH多跳查询怎么返回多种模式点和边数据

有一下几种场景,想要一个查询返回所有场景的点和边数据,边可能有多条双向边
Tag:OLT、SW、BRAS, Edge:RELAYLINK
1、OLT-SW
2、OLT-SW-BRAS
3、OLT-SW-BRAS-CR
4、OLT-BRAS-CR

使用如下查询,如果是1和2的场景就没有数据返回了,如果v2不指定Tag类型的话会查到其他OLT-OBD-OBD-E8C的数据,而且边存在双向的,光是这个查询也有点慢,请帮忙优化下查询能包含上面4种场景,返回所有的点和边数据

MATCH p = (v:OLT)-[e:RELAYLINK*1…3]-(v2:CR) WHERE id(v) == ‘421100000000003642209694’ RETURN nodes(p) AS nodes,relationships(p) AS links

result.csv (5.2 KB)

改成多MATCH的方式能满足所有场景但是查询性能更慢

MATCH p =  (v:OLT)-[e:RELAYLINK]-(v2:SWITCH) WHERE id(v) == '421100000000003642209694' RETURN nodes(p) AS nodes,relationships(p) AS links
union 
MATCH p =  (v:OLT)-[e:RELAYLINK*1..2]-(v2:BRAS) WHERE id(v) == '421100000000003642209694' RETURN nodes(p) AS nodes,relationships(p) AS links
union
MATCH p =  (v:OLT)-[e:RELAYLINK*1..3]-(v2:CR) WHERE id(v) == '421100000000003642209694' RETURN nodes(p) AS nodes,relationships(p) AS links

result (1).csv (19.0 KB)

你想做的查询是,以 vid 421100000000003642209694 为起点,经过 RELAYLINK 这种边类型,终点带有 SW 或者是 BRAS 或者是 CR 的点?

是的,所有的点和边数据一起返回

感觉这个用 go 来写会比较优雅,性能也会好一点
用 go 1 to n,然后过滤条件为终点类型为SW、BRAS、CR,直接返回点和边

1 个赞

正如 Muyi 上面说的,感觉你既然指定了 vid,就没必要加上 tag OLT 了,直接用 GO 语句或者 FIND PATH 应该会比 MATCH 性能好。

GO 1 TO 3 STEPS FROM ‘421100000000003642209694’ OVER RELAYLINK WHERE tags($$) IN [“SWITCH”, “BRAS”, “CR”] YIELD src(edge) AS stratNode, dst(edge) AS endNode, edge AS links

根据终点类型过滤应该怎么写?这样写执行没数据,还有所有的点数据可以合到一列展示吗

双引号,""而不是这个

studio 中就是"

这个语句应该是有问题的 tags() 这个出来的结果应该是一个 列表,不能直接将 tags() 的结果当作一个值判断是不是在(IN)你的过滤列表(“SWITCH”, “BRAS”, “CR”)中,而且终点的点可能有多个 tag,并非它就是过滤列表的子集。

那应该怎么写?

cc @MuYi 大佬看看,我来学习下写法。

因为 tags($$)是一个 list,如果你的 一个点没有多 tag 的话可以参考下面:

(root@nebula) [basketballplayer]> GO 1 TO 3 STEPS FROM "player100" over follow where tags($$)[0] in ["player"] yield follow._src as startnode, follow._dst as endnode, edge as links
+-------------+-------------+----------------------------------------------------+
| startnode   | endnode     | links                                              |
+-------------+-------------+----------------------------------------------------+
| "player100" | "player101" | [:follow "player100"->"player101" @0 {degree: 95}] |
| "player100" | "player125" | [:follow "player100"->"player125" @0 {degree: 95}] |
| "player125" | "player100" | [:follow "player125"->"player100" @0 {degree: 90}] |
| "player101" | "player100" | [:follow "player101"->"player100" @0 {degree: 95}] |
| "player101" | "player102" | [:follow "player101"->"player102" @0 {degree: 90}] |
| "player101" | "player125" | [:follow "player101"->"player125" @0 {degree: 95}] |
| "player102" | "player100" | [:follow "player102"->"player100" @0 {degree: 75}] |
| "player102" | "player101" | [:follow "player102"->"player101" @0 {degree: 75}] |
| "player125" | "player100" | [:follow "player125"->"player100" @0 {degree: 90}] |
| "player100" | "player101" | [:follow "player100"->"player101" @0 {degree: 95}] |
| "player100" | "player125" | [:follow "player100"->"player125" @0 {degree: 95}] |
+-------------+-------------+----------------------------------------------------+
Got 11 rows (time spent 5318/6134 us)

Sun, 07 Apr 2024 14:44:45 UTC

GO 1 TO 3 STEPS FROM “421100000000003642209694” over RELAYLINK where tags($$)[0] in [“SWITCH”, “BRAS”, “CR”] yield RELAYLINK._src as startnode, RELAYLINK._dst as endnode, edge as links
还是查不到数据

@steam 所说,你的引号不对,要切到英文半角
[“SWITCH”, “BRAS”, "CR]

看studio的语句,是英文的

大佬,请问下GET SUBGRAPH是不支持过滤边吗?我看文档上说支持,但是执行报错
GET SUBGRAPH WITH PROP FROM ‘421100000000003642209694’ OUT OPTICALCIRCUIT WHERE OPTICALCIRCUIT.A_PORT_ID == ‘421100000000005657655143’ YIELD VERTICES AS nodes, EDGES AS links

请提供版本号

Nebula Graph Studio v3.4.1
Nebula Graph v3.2.1

3.2.1 应该是不支持过滤的,你看错版本文档了

3.6版本才支持吗