MATCH中可以写多个pattern吗

  • nebula 版本:2.0.1
  • 部署方式(分布式 / / Docker / DBaaS):单机
  • 是否为线上版本:N
  • 硬件信息
  • 问题的具体描述
    一个节点同时连接多种边的查询

我的库里有一些如下图的点
截图_2021-08-20_10-45-40
我现在想把库里的这类点都查询出来.规则是:查询出所有的同时有出边link1,link2,link3的点.
比如我有查询出上图的N-0点,它有这样的特性,至少有3条出边,分别是link1,link2,link3类型.

目前的 Match 最多只能写出指点两个边类型的模式.

MATCH (v2)<-[e2:link2]-(v:node{name:"N-0"})-[e1:link1]->(v1) RETURN v, v1, v2

如果要再加一条边的约束,最直接的联想到的是管道,但前面的求教一条MATCH和GO的管道混合写法咨询中老师也说了Match不支持输入.反正写着试下.

MATCH (v2)<-[e2:link2]-(v:node{name:"N-0"})-[e1:link1]->(v1) RETURN v, v1, v2 | MATCH (v:node)-[e3:link3]->(v3) WHERE id(v)==id($-.v) RETURN v, $-.v1, $-.v2, v3;


其实这里并没有说找不到变量,或者说__EMPTY__.这报错好像是请求超时.(这里也另外有一个需求:哪里可以查询到这类错误的编号具体任务错误信息)
换成集合再试下.

MATCH (v2)<-[e2:link2]-(v:node{name:"N-0"})-[e1:link1]->(v1) RETURN collect(v) AS vs, v1, v2 | MATCH (v:node)-[e3:link3]->(v3) WHERE v IN $-.vs RETURN v, $-.v1, $-.v2, v3;


还是报错,再转成id再折腾一次.

MATCH (v2)<-[e2:link2]-(v:node{name:"N-0"})-[e1:link1]->(v1) RETURN collect(id(v)) AS vids, v1, v2 | MATCH (v:node)-[e3:link3]->(v3) WHERE id(v) IN $-.vids RETURN v, $-.v1, $-.v2, v3


看来是不行了.
当然知道go可以通过管道拼接,把几个边条件约束合并起来

GO FROM "4d59713f-7352-4048-9aa3-2316567d07fa" OVER link1 YIELD link1._src AS src | GO FROM $-.src OVER link2 YIELD link2._src AS src | GO FROM $-.src OVER link3 YIELD link3._src AS src  


go这里的id是写死的,前面可以通过Match查询传过来.

MATCH (v:node{name:"N-0"}) RETURN id(v) AS vids | GO FROM $-.vids OVER link1 YIELD link1._src AS src | GO FROM $-.src OVER link2 YIELD link2._src AS src | GO FROM $-.src OVER link3 YIELD link3._src AS src


成功一半.其实我库里目前有两个这样的点.

MATCH (v:node) RETURN id(v) AS vids | GO FROM $-.vids OVER link1 YIELD link1._src AS src | GO FROM $-.src OVER link2 YIELD link2._src AS src | GO FROM $-.src OVER link3 YIELD link3._src AS src  


悲剧了,又是查询量太大超时.换成 LOOKUP

LOOKUP ON node WHERE node.name == "N-0" OR node.name == "N-1" | GO FROM $-.VertexID OVER link1 YIELD link1._src AS src | GO FROM $-.src OVER link2 YIELD link2._src AS src | GO FROM $-.src OVER link3 YIELD link3._src AS src

其实在折腾MATCH的过程,推测觉得MATCH很不容易走索引.

但是这里结合LOOKUP不能满足我的需求,我需要结合出边link1,link2,link3的条件进行过滤,并进行分页.LOOKUP出的结果数据量级很大,但是GO OVER到最后中,只有剩下2个节点.因为整个库里,目前只有两个点同时有出边link1,link2,link3

LOOKUP ON node | GO FROM $-.VertexID OVER link1 YIELD link1._src AS src | GO FROM $-.src OVER link2 YIELD link2._src AS src | GO FROM $-.src OVER link3 YIELD link3._src AS src 


又查询超时了.

问题综述:

  1. 管道的前后过滤条件有没可能优化,算子下推.

  2. MATCH可不可以支持多条模式查询:
    MATCH (v2)<-[e2:link2]-(v0:node{name:"N-0"})-[e1:link1]->(v1), (v0)-[e3:link3]->(v3) RETURN v0, v1, v2, v3.两个模式表达式用","隔开.两个表达式小中都有v0变量.它们其实是同一个变量.

  3. MATCH后续有没有可能支持输入.

1 个赞

就针对标题,目前我们是不支持多 pattern 的,不过我们在规划支持多 pattern 的功能。

期待,大概多久能用起来.

年底的时候,我们会发个大版本,里面会有这个功能

1 个赞

浙ICP备20010487号