Как получить несколько вершин / ребер в одном запросе гремлина?

Я нахожусь в ситуации, когда мне нужно получить два разных типа вершин с помощью одного запроса. Например, предположим, что граф имеет следующую структуру:

Node("User")--Edge("is_member")-->Node("Membership")--Edge("is_member")-->Node("Group")

Предположим, что узлы обладают следующими свойствами:

  1. Membership
    • status
    • Дата
  2. Group
    • name
    • Дата
    • тип

Теперь мне нужно получить все Membership узлы, принадлежащие пользователю is_member, вместе с соответствующими Group узлами name. Как мне написать для этого запрос Gremlin?

Я использую фреймворк Bulbs. Как сохранить результат в объекте Python?


person Kevin    schedule 18.02.2015    source источник
comment
Вы уверены, что вам нужен узел для «членства»? … Для меня это скорее похоже на край. Вы также можете иметь свойства на краях.   -  person Faber    schedule 18.02.2015
comment
@Faber Я чувствовал, что добавление membership в качестве узла может помочь мне позже построить интересные отношения, такие как признание того факта, что пользователь является членом группы, его комментирование и т. Д.   -  person Kevin    schedule 18.02.2015


Ответы (1)


Следующий запрос дает пользователю u1 карту с key = Membership-Nodes и value = list of group names of the key membership node:

m=[:];u1.out('is_member').groupBy(m){it}{it.out('is_member').name}

Выход:

gremlin> m
==>v[m1]=[group1]
==>v[m2]=[group2, group3]

Вот использованный образец графика:

g = new TinkerGraph()
u1 = g.addVertex('u1')
u2 = g.addVertex('u2')
m1 = g.addVertex('m1')
m2 = g.addVertex('m2')
g1 = g.addVertex('g1')
g2 = g.addVertex('g2')
g3 = g.addVertex('g3')

g.addEdge(u1, m1, 'is_member')
g.addEdge(u1, m2, 'is_member')
g.addEdge(u2, m2, 'is_member')
g.addEdge(m1, g1, 'is_member')
g.addEdge(m2, g2, 'is_member')
g.addEdge(m2, g3, 'is_member')

g1.name = 'group1'
g2.name = 'group2'
g3.name = 'group3'

См. Также: Как написать подзапрос?

(проверено с gremlin2)

person Faber    schedule 18.02.2015