2014-02-25 39 views
0

我正在尋找Gremlin版本的可自定義的PageRank算法。有幾個舊版本,其中一個(從:http://www.infoq.com/articles/graph-nosql-neo4j)被粘貼在下面。我無法將流程融入當前基於GremlinGroovyPipeline的結構中。什麼是現代化的相當於這個或類似的東西?Gremlin中可自定義的PageRank算法?

$_g := tg:open() 
g:load('data/graph-example-2.xml') 
$m := g:map() 
$_ := g:key('type', 'song')[g:rand-nat()] 

repeat 2500 
    $_ := ./outE[@label='followed_by'][g:rand-nat()]/inV 
    if count($_) > 0 
    g:op-value('+',$m,$_[1]/@name, 1.0) 
    end 

    if g:rand-real() > 0.85 or count($_) = 0 
    $_ := g:key('type', 'song')[g:rand-nat()] 
    end 
end 

g:sort($m,'value',true()) 

另一版本可在幻燈片55的http://www.slideshare.net/slidarko/gremlin-a-graphbased-programming-language-3876581上找到。使用if語句並根據它們更改遍歷的能力對於定製非常有用。

千恩萬謝

回答

1

我想我會回答它自己的情況下,其他人需要它。被警告這不是一個非常有效的PageRank計算。它只應該被看作是一個學習的例子。

g = new TinkerGraph() 
g.loadGraphML('graph-example-2.xml') 
m = [:] 
g.V('type','song').sideEffect{m[it.name] = 0} 

// pick a random song node that has 'followed_by' edge 
def randnode(g) { 
    return(g.V('type','song').filter{it.outE('followed_by').hasNext()}.shuffle[0].next()) 
} 

v = randnode(g) 
for(i in 0..2500) { 
    v = v.outE('followed_by').shuffle[0].inV 
    v = v.hasNext()?v.next():null 
    if (v != null) { 
    m[v.name] += 1 
    } 

    if ((Math.random() > 0.85) || (v == null)) { 
    v = randnode(g) 
    } 
} 

msum = m.values().sum() 
m.each{k,v -> m[k] = v/msum} 
println "top 10 songs: (normalized PageRank)" 
m.sort {-it.value }[0..10] 

下面是一個簡化的一襯墊的良好參考: https://groups.google.com/forum/m/#!msg/gremlin-users/CRIlDpmBT7g/-tRgszCTOKwJ (以及所述的Gremlin維基:https://github.com/tinkerpop/gremlin/wiki