当前位置: 首页 > 知识库问答 >
问题:

小精灵查询:如何添加包含聚合信息的多条边?

冀望
2023-03-14

我的图包含一些“个人”节点,这些节点“参与”了一些“对话”节点。我想编写一个小精灵查询,它将直接在“Person”节点之间创建“TalksWith”边缘。该边缘应包含一个属性“countConversations”,显示这两个人参与了多少对话。

这是否可能同时对所有“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个答案

容修贤
2023-03-14

有一种方法可以做到这一点:

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()的所有内容。在这一点上,我们有一个与之交谈的人的地图,以及他们交谈的次数。下一行将映射分解为其组件条目,并用addE()迭代它们,为每个条目创建一条边。从“p”收集顶点,其原始存储在列表中,从计数映射中的当前键提取到。然后,“countConversations”属性从count映射的当前值中获取其值。

 类似资料:
  • 我想用JPA编写以下查询,以检索按和分组的指令的计数。我知道以下SQL可以工作: 我想从这个查询中获取结果,并将其映射到一个新的对象调用: 问题所在

  • 我的场景是在单个查询中在顶点之间添加多条边: 假设下面的节点:这些是我拥有的标签和ID 用户: 4100 歌曲: 4200 4355 4676 我必须在这些顶点之间建立边 我们通常可以通过在节点之间创建单条边来实现。如果我们想一次在50多个顶点之间创建边,这不是一种有效的方法。我正在使用Tinkerpop 3.0.1。

  • >[danger] 注意!!! 使用聚合功能时,必须给它一个别名,以便能够从模型中访问它 > 聚合函数的计算,都是排除了 null 值,所以COUNT( id ) 一般推荐用非空的主键来计算 COUNT 计算数量 const { Sequelize } = app; // 查询班级总人数,按照姓名聚合 const ret = await Student.findAll({ attribut

  • 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 方法 说明 count 统计数量,参数是要统计的字段名(可选) max 获取最大值,参数是要统计的字段名(必须) min 获取最小值,参数是要统计的字段名(必须) avg 获取平均值,参数是要统计的字段名(必须) sum

  • 我刚刚为游戏塑造了我的角色,这是一个box2d动态身体: 可以给身体添加纹理或精灵吗?或者我把精灵的位置和我身体的位置一样?因此,它将覆盖身体的形状,并像实际的box2d身体一样移动。

  • 我不确定是否有比user order by和rownum(在Oracle中)更优雅的方法来解决这个问题,但下面是: 我有一张桌子(叫做winner): 房屋是指房屋面积(平方米)。 我需要一个查询(没有子查询)来找到“获胜者”(名称,但行可以包含更多列)。“获胜者”定义如下: 工资最低 (如系:)有最小的房子 (在另一种情况下:)有最多的孩子 在这个例子中,获胜者是乔,他挣2000英镑,房子大小为