【发布时间】:2016-02-04 10:34:13
【问题描述】:
我遇到了 Gremlin 返回重复路径的问题,我想知道是否有人可以帮助我。我对 Gremlin 很陌生,所以如果我犯了任何简单的错误,请大家见谅。
我的数据库的一个简单形式由 50 多个节点和 5000 多个边组成,其中边被认为是单向的,但是在两个节点之间可能会有双向的边导致循环结构(所以节点 A -> B -> A ),同样你可以有 (A -> B -> C -> A)。
我想要完成的是网络的遍历,返回起始节点和结束节点之间的每条唯一路径,它没有循环。下面是我的代码示例。
final List<List> paths = new ArrayList<List>();
String endNodeID = endNode.getVertex().getId().toString();
new GremlinPipeline<Vertex, ArrayList<Vertex>>(startNode.getVertex())
.as("x").out("OutboundLink").simplePath()
.loop("x", new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() {
@Override
public Boolean compute(final LoopPipe.LoopBundle<Vertex> loopBundle) {
return loopBundle.getLoops() <= 8;
}
}, new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() {
@Override
public Boolean compute(final LoopPipe.LoopBundle<Vertex> loopBundle) {
return endNodeID.equals(loopBundle.getObject().getId().toString());
}
}).simplePath().filter(new PipeFunction<Vertex, Boolean>() {
@Override
public Boolean compute(final Vertex arg0) {
return targetId.equals(arg0.getId().toString());
}
}).path(new PipeFunction<Vertex, String>() {
@Override
public String compute(final Vertex vertex) {
return vertex.getId().toString();
}
}).fill(paths);
我相信它会做什么
- 获取起始顶点
- 将位置声明为 X
- 关注所有指向 X 的出站链接
- 删除任何带有循环的路径(例如 A -> B-> C -> D-> B-> E)
- 循环回到 X 最多 8 次,但是如果路径到达结束节点,则停止该路径进一步前进。
- 重新检查循环路径。
- 过滤除 endNode 之外的路径。
- 填充列表。
据此,我目前收到以下不需要的行为 - 重复的路径 - 到达 endNodeID 但继续的路径。
虽然我之后可以在代码中更正此问题(在一次模拟中,它从 10000 条路径更正为仅 200 条),但这似乎是一种资源浪费。
任何帮助将不胜感激。
【问题讨论】: