Gremlin - 遍历树图中的叶节点

ind*_*ull 4 gremlin tinkerpop janusgraph

我的图中有树形数据结构,如下图所示。每种颜色代表具有不同标签的节点,其关系如员工 -> 应用程序 -> 项目 -> pv -> 扫描)。

问题#1:

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

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

g.V().has('person', 'id', '0').repeat(__.in('reportsTo')).emit().values('id')
Run Code Online (Sandbox Code Playgroud)

示例图可以在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: []
Run Code Online (Sandbox Code Playgroud)

问题2:

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

在此输入图像描述

ste*_*tte 6

我认为你只需要修改你的emit(). 如果没有参数,那就是说从 中发出所有内容repeat()。如果您只想要叶顶点,则包括类似以下内容:not(outE())基本上表示仅在顶点上没有传出边时才发出,这意味着它是叶顶点。您可能需要使您的特定emit()谓词更加智能,因为您的架构看起来是这样的,不同类型的顶点对于可能使其成为叶子的规则有不同的规则。

鉴于 GremlinBin 中的示例图,我这样做是为了获取上图底部的所有绿色顶点:

g.V().has('employee','id',1).
  repeat(__.in('reportsTo')).emit().
  repeat(out('has')).emit(__.not(outE('has')))
Run Code Online (Sandbox Code Playgroud)

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

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))
Run Code Online (Sandbox Code Playgroud)

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