提问者:小点点

Gremlin - 遍历树形图中的叶节点


我有如下图所示的树状数据结构。每种颜色代表带有不同标签的节点

问题#1:

我想找到顶部节点0的所有叶节点(绿色的)。

我尝试了下面的代码,该循环返回所有带有标签员工的节点。不仅仅是叶节点。

g.V().has('person', 'id', '0').repeat(__.in('reportsTo')).emit().values('id')

示例图可以在gremlinbin中找到。

如何找到所有绿叶节点?

更新#1:

正如在评论中提到的,我尝试了树模式。但它不允许我在树上调用getLeafObjects()。不确定缺少了什么。同样,我只能创建员工节点树。如何遍历扫描节点?

> tree = g.V().has('person', 'id', '0').repeat(__.in('reportsTo')).emit().tree()
>  tree.getLeafObjects()
No signature of method: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.getLeafObjects() is applicable for argument types: () values: []

问题#2:

如何根据max(id)在每个父级下的子级中检索子顶点?所以在我的示例图中,每个黑色顶点可以有一个或多个绿色子顶点。我想找到每个黑色顶点下具有max(属性)的绿色顶点。


共1个答案

匿名用户

我认为您只需要修改您的< code>emit()。如果没有参数,就是说从< code>repeat()中发出所有内容。如果您只想要叶顶点,那么包括如下内容:< code>not(outE())基本上是说,如果顶点上没有传出边,则仅发射,这意味着它是叶顶点。您可能需要使您的特定< code>emit()谓词更智能一些,因为看起来您的模式是这样的,不同类型的顶点对于什么可能使它成为叶子有不同的规则。

鉴于您在 GremlinBin 中拥有的示例图表,我这样做是为了获得上面图片底部的所有绿色顶点:

g.V().has('employee','id',1).
  repeat(__.in('reportsTo')).emit().
  repeat(out('has')).emit(__.not(outE('has')))

在回答您的第二个问题时,您可以将上述内容扩展到:

g.V().has('employee','id',1).
  repeat(__.in('reportsTo')).emit().
  repeat(out('has')).emit(__.not(outE('has'))).
  group().
    by(__.in('has')).
  select(values).
  unfold().
  order(local).
    by('id',decr).
  local(unfold().limit(1))

基本上,将叶顶点分组回它们的父顶点,然后弹出值,即每个父顶点的叶列表。用展开()展平那些,并按您关心的属性(在本例中为“id”)对它们进行排序,然后选择该排序列表中的第一项。