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

Gremlin查询:统计指定路径旅客流量并排序(避过中间节点)

图路径查询与旅客流量统计问题

现有图结构以机场为顶点(Vertex),旅客出行为边(Edge),边的uniquename属性用于唯一标识旅客,相同uniquename代表同一旅客的连续行程。

需求

  • 查询从机场b到机场f且不经过机场d的所有路径;
  • 统计每条路径对应的旅客数量;
  • 按旅客流量从高到低排序路径。

补充说明:若查询起点为a、终点为g,需执行相同的流量统计与排序操作。

已尝试的路径查询代码

g.V()
 .has("name", 'b')
 .repeat(
    out('person').not(__.has('name', 'd'))
 )
 .until(has('name', 'f'))
 .path()
 .dedup()
 .fold()

预期输出示例

b到f的预期输出

b -> c -> b1 -> e -> f   count(3) // 3位旅客走完该全程
b -> c -> b2 -> e -> f   count(2) // 2位旅客走完该全程
b -> c -> b3 -> e -> f   count(1) // 1位旅客走完该全程

a到g的预期输出

a -> b -> c -> b1 -> e -> f -> g   count(3) // 3位旅客走完该全程
a -> b -> c -> b2 -> e -> f -> g  count(2) // 2位旅客走完该全程
a -> b -> c -> b3 -> e -> f -> g  count(1) // 1位旅客走完该全程

最新查询代码

g.V().has('name', 'c').as('c')
    .sideEffect(
        V().has('name', 'a').aggregate('a')
        .V().has('name', 'b').aggregate('b')
        .V().has('name', 'e').aggregate('e')
        .V().has('name', 'f').aggregate('f')
        .V().has('name', 'g').aggregate('g')
    )
    .barrier()
    
    // 获取从起点到当前节点的所有用户
    .sideEffect(
        select('a').unfold().outE().where(inV().has('name', 'b')).dedup().aggregate('before_users')
    )
    .sideEffect(
        select('b').unfold().outE().where(inV().has('name', 'c')).dedup().aggregate('before_users')
    )
    .sideEffect(
        select('before_users').unfold().fold().unfold()
        .groupCount()
        .by(values('uniquename').fold())
        .unfold()
        .where(select(values).is(eq(2)))
        .select(keys)
        .unfold()
        .aggregate('unique_before_users')
    )

    .sideEffect(
        select('e').unfold().outE().where(inV().has('name', 'f')).dedup().aggregate('after_users')
    )
    .sideEffect(
        select('f').unfold().outE().where(inV().has('name', 'g')).dedup().aggregate('after_users')
    )
    .sideEffect(
        select('after_users').unfold().fold().unfold()
        .groupCount()
        .by(values('uniquename').fold())
        .unfold()
        .where(select(values).is(eq(2)))
        .select(keys)
        .unfold()
        .aggregate('unique_after_users')
    )
    
    .sideEffect(
        project('').
        union(select('unique_after_users').unfold(), select('unique_before_users').unfold())
        .groupCount()
        .unfold()
        .where(select(values).is(eq(2)))
        .select(keys)
        .unfold()
        .aggregate('unique_users')
    )
    .barrier()
    
    // 根据条件分析流量(不经过d)
    .sideEffect(
        identity()
        .repeat(
          outE()
          .where(within('unique_users')).by('uniquename').by()
          .inV()
          .not(__.has('name', 'd'))
        )
         .until(has('name', 'e'))
         .path()
         .aggregate('allpath')
         
    )
    .select('allpath')
    .unfold()
    .map(
        project('path', 'count')
        .by(
            identity()
        )
        .by(
            identity().unfold().filter(where(hasLabel('airport'))).fold()
        )
    )
    .groupCount()
    .by('count')

示例图构建代码

g.addV('airport').as('1').property(single, 'name', 'a').
  addV('airport').as('2').property(single, 'name', 'b').
  addV('airport').as('3').property(single, 'name', 'c').
  addV('airport').as('4').property(single, 'name', 'd').
  addV('airport').as('5').property(single, 'name', 'e').
  addV('airport').as('6').property(single, 'name', 'f').
  addV('airport').as('7').property(single, 'name', 'g').
  addV('airport').as('8').property(single, 'name', 'b1').
  addV('airport').as('9').property(single, 'name', 'b2').
  addV('airport').as('10').property(single, 'name', 'b3').
  addE('person').from('1').to('2').property('uniquename', 'p1').
  addE('person').from('1').to('2').property('uniquename', 'p2').
  addE('person').from('2').to('3').property('uniquename', 'p3').
  addE('person').from('2').to('3').property('uniquename', 'p1').
  addE('person').from('2').to('3').property('uniquename', 'p4').
  addE('person').from('2').to('3').property('uniquename', 'p21').
  addE('person').from('2').to('3').property('uniquename', 'p2').
  addE('person').from('2').to('3').property('uniquename', 'p22').
  addE('person').from('2').to('3').property('uniquename', 'p31').
  addE('person').from('3').to('4').property('uniquename', 'p1').
  addE('person').from('3').to('8').property('uniquename', 'p21').
  addE('person').from('3').to('8').property('uniquename', 'p2').
  addE('person').from('3').to('8').property('uniquename', 'p22').
  addE('person').from('3').to('9').property('uniquename', 'p3').
  addE('person').from('3').to('10').property('uniquename', 'p4').
  addE('person').from('3').to('9').property('uniquename', 'p31').
  addE('person').from('4').to('5').property('uniquename', 'p1').
  addE('person').from('5').to('6').property('uniquename', 'p1').
  addE('person').from('5').to('6').property('uniquename', 'p21').
  addE('person').from('5').to('6').property('uniquename', 'p2').
  addE('person').from('5').to('6').property('uniquename', 'p22').
  addE('person').from('6').to('7').property('uniquename', 'p1').
  addE('person').from('6').to('7').property('uniquename', 'p21').
  addE('person').from('6').to('7').property('uniquename', 'p2').
  addE('person').from('6').to('7').property('uniquename', 'p22').
  addE('person').from('8').to('5').property('uniquename', 'p21').
  addE('person').from('8').to('5').property('uniquename', 'p2').
  addE('person').from('8').to('5').property('uniquename', 'p22').
  addE('person').from('9').to('5').property('uniquename', 'p3').
  addE('person').from('10').to('5').property('uniquename', 'p4')

内容的提问来源于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.21 23:36:16