【问题标题】:Gremlin - Traverse to leaf nodes in tree graphGremlin - 遍历树图中的叶节点
【发布时间】:2018-01-11 15:39:38
【问题描述】:

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

问题 #1:

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

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

g.V().has('person', 'id', '0').repeat(__.in('reportsTo')).emit().values('id')

示例图可以在gremlinbin 中找到。

如何找到所有绿色叶子节点?

更新 #1:

正如 cmets 中提到的,我尝试了树形模式。但它不允许我在树上调用 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) 的绿色顶点。

【问题讨论】:

  • 这些都是扫描。这就是你对“绿色”的定义吗?该扫描列表首先是您输入的一部分。您可以简单地查询顶点的标签。
  • 如果我想找到根目录下的所有扫描节点,这将起作用。但如果我想查找特定员工节点下的所有扫描节点而不仅仅是根节点,它就行不通了。
  • github.com/tinkerpop/gremlin/wiki/Tree-Pattern 可能会帮助你有一个帮助方法来获取叶子。

标签: gremlin tinkerpop janusgraph


【解决方案1】:

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

【讨论】:

  • 我可能还不清楚你在问什么,但我更新了我的答案——这就是你要找的吗?
  • 您的示例查询使我朝着正确的方向前进。我能够提出查询以返回所需的结果。谢谢!我在正文中添加了一个后续问题。如果您能提供一些建议,那就太好了。
  • 我删除了我的第一条评论。我不小心粘贴了带有实际 ID 的查询 :-(
  • 感谢完美,尽管遍历 350K 节点图需要 90 秒。我将不得不研究优化。
  • 我遇到了几乎完全相同的问题,因为“医疗保健提供者网络”拥有“一堆医院”,然后从那里“卫星诊所”的情况,并想从树中的任何一点向下遍历,例如“列出所有设施”和“列出医院管理的诊所”。这解决了同样的问题。在好问题(图形帮助很大)和答案上都 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多