настраиваемый алгоритм PageRank в Gremlin?

Я ищу версию Gremlin настраиваемого алгоритма PageRank. Существует несколько старых версий, одна (от: http://www.infoq.com/articles/graph-nosql-neo4j) вставлен ниже. У меня возникли проблемы с вписыванием потока в текущую структуру на основе GremlinGroovyPipeline. Что представляет собой модернизированный аналог этого или что-то подобное?

$_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 и изменять обход на их основе ценна для настройки.

огромное спасибо


person Ziggy Eunicien    schedule 25.02.2014    source источник


Ответы (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)

person Ziggy Eunicien    schedule 27.02.2014