TinkerPop: фильтр по количеству граней

Примеры данных: TinkerPop Modern

Резюме: Я хочу найти людей, которые создали 2 программы.

Я начал с основ и правильно подсчитал

g.V().hasLabel("Person").as("from" ,"to1" )
.repeat(bothE().as("e1").otherV().as("to1").dedup("from", "to1")).times(1)
.emit(filter(hasLabel("Software"))).hasLabel("Software")
.group().by(select("from").by("name")).by(count()).as("c")

Результат:

>> {'Marko': 1, 'Peter': 1, 'Josh': 2}

Итак, я попытался применить фильтр, но он не работает (т.е. результат неверен), что я пробовал:

g.V().hasLabel("Person").as("from")
.repeat(bothE().as("e1").otherV().as("to1").dedup("from", "to1")).times(1)
.filter(bothE().otherV().hasLabel("Software").count(local).is(eq(1)))
.dedup()
.values("name")

Есть идеи, что я делаю не так?


Пример данных:

введите описание изображения здесь


person Srinath Ganesh    schedule 30.04.2018    source источник


Ответы (1)


Если вам нужны только «личные» вершины по количеству ребер, я действительно не понимаю, зачем вам нужна вся эта repeat() инфраструктура. Это просто:

gremlin> g.V().hasLabel('person').
......1>   filter(outE('created').limit(2).count().is(2))
==>v[4]

Вам нужно только подсчитать исходящие ребра, потому что схема такова, что метка «созданная» подключается только к «программному обеспечению», поэтому вам не нужно проверять метку вершины «программное обеспечение». Вы limit(2) должны как можно скорее выйти из итерации ребер, но не раньше, чем у вас появятся 2 ребра, которые вы пытаетесь подсчитать.

person stephen mallette    schedule 05.05.2018
comment
повторение было для случая использования, например, люди- ›сервер-› ОС, и поиск, как людей, использующих более двух ОС. - person Srinath Ganesh; 05.05.2018
comment
ваш запрос работает, пытаясь приспособить его к случаю многоскачкового поиска - person Srinath Ganesh; 05.05.2018