如何在 Gremlin 中按边值对顶点进行排序
How sort vertices by edge values in Gremlin
给定 air-routes 图,假设我想获得所有可能的一站式路线,如下所示:
[home] --distance--> [stopover] --distance--> [destination]
其中 [home]、[stopover] 和 [destination] 是机场节点,每个节点都有一个 属性 'code' 代表机场代码; distance 是赋予连接两个机场节点的每条边的整数权重。
我如何编写一个查询来获取 [home]、[stopover] 和 [destination] 的机场代码,以便结果排序如下:
- [home] 机场代码按字母顺序排序。
- 对于每组[home]机场,[stopover]机场代码按[home]和[stopover]之间的距离(升序)排序。
- 排序1和2后,[目的地]机场代码按[中途停留]和[目的地]之间的距离排序。
(注:[home]和[destination]是否为同一个机场无所谓)
一种方法是通过 group
嵌套 by
调制。
g.V().
group().
by('code').
by(
outE('route').
order().by('dist').
inV().
group().
by('code').
by(
outE('route').
order().by('dist').
inV().
values('code').fold())).
unfold()
结果类似于:
1. {'SHH': {'WAA': ['KTS', 'SHH', 'OME'], 'OME': ['TLA', 'WMO', 'KTS', 'GLV', 'ELI', 'TNC', 'WAA', 'WBB', 'SHH', 'SKK', 'KKA', 'UNK', 'SVA', 'OTZ', 'GAM', 'ANC']}}
2. {'KWN': {'BET': ['WNA', 'KWT', 'ATT', 'KUK', 'TLT', 'EEK', 'WTL', 'KKH', 'KWN', 'KLG', 'MLL', 'KWK', 'PQS', 'CYF', 'KPN', 'NME', 'OOK', 'GNU', 'VAK', 'SCM', 'HPB', 'EMK', 'ANC'], 'EEK': ['KWN', 'BET'], 'TOG': ['KWN']}}
3. {'NUI': {'SCC': ['NUI', 'BTI', 'BRW', 'FAI', 'ANC'], 'BRW': ['ATK', 'AIN', 'NUI', 'PIZ', 'SCC', 'FAI', 'ANC']}}
4. {'PSG': {'JNU': ['HNH', 'GST', 'HNS', 'SGY', 'SIT', 'KAE', 'PSG', 'YAK', 'KTN', 'ANC', 'SEA'], 'WRG': ['PSG', 'KTN']}}
5. {'PIP': {'UGB': ['PTH']}}
.
.
.
给定 air-routes 图,假设我想获得所有可能的一站式路线,如下所示:
[home] --distance--> [stopover] --distance--> [destination]
其中 [home]、[stopover] 和 [destination] 是机场节点,每个节点都有一个 属性 'code' 代表机场代码; distance 是赋予连接两个机场节点的每条边的整数权重。
我如何编写一个查询来获取 [home]、[stopover] 和 [destination] 的机场代码,以便结果排序如下:
- [home] 机场代码按字母顺序排序。
- 对于每组[home]机场,[stopover]机场代码按[home]和[stopover]之间的距离(升序)排序。
- 排序1和2后,[目的地]机场代码按[中途停留]和[目的地]之间的距离排序。
(注:[home]和[destination]是否为同一个机场无所谓)
一种方法是通过 group
嵌套 by
调制。
g.V().
group().
by('code').
by(
outE('route').
order().by('dist').
inV().
group().
by('code').
by(
outE('route').
order().by('dist').
inV().
values('code').fold())).
unfold()
结果类似于:
1. {'SHH': {'WAA': ['KTS', 'SHH', 'OME'], 'OME': ['TLA', 'WMO', 'KTS', 'GLV', 'ELI', 'TNC', 'WAA', 'WBB', 'SHH', 'SKK', 'KKA', 'UNK', 'SVA', 'OTZ', 'GAM', 'ANC']}}
2. {'KWN': {'BET': ['WNA', 'KWT', 'ATT', 'KUK', 'TLT', 'EEK', 'WTL', 'KKH', 'KWN', 'KLG', 'MLL', 'KWK', 'PQS', 'CYF', 'KPN', 'NME', 'OOK', 'GNU', 'VAK', 'SCM', 'HPB', 'EMK', 'ANC'], 'EEK': ['KWN', 'BET'], 'TOG': ['KWN']}}
3. {'NUI': {'SCC': ['NUI', 'BTI', 'BRW', 'FAI', 'ANC'], 'BRW': ['ATK', 'AIN', 'NUI', 'PIZ', 'SCC', 'FAI', 'ANC']}}
4. {'PSG': {'JNU': ['HNH', 'GST', 'HNS', 'SGY', 'SIT', 'KAE', 'PSG', 'YAK', 'KTN', 'ANC', 'SEA'], 'WRG': ['PSG', 'KTN']}}
5. {'PIP': {'UGB': ['PTH']}}
.
.
.