- nebula 版本:2.0.1
- 部署方式(分布式 / / Docker / DBaaS):单机
- 是否为线上版本:N
- 硬件信息
略 - 问题的具体描述
一个节点同时连接多种边的查询
我的库里有一些如下图的点
我现在想把库里的这类点都查询出来.规则是:查询出所有的同时有出边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
又查询超时了.
问题综述:
-
管道的前后过滤条件有没可能优化,算子下推.
-
MATCH可不可以支持多条模式查询:
MATCH (v2)<-[e2:link2]-(v0:node{name:"N-0"})-[e1:link1]->(v1), (v0)-[e3:link3]->(v3) RETURN v0, v1, v2, v3
.两个模式表达式用","隔开.两个表达式小中都有v0变量.它们其实是同一个变量. -
MATCH后续有没有可能支持输入.