排序依据 不属于 GroupBy 语句的属性



我有一个有一个开始节点和两个目标顶点的图。两条路通向第一个目标,另一条路通向第二个目标。我查找到目标顶点的所有路径,并收集边权重(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'))

(我的代码在Neptune上运行,带有"gremlin":{"version":"tickpop-3.4.11"}(

您只需要从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更新

好吧,我想我已经明白了你所看到的——我在3.5.2级别使用Gremlin控制台进行测试,看起来你在使用Amazon 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]]]  

最新更新