gpt4 book ai didi

Gremlin - 遍历 TreeMap 中的叶节点

转载 作者:行者123 更新时间:2023-12-04 13:22:38 25 4
gpt4 key购买 nike

我在图中有树数据结构,如下图所示。每种颜色代表具有不同标签的节点,其关系如employee -> app -> project -> pv -> scan)。

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

enter image description here

最佳答案

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

关于Gremlin - 遍历 TreeMap 中的叶节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48210787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com