添加不同路径的Sack值
add Sack value of different paths
我有一个包含一个起始节点和两个目标节点的图。两条路通向第一个目标,另一条路通向第二个目标。
我想找到所有目标的所有路径并收集它们的重量(sack(sum))。为此,我使用 sack 沿途收集边缘权重。
数据:
g.addV('start').property(id, 'v0').
addV('road').property(id, 'v1').
addV('road').property(id, 'v2').
addV('goal').property(id, 'v3').
addV('road').property(id, 'v4').
addV('road').property(id, 'v5').
addV('road').property(id, 'v6').
addV('goal').property(id, 'v7').
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'))
查询:
g.withSack(1.0f).V('v0')
.repeat(
outE().sack(mult).by('weight')
.inV()
).until(hasLabel('goal'))
.order().by(sack(), desc)
.limit(20)
.project('sack', 'id', 'edge-weight')
.by(sack())
.by(id)
.by(path())
结果:
{'sack': 0.28, 'id': 'v7', 'edge-weight': path[v[v0], e[e6][v0-link->v6], v[v6], e[e7][v6-link->v7], v[v7]]}
{'sack': 0.125, 'id': 'v3', 'edge-weight': path[v[v0], e[e3][v0-link->v5], v[v5], e[e4][v5-link->v4], v[v4], e[e5][v4-link->v3], v[v3]]}
{'sack': 0.064, 'id': 'v3', 'edge-weight': path[v[v0], e[e0][v0-link->v1], v[v1], e[e1][v1-link->v2], v[v2], e[e2][v2-link->v3], v[v3]]}
到目前为止一切顺利!
现在我想将所有以相同目标顶点结尾的值相加,并按此总和对目标顶点进行排序。
路径不用保留,仅供演示。另外,当然,每个顶点应该只出现一次。
我该怎么做?
理想输出:
{'sum': 0.28, 'id': 'v7'}
{'sum': 0.189, 'id': 'v3'}
(我的代码在 'gremlin' 的 Neptune 上运行:{'version':'tinkerpop-3.4.11'})
您的查询与答案非常接近。如果你不需要路径,你可以将它们按顶点分组并求和 sack 值。
gremlin> g.withSack(1.0f).
......1> V('v0').
......2> repeat(outE().sack(mult).by('weight').inV()).until(hasLabel('goal')).
......3> group().by(id()).by(sack().sum()).
......4> unfold().
......5> order().by(values, desc)
==>v7=0.280
==>v3=0.1890
如果您希望答案以您需要的格式准确无误,您也可以在末尾添加项目。
gremlin> g.withSack(1.0f).
......1> V('v0').
......2> repeat(outE().sack(mult).by('weight').inV()).until(hasLabel('goal')).
......3> group().by(id()).by(sack().sum()).
......4> unfold().
......5> order().by(values, desc).
......6> project('sum', 'id').by(select(values)).by(select(keys))
==>[sum:0.280,id:v7]
==>[sum:0.1890,id:v3]
我有一个包含一个起始节点和两个目标节点的图。两条路通向第一个目标,另一条路通向第二个目标。 我想找到所有目标的所有路径并收集它们的重量(sack(sum))。为此,我使用 sack 沿途收集边缘权重。
数据:
g.addV('start').property(id, 'v0').
addV('road').property(id, 'v1').
addV('road').property(id, 'v2').
addV('goal').property(id, 'v3').
addV('road').property(id, 'v4').
addV('road').property(id, 'v5').
addV('road').property(id, 'v6').
addV('goal').property(id, 'v7').
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'))
查询:
g.withSack(1.0f).V('v0')
.repeat(
outE().sack(mult).by('weight')
.inV()
).until(hasLabel('goal'))
.order().by(sack(), desc)
.limit(20)
.project('sack', 'id', 'edge-weight')
.by(sack())
.by(id)
.by(path())
结果:
{'sack': 0.28, 'id': 'v7', 'edge-weight': path[v[v0], e[e6][v0-link->v6], v[v6], e[e7][v6-link->v7], v[v7]]}
{'sack': 0.125, 'id': 'v3', 'edge-weight': path[v[v0], e[e3][v0-link->v5], v[v5], e[e4][v5-link->v4], v[v4], e[e5][v4-link->v3], v[v3]]}
{'sack': 0.064, 'id': 'v3', 'edge-weight': path[v[v0], e[e0][v0-link->v1], v[v1], e[e1][v1-link->v2], v[v2], e[e2][v2-link->v3], v[v3]]}
到目前为止一切顺利!
现在我想将所有以相同目标顶点结尾的值相加,并按此总和对目标顶点进行排序。
路径不用保留,仅供演示。另外,当然,每个顶点应该只出现一次。
我该怎么做?
理想输出:
{'sum': 0.28, 'id': 'v7'}
{'sum': 0.189, 'id': 'v3'}
(我的代码在 'gremlin' 的 Neptune 上运行:{'version':'tinkerpop-3.4.11'})
您的查询与答案非常接近。如果你不需要路径,你可以将它们按顶点分组并求和 sack 值。
gremlin> g.withSack(1.0f).
......1> V('v0').
......2> repeat(outE().sack(mult).by('weight').inV()).until(hasLabel('goal')).
......3> group().by(id()).by(sack().sum()).
......4> unfold().
......5> order().by(values, desc)
==>v7=0.280
==>v3=0.1890
如果您希望答案以您需要的格式准确无误,您也可以在末尾添加项目。
gremlin> g.withSack(1.0f).
......1> V('v0').
......2> repeat(outE().sack(mult).by('weight').inV()).until(hasLabel('goal')).
......3> group().by(id()).by(sack().sum()).
......4> unfold().
......5> order().by(values, desc).
......6> project('sum', 'id').by(select(values)).by(select(keys))
==>[sum:0.280,id:v7]
==>[sum:0.1890,id:v3]