当前位置: 首页 > 知识库问答 >
问题:

具有父子关系的Gremlin递归图遍历

华懿轩
2023-03-14

我只想遍历一棵树并聚合父树及其直接子树。我该如何使用Gremlin将其聚合到({parent1,child},{child,child1}…}的结构列表数组中

在这种情况下,我想输出[{0,1},{0,2},{1,8}{1,6},{2,7},{2,9},{8,16},{8,14},{8,15},{7,17}}

订单并不重要。此外,请注意,我希望避免仅在同一节点上存在的任何圆形边(从子顶点到父顶点不可能存在圆形循环

每个顶点都有一个标签城市,每个边都有一个标签高速公路

g.V().hasLabel("city").toList().map(x->x.id()+x.edges(Direction.OUT,"highway").collect(Collectors.toList())

我的查询超时了,我想知道是否有更快的方法来实现这一点。我有5000个顶点,两个顶点只与一条边相连。

共有1个答案

冀冯浩
2023-03-14

您可以使用Gremlin树步骤接近您想要的内容,同时也可以避免Groovy闭包。假设以下设置:

gremlin> g = traversal().withGraph(TinkerGraph.open())
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]   

g.addV('0').as('0').
  addV('1').as('1').
  addV('2').as('2').
  addV('6').as('6').
  addV('7').as('7').
  addV('8').as('8').
  addV('9').as('9').
  addV('14').as('14').
  addV('15').as('15').
  addV('16').as('16').
  addV('17').as('17').
  addE('route').from('0').to('1').
  addE('route').from('0').to('2').
  addE('route').from('1').to('6').
  addE('route').from('1').to('8').
  addE('route').from('2').to('2').
  addE('route').from('2').to('9').
  addE('route').from('2').to('7').
  addE('route').from('7').to('17').
  addE('route').from('8').to('14').
  addE('route').from('8').to('15').
  addE('route').from('8').to('16').iterate() 

可以编写查询以返回树(负周期),如下所示:

gremlin> g.V().hasLabel('0').
......1>   repeat(out().simplePath()).
......2>   until(__.not(out())).
......3>   tree().
......4>     by(label)   

==>[0:[1:[6:[],8:[14:[],15:[],16:[]]],2:[7:[17:[]],9:[]]]] 

另一种方法也可以避免使用闭包:

gremlin> g.V().local(union(label(),out().simplePath().label()).fold())

==>[17]
==>[0,1,2]
==>[1,6,8]
==>[2,9,7]
==>[6]
==>[7,17]
==>[8,14,15,16]
==>[9]
==>[14]
==>[15]
==>[16]          

可以进一步改进以避免仅使用叶子节点:

gremlin> g.V().local(union(label(),out().simplePath().label()).fold()).where(count(local).is(gt(1)))

==>[0,1,2]
==>[1,6,8]
==>[2,9,7]
==>[7,17]
==>[8,14,15,16] 

在代码中,您可以创建最后一对,或者扩展小精灵以进一步分解结果。希望这些方法能证明比依赖闭包(闭包对于其他不支持内嵌代码的TinkerPop实现来说不是很好移植)更有效。

 类似资料:
  • 问题内容: Book,User和Review说,我正在构建具有复杂模型的应用程序。 评论包含书籍和用户ID。为了能够搜索至少包含一个评论的“图书”,我已将“图书”设置为“评论”的父级,并且具有这样的路由。但是,我还需要找到撰写包含某些短语的评论的用户。 是否可以同时将书和用户作为评论的父级?有没有更好的方法来处理这种情况? 请注意,我无法更改数据建模的方式/不愿意这样做,因为数据已从持久性数据库传

  • 问题内容: 我有一个类似(简化)的表结构: 内容 content_has_content topic_has_content 任何主题都可以具有多个“内容”,任何“内容”都可以具有多个“子内容”(内容实例)。对于给定的id_topic,我想从链接的内容,子内容,子内容的子内容等中接收所有my_string1的列表。 我了解“ WITH”不适用于mysql,但找不到很好的递归替代方法。 谢谢丹尼尔

  • 首先,这是我的实体。 玩家: 团队: 正如已经说明的许多主题一样,您可以通过Jackson以多种方式避免WebService中的StackOverflow Exeption。 这很酷,除了JPA之外,在序列化之前,所有的实体都可以无限递归地构造另一个实体。这只是丑陋的ans请求需要更长的时间。检查这个截图:IntelliJ调试器 有办法解决吗?知道我希望根据endpoint获得不同的结果。示例:

  • 问题内容: 我们有一个带有父子关系的表,希望对它进行排序。排序标准是这样的,以便在遍历结果时,与父ID匹配的行应该已经存在: 问题在于两个密钥都是字符串,因此按ID或PARENT_ID排序将无法解决问题。 问题答案: 对于Oracle,使用分层查询:

  • 问题内容: 如何使用pathlib递归遍历给定目录的所有子目录? 似乎只迭代给定目录的直接子级。 我知道这可以通过或使用,但是我想使用pathlib,因为我喜欢使用path对象。 问题答案: 您可以使用对象的方法:

  • 我有一个场景,需要在一种情况下加载所有子值,在另一种情况下加载一些特定的子值。我对这两种情况都使用一个bean,并使用命名查询编写查询。 现在在我的查询2中,我只需要加载字符串A,而不需要加载字符串B和字符串C。我试过使用 但得到以下错误 那么,关于如何继续这方面的任何建议。。