TinkerPop: многоуровневый поиск по нескольким типам вершин - PullRequest
0 голосов
/ 26 мая 2018

Пример графика : Тинкер Модерн

Запрос : Найти всех прямых друзей (person Вершина) Марко и (союза)все software во втором прыжке.


Неудачные попытки:

Общий запрос для людей первого уровня:

g.V(1).hasLabel("person").repeat(both()).times(1).emit(hasLabel("person")).hasLabel("person").values("name")

Общий запрос для программного обеспечения второго уровня / прыжка:

g.V(1).hasLabel("person").repeat(both()).times(2).emit(hasLabel("software")).hasLabel("software").values("name")

Попытка объединить два запроса:

g.V(1).hasLabel("person").repeat(both()).times(1).emit(hasLabel("person")).hasLabel("person").repeat(both()).times(2).emit(hasLabel("software")).hasLabel("software").values("name")

Я действительно не понимал, как работает объединение, потому что это не объединение данных.

g.V(1).union().V(2)
g.V(1).union(V(2))

Лучшее, что я получил до сих пор, но я хочу, чтобы у меня была некоторая способность делать это (Марко подключен к человеку И / ИЛИ Марко подключенна программное обеспечение):

gremlin> g.V(1).store('x').V(2).store('y').cap('x', 'y')
==>[x:[v[1]],y:[v[2]]]

1 Ответ

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

Это для первого уровня:

gremlin> g.V(1).hasLabel("person").as("from", "to1", "to2")
            .repeat(both()).times(1).emit(hasLabel("person")).hasLabel("person").as("to1")
            .select("from")
            .repeat(both()).times(1).emit(hasLabel("software")).hasLabel("software").as("to2")
            .project("from", "person", "software")
            .by(select("from").by("name"))
            .by(select("to1").by("name"))
            .by(select("to2").by("name"))

Результат:

==>[from:marko,person:vadas,software:lop]
==>[from:marko,person:josh,software:lop]

Для многоуровневого увеличения значения times

...