2016-09-01 11 views
0

このコードは「Apache Giraphを使用した実用的なグラフ分析」という本から借りています。Apache Giraph:setEdgeValue()でエッジ値を変更できません

私のコードの目標は、一方向のエッジのみを使用して2方向のエッジを使用するようにグラフを変換することです。

私のデータがTextDoubleDoubleAdjacencyListVertexInputFormatにタブ区切りのテキストファイルである:私は持っているエッジに期待していたこのコードを実行した後

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(); 
    } 
} 

:私の最小限の非稼働例がある

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 

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 

なぜ私のコードは既存のエッジを変更していないのですか?

+0

私も使ってみました: 'removeEdgesRequest(vertex.getId()、m); addEdgeRequest(vertex.getId()、EdgeFactory.create(m、ORIG_E)); 'しかし、動作しませんでした。 –

答えて

0

出力が正しいです。値が0のv1からv2へのエッジがあるとします。 - v2からv1へのエッジがある場合、このエッジの値は1に更新されます。 2新しいエッジがv2からv1に値2で作成されます。 どちらの場合も、ソースエッジ値は変更されません。

入力データには双方向のエッジがないため、最初のケースは実行されません。その結果、出力には値1はありません。

関連する問題