0

私は Gremlin を初めて使用し、JUNG のエッジ ウェイトを使用して pagerank アルゴリズムを実装しようとしています。これらは私が取ったステップです。Gremlin の 2.0.0.0 バージョンがインストールされています。R の iGraph パ​​ッケージを使用して .graphml ファイルを作成しました。これを gremlin にロードしています。

import edu.uci.ics.jung.algorithms.scoring.PageRank   
g1 = new TinkerGraph()      
g1.loadGraphML('file path.graphml')    

私の g1 グラフには、次のエッジ属性があります。

 g1.E.map
==>{weight=1, freq=1}
==>{weight=1, freq=1}
==>{weight=2, freq=2}
==>{weight=1, freq=1}
==>{weight=1, freq=1}
==>{weight=1, freq=1}
==>{weight=1, freq=1}
==>{weight=1, freq=1}
==>{weight=2, freq=2}

gremlin> g1.V.map
==>{name=a}
==>{name=b}
==>{name=c}
==>{name=d}
==>{name=e}
==>{name=f}
==>{name=g}
==>{name=h}
==>{name=i}
==>{name=k}

j = new GraphJung(g1)    

t = new EdgeWeightTransformer("weight",true, false)
pr = new PageRank<Vertex,Edge>(j, t, 0.15d)  
pr.evaluate()      
j.getVertices().collect{[it, pr.getVertexScore(it)]}

しかし、私の結果は

==>[v[n1], 0.046875]
==>[v[n0], 0.046875]
==>[v[n5], 0.046875]
==>[v[n4], 0.046875]
==>[v[n3], 0.046875]
==>[v[n2], 0.046875]
==>[v[n9], 0.046875]
==>[v[n8], 0.046875]
==>[v[n7], 0.046875]
==>[v[n6], 0.046875]

どちらが正しくありません。コードの何が問題なのかを理解するのを手伝ってくれる人がいます。また、j.getEdges().t によって、j のエッジの重みに対するトランスフォーマーの効果を確認しようとしました。

これを行うとNULLが発生します。

しかし、実行したときのように、これらのエッジに関連付けられた重みがあることはわかっています。

j.getEdges().collect{[it, it.weight]}   

次の結果が得られます。

==>[e[3][n1-_default->n5], 1]

==>[e[2][n0-_default->n4], 1]

==>[e[1][n0-_default->n3], 2]

==>[e[0][n0-_default->n2], 1]

==>[e[7][n1-_default->n8], 1]

==>[e[6][n1-_default->n7], 1]

==>[e[5][n1-_default->n6], 1]

==>[e[4][n1-_default->n1], 1]

==>[e[8][n1-_default->n9], 2]

最後に、頂点の自動キーを作成できません。私は試した

g1.createAutoIndex('test', Vertex.class, ['name'] as Set)           

そして、次のエラーが発生しました:

 No signature of method: groovy.lang.MissingMethodException.createAutoIndex() is applicable for argument types: () values: []  

ありがとうございました

4

1 に答える 1

0

また、Jung を使用して weight-edge-graph の pagerank を実装する方法を見つけるのにも苦労しました。以下は擬似コードです。Pag​​erank の詳細な実装を確認するには、GrepCode を使用する必要があります。

For(Edge e: edges){  // Edge is a user-defined class
    graph.add(edgeCount,e.getStart,e.getEnd);
    map.put(edgeCount,e.getWeight); // map is HashMap
    edgeCount++;
}
Transformer edge_weights = MapTransformer.getInstance(map) //Key Step!
Pagerank<Vertex,Edge> ranker = new Pagerank<Vertex,Edge>(graph, edge_weights, alpha);

この例を見ることをお勧めします: https://github.com/lintool/Cloud9/blob/master/src/dist/edu/umd/cloud9/example/pagerank/SequentialPageRank.java

私の疑似コードを使用して、この例に基づいて変更できます。

于 2014-02-21T17:12:09.193 に答える