TinkerPop: фильтр по количеству ребер - PullRequest
0 голосов
/ 30 апреля 2018

Пример данных: 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")

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


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

enter image description here

1 Ответ

0 голосов
/ 05 мая 2018

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

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

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

...