Запрос Гремлин: как добавить несколько ребер, которые содержат агрегированную информацию? - PullRequest
0 голосов
/ 29 ноября 2018

Мой график содержит несколько узлов "Person", которые "ContributedTo" для некоторых узлов "Conversations".Я хочу написать запрос Gremlin, который создаст ребра "TalksWith" непосредственно между узлами "Person".Это ребро должно содержать свойство countConversations, которое показывает, сколько разговоров участвовали оба этих человека.

Возможно ли это, используя один запрос Gremlin для всех узлов "Person" одновременно?

Вотмой график настройки (с помощью консоли Gremlin):

g = TinkerGraph.open().traversal()
g.addV("Person").as("p1").
addV("Person").as("p2").
addV("Person").as("p3").
addV("Person").as("p4").
addV("Person").as("p5").
addV("Conversation").as("c1").
addV("Conversation").as("c2").
addV("Conversation").as("c3").
addE("ContributedTo").from("p1").to("c1").
addE("ContributedTo").from("p2").to("c1").
addE("ContributedTo").from("p3").to("c1").
addE("ContributedTo").from("p1").to("c2").
addE("ContributedTo").from("p2").to("c2").
addE("ContributedTo").from("p3").to("c2").
addE("ContributedTo").from("p4").to("c2").
addE("ContributedTo").from("p5").to("c2").
addE("ContributedTo").from("p1").to("c3").
addE("ContributedTo").from("p3").to("c2")

Я хочу создать ребра "TalkedWith", подобные этому

addE("TalkedWith").from("p1").to("p2").property("countConversations",2)

Я написал запрос, чтобы подсчитать, сколько разговоров конкретныйчеловек имел с другими людьми

g.V(0L).out("ContributedTo").in("ContributedTo")
.hasId(without(0L)).groupCount().order(local).by(values,desc).next()

Теперь я хочу выполнить этот расчет для каждого человека и создать ребра "TalksWith".

1 Ответ

0 голосов
/ 03 декабря 2018

Вот один из способов сделать это:

gremlin> g.V(0L).hasLabel('Person').
......1>   store('p').
......2>   out('ContributedTo').
......3>   in('ContributedTo').
......4>   where(without('p')).
......5>   groupCount().
......6>   unfold().
......7>   addE('TalkedWith').from(select('p').unfold()).to(select(keys)).
......8>     property('countConversations',select(values))
==>e[18][0-TalkedWith->1]
==>e[19][0-TalkedWith->2]
==>e[20][0-TalkedWith->3]
==>e[21][0-TalkedWith->4]
gremlin> g.E().hasLabel('TalkedWith').valueMap()
==>[countConversations:2]
==>[countConversations:3]
==>[countConversations:1]
==>[countConversations:1]

Учитывая то, что вы указали в своем вопросе в качестве прогресса в написании этого обхода, я предполагаю, что вы выполните все до groupCount() в строке 5.В этот момент у нас есть Map людей, с которыми v[0] говорили, и количество раз, когда они говорили.Следующая строка деконструирует это Map в его записи компонентов и повторяет их, создавая ребро для каждого с addE().Вершина from берется из "p", где она изначально была сохранена в List, а to извлекается из текущего ключа в карте подсчета.Свойство countConversations затем получает свое значение из текущего значения карты подсчета.

...