Gremlin - 遍历树图中的叶节点
Gremlin - Traverse to leaf nodes in tree graph
我在图表中有树数据结构,如下图所示。每种颜色代表具有不同标签的节点,其关系如 employee -> app -> project -> pv -> scan)。
问题 #1:
我想找到顶部节点 0 的所有叶节点(绿色的)。
我在下面的代码中尝试了循环,returns 所有节点都带有标签员工。不只是叶节点。
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) 在每个父节点下的子节点中检索子节点?所以在我的示例图中,每个黑色顶点都可以有一个或多个绿色子顶点。我想在每个黑色顶点下找到最大(属性)的绿色顶点。
我认为你只需要修改你的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 -> app -> project -> pv -> scan)。
问题 #1:
我想找到顶部节点 0 的所有叶节点(绿色的)。
我在下面的代码中尝试了循环,returns 所有节点都带有标签员工。不只是叶节点。
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) 在每个父节点下的子节点中检索子节点?所以在我的示例图中,每个黑色顶点都可以有一个或多个绿色子顶点。我想在每个黑色顶点下找到最大(属性)的绿色顶点。
我认为你只需要修改你的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"),然后选择该排序列表中的第一项。