2017-02-17 24 views
3

Я пытаюсь использовать один запрос гремлина для определения процента вершин, удовлетворяющих определенному предикату, но у меня возникают проблемы с хранением и распространением вычисленных значений.Gremlin- ​​Как вычислить процент вершин с определенным свойством

Скажите, что я хочу вычислить процент всех вершин с меткой «A», у которой есть исходящий край с меткой «B». Я могу напечатать число вершин с меткой «А», хорошо, как число вершин исходящего ребра с меткой «B» в том же запросе:

g.V().limit(1).project("total","withEdgeB") 
.by(g.V().hasLabel("A").count()) 
.by(g.V().hasLabel("A").match(__.as("a").outE("B").inV()).dedup().count()) 

Это дает мне две соответствующие значения: total и withEdgeB. Как я могу распространять и вычислять эти значения?

В идеале, я хочу что-то вроде этого:

g.V().limit(1).project("total","withEdgeB","percentage") 
.by(g.V().hasLabel("A").count().as("totalA")) 
.by(g.V().hasLabel("A").match(__.as("a").outE("B").inV()).dedup().count().as("totalWithEdgeB")) 
.by(totalWithEdgeB/totalA) 

Так что мой вопрос, как я могу получить доступ к значениям totalA и totalWithEdgeB в третьем by() заявлении? Или я все об этом ошибаюсь?

ответ

1

Я бы использовал некоторые простые вычисления. Используя современный график, найдите все вершины person с исходящими created краями:

gremlin> g.V().hasLabel('person'). 
      choose(outE('created'), 
        constant(1), 
        constant(0)).fold(). 
      project('total','withCreated','percentage'). 
      by(count(local)). 
      by(sum(local)). 
      by(mean(local)) 
==>[total:4,withCreated:3,percentage:0.75]