按 属性 排序,这不是 GroupBy 语句的一部分

sort by Property that's not part of the GroupBy statement

我有一个包含一个起始节点和两个目标节点的图。两条路通向第一个目标,另一条路通向第二个目标。 我寻找到目标顶点的所有路径并收集边权重 (sack(sum))。我通过 group().by().

添加通向同一目标的所有路径的总和

目前查询:

g.withSack(1.0f).V('v0')
    .repeat(
        outE().sack(mult).by('weight')
        .inV()
    ).until(hasLabel('goal'))
    .group().by().by(sack())
    .unfold()
    .project('sack', 'map')
        .by(select(values))
        .by(select(keys).valueMap(true))
    .order().by('sack', desc)

结果如下所示:

{'sack': 0.27999999999999997, 'map': {<T.id: 1>: 'v7', <T.label: 4>: 'goal', 'date': ['02-02-2022']}}
{'sack': 0.125, 'map': {<T.id: 1>: 'v3', <T.label: 4>: 'goal', 'date': ['02-02-2022']}}

现在我也想按日期排序...但是,使用 by('date', desc) 会导致错误:
“java.util.LinkedHashMap 无法转换为 java.lang.Comparable”
我可以以某种方式访问​​地图中的日期值吗?或者以其他方式按日期排序?

(fyi: by(sack(), desc) 和 by('sack', desc) )

数据:

g.addV('start').property(id, 'v0')
  .addV('road').property(id, 'v1')
  .addV('road').property(id, 'v2')
  .addV('goal').property(id, 'v3').property('date', '02-02-2022')
  .addV('road').property(id, 'v4').
  .addV('road').property(id, 'v5').
  .addV('road').property(id, 'v6').
  .addV('goal').property(id, 'v7').property('date', '22-02-2022')
  .addE('link').property('weight', 0.4).from(V('v0')).to(V('v1'))
  .addE('link').property('weight', 0.4).from(V('v1')).to(V('v2'))
  .addE('link').property('weight', 0.4).from(V('v2')).to(V('v3'))
  .addE('link').property('weight', 0.5).from(V('v0')).to(V('v5'))
  .addE('link').property('weight', 0.5).from(V('v5')).to(V('v4'))
  .addE('link').property('weight', 0.5).from(V('v4')).to(V('v3'))
  .addE('link').property('weight', 0.7).from(V('v0')).to(V('v6'))
  .addE('link').property('weight', 0.4).from(V('v6')).to(V('v7'))

(我的代码在 'gremlin' 的 Neptune 上运行:{'version':'tinkerpop-3.4.11'})

您只需 select map 地图中的 date 键。

gremlin> g.withSack(1.0f).
......1>   V('v0').
......2>   repeat(outE().sack(mult).by('weight').inV()).
......3>   until(hasLabel('goal')).
......4>   group().by().by(sack()).
......5>   unfold().
......6>   project('sack', 'map').
......7>     by(select(values)).
......8>     by(select(keys).valueMap(true)).
......9>   order().by('sack', desc).by(select('map').select('date'),desc)

==>[sack:0.280,map:[id:v7,label:goal,date:[22-02-2022]]]
==>[sack:0.1250,map:[id:v3,label:goal,date:[02-02-2022]]] 

但是请注意,为了正确排序日期(如果将它们编码为字符串),您应该使用接近 ISO 8601 格式的内容,例如 YYYY-MM-DD 或更具体地说,2022-02-22。存储实际日期或纪元偏移整数可能更有效。

根据评论线程 2022-02-23 更新

好的,我想我明白你所看到的 - 我正在使用 Gremlin 控制台在 3.5.2 级别进行测试,看起来你正在使用 Amazon Neptune。 Neptune 目前处于 3.4.11 级别(但应该很快就会升至 3.5.2 级别)。这是 TinkerPop 3.5.2 级别的修改后的查询 运行。

gremlin> g.withSack(1.0f).
......1>   V('v0').
......2>   repeat(outE().sack(mult).by('weight').inV()).
......3>   until(hasLabel('goal')).
......4>   group().by().by(sack()).
......5>   unfold().
......6>   project('sack', 'map').
......7>     by(select(values)).
......8>     by(select(keys).valueMap(true)).
......9>   order().
.....10>     by(select('map').select('date').unfold(),asc)  

==>[sack:0.1250,map:[id:v3,label:goal,date:[2022-02-02]]]
==>[sack:0.280,map:[id:v7,label:goal,date:[2022-02-22]]]