2016-09-01 3 views
0

Ce code est emprunté au livre "Practical Graph Analytics avec Apache Giraph".Apache Giraph: Impossible de modifier la valeur du bord via setEdgeValue()

Le but de mon code est de transformer un graphe en n'utilisant que le bord à sens unique en utilisant des arêtes bidirectionnelles.

Mes données est un fichier texte délimité par des tabulations à 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 

Mon minimum exemple de non-travail est:

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

Après l'exécution de ce code, je me attendais à bords d'avoir seulement 1 ou 2 valeurs. Cependant, ce que je reçois est:

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 

Pourquoi mon code ne modi fi e pas les arêtes préexistantes?

+0

J'ai également essayé d'utiliser: 'removeEdgesRequest (vertex.getId(), m); addEdgeRequest (vertex.getId(), EdgeFactory.create (m, ORIG_E)); 'mais cela n'a pas fonctionné. –

Répondre

0

Votre résultat est correct. Supposons qu'il y ait un front de v1 à v2 avec la valeur 0. Votre code fonctionne comme suit: 1- s'il y a un front de v2 à v1, alors la valeur de ce front sera mise à jour à 1. 2- sinon, un nouveau bord sera créé de v2 à v1 avec la valeur 2. Dans les deux cas, la valeur de la bordure source ne sera pas modifiée.

Comme dans vos données d'entrée il n'y a pas de bord bidirectionnel, le premier cas ne s'exécute pas. Par conséquent, il n'y a pas de valeur 1 dans votre sortie.