Гремлин - Как вычислить процент вершин с определенным свойством

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

Скажем, я хочу вычислить процент всех вершин с меткой «A», у которых есть выходящее ребро с меткой «B». Я могу распечатать количество вершин с меткой «A», а также количество вершин с исходящим ребром с меткой «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() выражении? Или я все неправильно делаю?


person ChocolateAndCheese    schedule 17.02.2017    source источник


Ответы (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]
person Daniel Kuppitz    schedule 23.08.2017