flink gelly路径/轨迹用例

vltsax25  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(468)

我们的团队对gelly api是新手。我们正在寻找实现一个简单的用例,它将列出所有源于初始垂直的路径。
输入边缘csv文件为1,2\n2,3\n3,4\n1,5\n5,6
所需的输出将是(从1开始的完整路径)1,2,3,4\n1,5,6
有人能帮忙吗。

slwdgvem

slwdgvem1#

您可以使用gelly的一种迭代抽象,例如以顶点为中心的迭代。从源顶点开始,可以迭代地扩展路径,每个超步一跳。接收到路径后,顶点将其id附加到路径,并将其传播到传出的邻居。如果顶点没有传出邻居,则它将打印/存储路径,并且不会进一步传播路径。为了避免循环,顶点还可以在传播之前检查其id是否存在于路径中。计算函数可以如下所示:

public static final class ComputePaths extends ComputeFunction<Integer, Boolean, NullValue, ArrayList<Integer>> {

    @Override
    public void compute(Vertex<Integer, Boolean> vertex, MessageIterator<ArrayList<Integer>> paths) {
        if (getSuperstepNumber() == 1) {
            // the source propagates its ID
            if (vertex.getId().equals(1)) {
                ArrayList<Integer> msg = new ArrayList<>();
                msg.add(1);
                sendMessageToAllNeighbors(msg);
            }
        }
        else {
            // go through received messages
            for (ArrayList<Integer> p : paths) {
                if (!p.contains(vertex.getId())) {
                    // if no cycle => append ID and forward to neighbors
                    p.add(vertex.getId());
                    if (!vertex.getValue()) {
                        sendMessageToAllNeighbors(p);
                    }
                    else {
                        // no out-neighbors: print p
                        System.out.println(p);
                    }
                }
                else {
                    // found a cycle => print the path and don't propagate further
                    System.out.println(p);
                }
            }
        }
    }
}

在这段代码中,我假设您已经预处理了顶点,以便用“true”值标记没有out邻居的顶点。你可以使用 graph.outDegrees() 找到那些。
请记住,在一个大而密集的图中枚举所有路径的计算代价很高。中间路径状态可以很快爆发。您可以考虑使用一种比使用int的arraylist更紧凑的方法来表示路径,但是如果您有一个大直径的稠密图,请注意成本。如果您不需要路径本身,而只对可达性或最短路径感兴趣,那么就存在更有效的算法。

相关问题