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
相关产品推荐
相关产品推荐

