我的图表包含一些“ Person”节点,而“ ContributedTo”一些“ Conversations”节点。我想编写一个Gremlin查询,该查询将直接在“ Person”节点之间创建“ TalksWith”边缘。该边缘应包含属性“ countConversations”,以显示这两个人促成多少对话。
是否可以一次对所有“ Person”节点使用一个Gremlin查询呢?
这是我的图形设置(使用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”边缘。
答案 0 :(得分:1)
这里是一种方法:
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]
考虑到您在编写遍历过程中的问题时所提供的信息,我假设您跟踪第5行中的groupCount()
,直到那时为止。Map
v[0]
人与之交谈以及他们交谈的次数。下一行将Map
分解为它的组件条目,并对其进行迭代,为每个addE()
创建一条边。 from
顶点是从原始存储在List
中的“ p”中收集的,而to
是从计数图中的当前键中提取的。然后,“ countConversations”属性从计数图的当前值获取其值。