如何选出出顶点满足指定条件的边?Gremlin转Gremlinq查询求助
问题背景
你需要实现的原生Gremlin查询逻辑如下,目标是查询名为Studio的Resource分配给指定用户时,关联的IsAssignedTo边的角色编码:
g.V().hasLabel('Resource').has('name', 'Studio') .inE("IsAssignedTo") .as("roles") .outV().has("User", "name", "Jon Doe").as("user") .select("roles")
你当前编写的Gremlinq实现存在遍历路径错误,无法返回正确结果,错误代码如下:
await _qs.V<T>(itemNode.Id!) .In<IsAssignedTo>() .OfType<User>() .Where(u => u.UserId == userId) .As((_, user) => _.OutE<IsAssignedTo>() .As((_, assignment) => _.Select(assignment))) .Values(a => a.RoleCode) .ToArrayAsync();
错误原因
- 遍历方向和路径完全偏离原生逻辑:原生逻辑是从Resource顶点出发,先取所有入方向的
IsAssignedTo边暂存,再从边走到关联的出顶点(即分配的用户)做筛选,最后回选之前暂存的边。你的实现是从Resource走到关联用户后,又从用户顶点出发找出方向的IsAssignedTo边,相当于查询用户分配出去的权限,和目标逻辑完全相反。 - 别名作用域使用错误:
As标记的步骤别名需要在后续遍历完成后回选,你嵌套的别名逻辑没有对应正确的遍历层级。
正确实现代码
await _qs.V<Resource>() // 若已提前拿到Resource的Id,替换为.HasId(itemNode.Id!)即可,无需按名称筛选 .Where(r => r.Name == "Studio") // 取Resource入方向的分配边 .InE<IsAssignedTo>() // 将边标记为roles,后续遍历校验关联用户 .As((_, roles) => _ // 从边走到关联的出顶点(分配主体) .OutV() // 筛选匹配目标用户 .OfType<User>() .Where(u => u.UserId == userId) // 校验通过后回选之前标记的roles边 .Select(roles) ) // 取边上的RoleCode属性返回 .Values(role => role.RoleCode) .ToArrayAsync();
实现说明
- 如果你已经持有目标Resource的Id,直接把
.Where(r => r.Name == "Studio")替换为.HasId(itemNode.Id!)即可匹配你原来的入参逻辑。 - 不需要为User顶点额外设置别名,因为最终返回值只需要边的RoleCode属性,只要遍历路径能匹配到目标用户,之前暂存的边就会被正确选中返回。
内容的提问来源于stack exchange,提问作者Jijo
相关产品推荐
相关产品推荐

