• konisGraph学习。复杂查询优化记录


    最近有需求是查两个公司之间的投资关系 比如 a和b之间有哪些直接投资和间接投资。

    例如

    a->b

    a->e->b

    a->c->d->b    

    b->f->a

    需求是查出7跳以内的ab之间的投资关系 

    v的标签是company_name,属性是company_name ,eid  其中id=eid

    e的标签是invest,属性是 stock_percent

    最开始写的查询语句

    g.V()

    .has('company','company_name',P.within('公司B','公司A'))  --找到a b两个公司的点

    .repeat(outE('invest').otherV().simplePath()) --通过外边一直向外辐射

    .until(and(                                                        --直到 两个条件都满足

            loops().is(lte(7)),                                        --条件1 循环7次以内

            has('company','company_name',P.within('公司B','公司A'))) --a->b  b->a的路线

    )

    .path()

    .by(valueMap('company_name')).by(valueMap('stock_percent'))

    这个查询本身没有问题。 and里面两个条件分开写 普通查询也没问题,但是在查询一个点边比较多时 7跳后有3000路径的数据时出现了超时问题。

    按照专业人士说,这个查询使用and作为退出traversal条件,但是tinkerpop编译器很笨,只要until内部条件是false,就会跳数+1再进行traversal,不会识别until内部复杂条件,导致实际从一个点遍历了一个子图,涉及的中间点边非常多,最终导致超时 

    最后优化后

     g.inject(1).union(V().has('company','company_name', P.within("公司2","公司1")))--这里可以直接g.V().has() 我这里union是因为可以同时company_name 和eid去查

    .repeat(outE('invest').otherV().simplePath()).times(7).emit() --收集1-7跳的所有路径

    .or(has('company','company_name',P.within("公司4","公司7")),has('company','company_name',P.within("公司6","公司5")))

    .path().by('company_name').by('stock_percent')

    在优化查询时遇到了这个问题。

    g.V().has('company','company_name', P.within("公司1")).repeat(outE('invest').otherV().simplePath()).times(7).emit().has('company','company_name',P.within("公司7")).path().by('company_name').by('stock_percent')

    g.V().has('company','company_name', P.within("公司1")).repeat(outE('invest').otherV().simplePath()).times(7).emit(has('company','company_name',P.within("公司7"))).path().by('company_name').by('stock_percent')

    请问这两个查询有什么区别。

    前者会先获取 1-7跳的所有数据,然后再过滤最后节点为公司7的数据

    后者是收集所有含有节点为公司7的数据,并且直到7跳,也就是说我到了公司7的节点,还要继续往后面跳

    上面仅供参考 开始硬核处理。

    上面的结果在outE改为bothE之后查询还是卡住了。卡住了怎么办?各位老哥有何良策。

    这时候要介绍两个方法profile()和explain().

    算了不搞了。搞来搞去跳数太多了 最后需求必须用bothE 6跳后的路径有32E 7跳后的路径有300多亿,实在搞不下去了。

    最后直接减少跳数为4跳。

  • 相关阅读:
    VBA技术资料MF64:遍历单元格搜索字符并高亮显示
    在数据框中如何把变量定义为整数型数据
    hadoop常用命令
    JavaScript【立即调用的函数(IIFE)、eval 命令、函数的应用、对象概述、对象属性、对象方法、函数应用注意事项、Math对象_静态属性、Math对象_静态方法一】(八)
    11月5日 OpenCV 实战基础学习笔记——图像金字塔、轮廓、模板匹配
    JS-闭包的用法
    数据结构和算法学习之动态规划解决背包问题
    WebRTC音视频开发读书笔记(四)
    文盘Rust——起手式,CLI程序
    第一百五十回 自定义组件综合实例:游戏摇杆一
  • 原文地址:https://blog.csdn.net/cclovezbf/article/details/132802055