Gremlin-遍历树图中的叶节点

Gremlin-遍历树图中的叶节点,gremlin,tinkerpop,janusgraph,Gremlin,Tinkerpop,Janusgraph,我在图中有树数据结构,如下图所示。每个颜色表示具有不同标签的节点,其关系类似于员工->应用->项目->pv->扫描) 问题1: 我要查找顶部节点0的所有叶节点(绿色的) 我尝试了下面的循环代码,它返回所有带有标签employee的节点。不仅仅是叶节点 g.V().has('person', 'id', '0').repeat(__.in('reportsTo')).emit().values('id') 示例图可在中找到 如何查找所有绿叶节点 更新#1: 正如在评论中提到的,我尝试了树模式。但

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

问题1:

我要查找顶部节点0的所有叶节点(绿色的)

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

g.V().has('person', 'id', '0').repeat(__.in('reportsTo')).emit().values('id')
示例图可在中找到

如何查找所有绿叶节点

更新#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(属性)的绿色顶点


我认为您只需要修改您的
emit()
。没有参数,这意味着从
repeat()
发出所有信息。如果您只需要叶顶点,那么可以包含如下内容:
not(outE())
,它基本上表示只有在顶点上没有传出边时才发射,这意味着它是叶顶点。您可能需要使特定的
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))

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

这些都是扫描。这就是你对“绿色”的定义吗?扫描列表首先是你输入的一部分。你可以简单地查询顶点的标签。如果我想找到根目录下的所有扫描节点,那就可以了。但如果我想在特定的employee节点下查找所有扫描节点,而不仅仅是根节点,那么它将不起作用。可能对您有所帮助有一种获取Leaf的帮助方法。对于您的问题,我可能仍然不清楚,但我更新了我的答案-这就是您要寻找的吗?您的示例查询为我指明了正确的方向。我能够提出查询以返回所需的结果。谢谢我在主体部分增加了一个后续问题。如果你能提供一些建议,那就太好了。我删除了我的第一条评论。我不小心粘贴了一个带有实际id的查询:-(感谢它,虽然遍历350K节点图需要90秒,但效果非常好。我将不得不研究优化。