现在已知了一个路径上会出现的所有结点,但是将这些结点所连接起来的边暂时不明,能否使用ngql语句将该路径查询出来?

  • nebula 版本:3.5.0
  • 部署方式: 单机
  • 安装方式:RPM
  • 是否上生产环境: N
  • 问题的具体描述
    在做环路查询的相关问题的时候,利用graphtool的工具库已经完成了环路检测,查询完成后能够获得一个包含所有环路的list,这些环路中只有每个结点的vid,例如[1, 3, 4, 5]这四个结点能够构成一个环。
    后续的工作要依赖于环路中的边上的一些属性,能否根据四个明确的vid查询出来具体的路径?
    尝试使用过利用match语句
match p=(v1)--(v2)--(v3)--(v4)--(v1) \
where id(v1)==1 and id(v2)==3 and id(v3)==4 and id(v4) == 5 \
return p

但是这样跑的效率非常低,甚至无法完成查询,是否有其他方式能够完成?

想找到环路,并拿到属性可以用FIND ALL PATH, 知道step n 之后用
FIND ALL PATH WITH PROP FROM "v1" TO "v1" OVER * BIDIRECT UPTO n STEPS YIELD path AS p

3 个赞

可以把执行计划发出来看看,指定id按道理不应该很慢,不过这个能满足你的要求吗?路径的顺序一定是1,3,4,5这样?会不会有1,4,5,3这种情况?

我这边试了一下,确实能够查询到环路,但是这样的查询会把跳数<n的环路也查找进来,我们现在的应用场景主要需要跳数固定为4和6的环(只包含4个结点或6个结点的环),全查询出来后是否有方法能够对结果包含的结点数进行筛选?

是否考虑用nebulagraph来做环路检测?

先看看这个方法是否满足性能,如果满足可以在业务层用代码去过滤

1 个赞

刚刚尝试用这种方法去进行全图的环路检索,直接没法跑,现在可能考虑结合graph tool找出来的结点,用nebula find path的方法去找该结点所处的环路,再对环路去进行处理,这样的性能还可以。全部交给nebula没法跑,跑全图直接服务挂了 :joy:

所以你一开始是没有起始点的是把,不知道你是什么业务,如果类似于实时的业务,可以用实时触发的点(比如交易的双方等),来找环路。环路记得设置下最大的跳数

1 个赞

看了上面最初的语句计划,性能不好的原因是 filter 在中间的拓展的时候并没有下推,是优化器缺少类似的优化,目前可以考虑将路径拆开做些辅助的调优,类似下面语句:

match (v1)-[e1]-(v2), (v2)-[e2]-(v3), (v3)-[e3]-(v4), (v4)-[e4]-(v1) \
where id(v1)=="1" and id(v2)=="2" and id(v3)=="3" and id(v4) == "4" \
return [v1,e1,v2,e2,v3,e3,v4,e4,v1] as p

上面路径需要手动拼接一下,跟原来的 path 变量稍微有些出入,但是应该没有丢失信息。

2 个赞

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