【问题标题】:Cosmos gremlin performance issue with queryCosmos gremlin 查询的性能问题
【发布时间】:2020-03-24 07:22:04
【问题描述】:

我正在尝试在下面运行此查询,但遇到超时问题。这里的低效率在哪里?

   g.V().hasLabel('RiskLibrary','name','General 
Business','active','1').as('lib').select('lib').
outE('CONTAINS_RISK').select('lib').project('Risk 
Library','Risks').by('name').by(out('CONTAINS_RISK').project('Name',     
'Description','Impacts','Causes').by('name').by('description').
by(both('IMPACTS').project('name').by('name').fold()).
by(both('CAUSES').project('name').by('name').fold()).fold())

【问题讨论】:

    标签: gremlin azure-cosmosdb-gremlinapi


    【解决方案1】:

    关于您的遍历的某些内容似乎不正确。对于初学者hasLabel() 看起来它是用不是标签的参数调用的。我假设遍历应该是:

    g.V().has('RiskLibrary', 'name', 'General Business').has('active', '1').as('lib').
          select('lib').
          outE('CONTAINS_RISK').
          select('lib').
          project('Risk Library', 'Risks').
            by('name').
            by(out('CONTAINS_RISK').
               project('Name', 'Description', 'Impacts', 'Causes').
                 by('name').
                 by('description').
                 by(both('IMPACTS').
                    project('name').by('name').
                    fold()).
                 by(both('CAUSES').
                    project('name').by('name').
                    fold()).
                 fold())
    

    如果这是正确的,那么我想知道遍历的目的究竟是什么。就目前的情况而言,我希望每个outE('CONTAINS_RISK') 都能达到project('Risk Library', 'Risks')。您将获得与 select('lib') 相同的每个边的输出,select('lib') 会抓取您从中遍历的原始 Vertex。如果您不打算这样做,您可以想象一遍又一遍地执行大量的 project('Risk Library', 'Risks') 会产生巨大的查询成本。

    假设您的其余遍历是正确的,我认为您只需要摆脱as('lib') 的步骤标签和project('Risk Library', 'Risks') 之前的行,因此:

    g.V().has('RiskLibrary', 'name', 'General Business').has('active', '1').
          project('Risk Library', 'Risks').
            by('name').
            by(out('CONTAINS_RISK').
               project('Name', 'Description', 'Impacts', 'Causes').
                 by('name').
                 by('description').
                 by(both('IMPACTS').
                    project('name').by('name').
                    fold()).
                 by(both('CAUSES').
                    project('name').by('name').
                    fold()).
                 fold())
    

    也就是说,根据“CONTAINS_RISK”边的每个相对顶点存在多少“IMPACTS”和“CAUSES”边,这可能仍然是一个昂贵的遍历。

    【讨论】:

    • 谢谢斯蒂芬。那么,最后一个问题,我们如何根据“CONTAINS_RISK”边的属性进行过滤?
    • out('CONTAINS_RISK')改成outE('CONTAINS_RISK').has('property', value).inV()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多