【问题标题】:Apache Giraph: Cannot modify edge value via setEdgeValue()Apache Giraph:无法通过 setEdgeValue() 修改边值
【发布时间】:2017-01-09 12:31:12
【问题描述】:

这段代码是从《Practical Graph Analytics with Apache Giraph》一书中借来的。

我的代码的目标是将图形从仅使用单向边转换为使用双向边。

我的数据是一个制表符分隔的文本文件到 TextDoubleDoubleAdjacencyListVertexInputFormat:

A   0   B   0
B   0
C   0   A   0   D   0
D   0   B   0   G   0
E   0   A   0   B   0   D   0
F   0   C   0   D   0
G   0   C   0   E   0

我最小的非工作示例是:

  import org.apache.giraph.GiraphRunner;
  import org.apache.giraph.graph.*;
  import org.apache.hadoop.io.*;
  import org.apache.hadoop.util.ToolRunner;
  import org.apache.giraph.edge.EdgeFactory;

  public class DigraphToGraph extends BasicComputation<Text,DoubleWritable,DoubleWritable,Text>
  {
  static final DoubleWritable ORIG_E = new DoubleWritable (1), 
                               NEW_E = new DoubleWritable (2);

   @Override
    public void compute(Vertex <Text,DoubleWritable, DoubleWritable> vertex, Iterable<Text> messages) {
    if (getSuperstep () == 0)
       sendMessageToAllEdges (vertex, vertex.getId ());
    else {
      for (Text m:messages) {
        DoubleWritable edgeValue = vertex.getEdgeValue (m);
        if (edgeValue == null) 
           vertex.addEdge (EdgeFactory.create (m, NEW_E));
        else 
           // problem HERE: try to relabel edge
           vertex.setEdgeValue (m, ORIG_E);   
      }
    }

    vertex.voteToHalt ();
  }
}

执行此代码后,我期望边缘只有 1 或 2 个值。但是,我得到的是:

G   0.0 C   0.0 E   0.0 D   2.0
E   0.0 A   0.0 B   0.0 D   0.0 G   2.0
F   0.0 C   0.0 D   0.0
D   0.0 B   0.0 G   0.0 E   2.0 B   2.0 C   2.0
B   0.0 E   2.0 D   2.0 A   2.0
C   0.0 A   0.0 D   0.0 G   2.0 B   2.0
A   0.0 B   0.0 E   2.0 C   2.0

为什么我的代码没有修改预先存在的边?

【问题讨论】:

  • 我也试过用:removeEdgesRequest(vertex.getId(),m); addEdgeRequest(vertex.getId(),EdgeFactory.create(m,ORIG_E));,但没用。

标签: graph graph-theory vertex giraph edge-list


【解决方案1】:

你的输出是正确的。假设从 v1 到 v2 有一条值为 0 的边。您的代码如下工作: 1-如果从v2到v1有一条边,那么这条边的值将更新为1。 2-否则,将创建一条从 v2 到 v1 的新边,值为 2。 在这两种情况下,源边缘值都不会改变。

由于在您的输入数据中没有双向边,因此不执行第一种情况。因此,您的输出中没有值 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多