You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于边属性优化Gremlin全路径查询(解决Neptune超时问题)

问题:基于边name属性查询人员完整旅行路径(含性能优化需求)

核心需求

编写Gremlin查询,基于边的name属性(对应人员标识)获取人员的完整旅行路径:

  • 顶点为地点,边代表人员移动行为
  • 需明确每个人员的起始位置与终点位置
  • 参考路径示例:
P1 travels from a -> b -> c -> d -> e -> f
P2 travels from c -> d -> e -> f
P3 travels from a -> b -> c -> d
P4 travels from b -> c -> a -> d -> e -> f
P5 travels from e -> f -> a -> b -> c
P6 travels from d -> e -> a -> b -> c
P7 travels from a -> c -> e -> f

现有问题

  1. 无法处理人员路径中返回已访问顶点的场景(比如从某地点出发后再次回到该地点)
  2. 在Amazon Neptune执行时频繁触发超时或内存溢出异常
  3. 图数据规模:约5000个顶点、50000个独立会话(每个会话路径包含2-50个顶点)
  4. 性能要求:查询耗时需控制在10秒内,最长不超过30秒

当前使用的Gremlin查询语句

g.withSack([])
    .V() // will eventually have some starting condition of about 10 unique people
    .repeat(
        choose(
            loops().is(0),
            outE().as('outgoing')
                .where(
                    __.outV()
                    .inE().values('name')
                    .where(
                        eq('outgoing'))
                        .by()
                        .by(values('name')
                    )
                    .count().is(0)
                )
                .sack(assign)
                .by(
                    union(
                        sack().unfold(),
                        identity().values('name')
                    )
                    .fold()
                )
                .filter(
                    sack().unfold().dedup().count().is(1)
                )
                .inV(),
           
            outE()
                .sack(assign)
                .by(
                    union(
                        sack().unfold(),
                        identity().values('name')
                    )
                    .fold()
                )
                .filter(
                    sack().unfold().dedup().count().is(1)
                )
                .inV()
          )
    )
    .until(
        outE().filter(sack().unfold().dedup().count().is(1)).count().is(1)
    )
    .filter(path().unfold().count().is(gt(5)))
    .path()

触发的异常信息

{
  "detailedMessage": "A timeout occurred within the script during evaluation.",
  "requestId": "f34358bd-9db9-488f-be66-613a34d29f9b",
  "code": "TimeLimitExceededException"
}

图数据构建示例

g.addV('place').as('1').
  property(single, 'placename', 'a').
  addV('place').as('2').
  property(single, 'placename', 'b').
  addV('place').as('3').
  property(single, 'placename', 'c').
  addV('place').as('4').
  property(single, 'placename', 'd').
  addV('place').as('5').
  property(single, 'placename', 'e').
  addV('place').as('6').
  property(single, 'placename', 'f').
  addV('place').as('7').
  property(single, 'placename', 'g').
  addV('place').as('8').
  property(single, 'placename', 'h').
  addV('place').as('9').
  property(single, 'placename', 'i').
  addE('person').from('1').to('2').
  property('name', 'p1').addE('person').
  from('2').to('3').property('name', 'p1').
  addE('person').from('3').to('4').
  property('name', 'p1').addE('person').
  from('4').to('5').property('name', 'p1').
  addE('person').from('2').to('3').
  property('name', 'p2').addE('person').
  from('3').to('4').property('name', 'p2').
  addE('person').from('4').to('5').
  property('name', 'p2').addE('person').
  from('6').to('7').property('name', 'p3').
  property('time', '2022-05-04 12:00:00').
  addE('person').from('7').to('8').
  property('name', 'p3').
  property('time', '2022-05-05 12:00:00').
  addE('person').from('8').to('9').
  property('name', 'p3').
  property('time', '2022-05-10 12:00:00').
  addE('person').from('9').to('6').
  property('name', 'p3').
  property('time', '2022-05-03 12:00:00').
  addE('person').from('5').to('6').
  property('name', 'p4').addE('person').
  from('6').to('7').property('name', 'p4').
  addE('person').from('7').to('8').
  property('name', 'p4').addE('person').
  from('8').to('9').property('name', 'p4').
  addE('person').from('3').to('4').
  property('name', 'p5').addE('person').
  from('4').to('4').property('name', 'p5').
  addE('person').from('4').to('5').
  property('name', 'p5').addE('person').
  from('5').to('6').property('name', 'p5').
  addE('person').from('6').to('7').
  property('name', 'p5').addE('person').
  from('1').to('2').property('name', 'p6').
  addE('person').from('2').to('3').
  property('name', 'p6').addE('person').
  from('3').to('4').property('name', 'p6').
  addE('person').from('4').to('5').
  property('name', 'p6')

额外查询约束

仅选择有至少5人出发的地点作为查询的起始顶点。


内容的提问来源于stack exchange,提问作者Rajesh Paudel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:45:41