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

时间:2018-01-11 15:39:38

标签: gremlin tinkerpop janusgraph

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

问题#1:

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

我尝试使用循环下面的代码,返回带有标签employee的所有节点。不只是叶子节点。

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(property)的绿色顶点。

enter image description here

1 个答案:

答案 0 :(得分:2)

我认为您只需修改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”)对它们进行排序,然后选择该有序列表中的第一个项目。