Graph 如何使用gremlin查找加权边范围内的所有节点?

Graph 如何使用gremlin查找加权边范围内的所有节点?,graph,graph-databases,gremlin,tinkerpop,Graph,Graph Databases,Gremlin,Tinkerpop,我试图获得从给定起始节点到给定范围内所有节点的最短路径列表。每一条边都是加权的,我试图使用这些加权的总和作为范围,而不是步数 下面是限制步骤的方法,但我不确定如何正确地聚合和限制路径边权重或返回路径 g.v(1).out.loop(1){it.loops < 3}{true}.dedup g.v(1).out.loop(1){it.loops[v[4256],e[178-3a8-1lh-374][4256 onetwo->4144],v[4144],e[16u-374-36d-3a0][

我试图获得从给定起始节点到给定范围内所有节点的最短路径列表。每一条边都是加权的,我试图使用这些加权的总和作为范围,而不是步数

下面是限制步骤的方法,但我不确定如何正确地聚合和限制路径边权重或返回路径

g.v(1).out.loop(1){it.loops < 3}{true}.dedup
g.v(1).out.loop(1){it.loops<3}{true}.dedup

谢谢你的帮助

循环步骤的
it.path
属性是关键。由于权重位于边上,我们需要显式遍历它们,以便它们在路径中可见:

g.v(1).as("start").outE().inV().loop("start"){it.path.collect{it.weight==null ? 0.0 : it.weight}}.sum()<=0.3f}.dedup()

TinkerPop 3语法可能如下所示:

g、 使用sack(0.0f).V(1).重复(outE().sack(sum,'weight').inV()).次(2).sack().path()

输出完整路径(包括边)以及边的总权重:


==>[v[4256],e[178-3a8-1lh-374][4256 onetwo->4144],v[4144],e[16u-374-36d-3a0][4144 Two-Three->4248],v[4248],3.0]

这是修补匠2还是3?2。还没有移动到3,但如果需要,这是一个选项。我不知道如何使用2,因为循环是宽度优先的,所以每个路径都需要单独的累加器,或者在循环闭包中对整个路径求和。后者会更好。我知道Tinkerpop 3已经(或将要)将深度优先作为一个选项,但我已经尝试过了,但它似乎可以随着深度的增加而添加一个变量或一个变量数组,并随着深度的增加而重置。我认为循环有一个
it.path
属性,我可以在条件中检查它吗?类似于
sum(it.path.edges.length)
?尝试
g.V[0].outE.inV.loop(2){it.loops<3&&it.path.transform{[it.findAll{it instanceof Edge}.sum{it.weight},it]}{true}.enablePath().dedup.path
并获取
lang MissingMethodException:没有方法签名:arraylist.transform()
错误。我不确定我是否理解它。路径是什么。
g.v(1).as("start").bothE().bothV().loop("start"){it.path.collect{it.weight==null ? 0.0 : it.weight}}.sum()<=0.3f}.simplePath().dedup()