tinkerpop3: используйте гремлин для подсчета количества ребер между всеми парами узлов

У меня есть мультиграф, и мне интересно подсчитать количество ребер, соединяющих каждую пару узлов; кроме того, мне нужно было бы получить для каждой пары узлов максимальное значение определенного атрибута.

К сожалению, мне кажется, что мы можем использовать .group().by(...) только с одним атрибутом, тогда как мне нужно будет сгруппировать по inV и outV. В Cypher я бы написал что-то вроде

MATCH (e0: Employee)-[fb: R]-> (e1: Employee)
WITH e0, e1, count(*) AS frequency, min(fb.value) AS min_val
RETURN e0, e1, frequency, min_val

Кто-нибудь может помочь?

Ваше здоровье!


person Alberto    schedule 24.11.2015    source источник


Ответы (1)


Ответил в списке рассылки пользователей Gremlin, но чтобы замкнуть круг, снова повторим обход:

gremlin> g.V().as("e0").outE("e").as("e").inV().as("e1").select("e0","e","e1").
gremlin>       group().by(select("e0","e1").by("name")).
gremlin>               by(fold().match(__.as("x").count(local).as("freq"),
gremlin>                               __.as("x").unfold().select("e").by("value").max().as("max")).select("freq","max")
gremlin>               ).next()
==>{e0=c, e1=d}={freq=1, max=9}
==>{e0=b, e1=d}={freq=1, max=9}
==>{e0=f, e1=h}={freq=1, max=9}
==>{e0=e, e1=h}={freq=1, max=9}
==>{e0=a, e1=b}={freq=2, max=10000}
==>{e0=b, e1=c}={freq=4, max=4}
==>{e0=e, e1=f}={freq=1, max=9}
==>{e0=f, e1=g}={freq=1, max=9}
==>{e0=a, e1=c}={freq=1, max=9}
person Daniel Kuppitz    schedule 26.11.2015
comment
Я только что понял, что это скрипт для подключенного запрос компонентов, не могли бы вы скопировать и вставить другое решение, опубликованное в теме? - person Alberto; 30.11.2015
comment
Привет @Daniel Kuppitz, я наконец-то нашел время, чтобы проверить обход: в моем случае вывод отличается от вашего: я получил ==>{e0=c, e1=d}={{freq=1, max=9}=1} ==>{e0=b, e1=d}={{freq=1, max=9}=1} ==>{e0=f, e1=h}={{freq=1, max=9}=1} ==>{e0=e, e1=h}={{freq=1, max=9}=1} ==>{e0=a, e1=b}={{freq=1, max=10}=1, {freq=1, max=10000}=1} ==>{e0=b, e1=c}={{freq=1, max=0}=1, {freq=1, max=2}=1, {freq=1, max=3}=1, {freq=1, max=4}=1} ==>{e0=e, e1=f}={{freq=1, max=9}=1} ==>{e0=f, e1=g}={{freq=1, max=9}=1} ==>{e0=a, e1=c}={{freq=1, max=9}=1} Похоже, не хватает некоторой агрегации... - person Alberto; 01.12.2015
comment
Я проверяю, что не так. Вы случайно не скопировали и вставили предыдущую версию своего обхода? - person Alberto; 01.12.2015
comment
Похоже, я использовал версию 3.1.x, а вы использовали версию 3.0.x. Вы можете либо увеличить свою версию TP, либо добавить третью версию by(). Что-то вроде .by(limit(1)) или .by {it.head()} должно работать. - person Daniel Kuppitz; 01.12.2015
comment
Я изменил свою версию гремлина. Теперь работает :) Спасибо! - person Alberto; 01.12.2015