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

Gremlin:从给定顶点查找所有下游(外)路径

狄元魁
2023-03-14

我有一个有向图,有大约1000个顶点和3000条边,其中包含圈。

我试图从给定顶点找到所有下游(外)路径。

使用以下Gremlin查询时

g.V(45712).repeat(out().simplePath()).until(outE().count().is(0)).path()

对于某些路径,由于周期的原因,需要花费很长时间才能得到结果,尽管simplePath步骤应该可以防止这种情况发生。

我尝试优化查询,并使用“聚合”步骤和“不使用”步骤两次遍历同一顶点,但现在跳过了一些顶点。

g.V(45712).repeat(out().where(without('x'))
.aggregate(Scope.local,'x'))
.until(outE().count().is(0))
.path()

谢谢

共有1个答案

钱震博
2023-03-14

如果您的数据高度关联,这可能是一个昂贵的查询。即使是一个小图。我见过人们使用约束来尝试限制搜索的总量。这些可能包括使用timeloops来设置最大搜索深度。即使使用我的航线数据集,它实际上是一个相当小的图表,该查询也可能产生非常大的结果集。与其说你的Gremlin是错的,不如说是取决于顶点的连接程度。

通常,从给定的起点搜索所有路径可能是一个代价高昂的查询。

 类似资料:
  • 如何在Gremlin查询中检索从根顶点开始的所有顶点属性? 我们有以下结构: 根顶点:Employee 边缘:EdCompany,EdDepartment,EdRole顶点:公司,部门,角色 我们试图接收与根顶点连接的其他顶点的数据。有人这样想: 我们尝试了该查询,但返回了一个复杂的JSON: 编辑: 我们还尝试了Kelvin建议的查询: 堆栈跟踪:提交查询失败:g.V().hasLabel(“E

  • 我只是在玩Cosmos DB中的Graph API,它使用Gremlin语法进行查询。 我在图中有许多用户(顶点),每个用户对其他用户都有“知道”的属性。其中一些是外边缘(outE),另一些是内边缘(inE),具体取决于关系的创建方式。我现在尝试创建一个查询,该查询将返回给定用户(顶点)的所有“已知”关系。我可以通过以下方式轻松获取inE或outE的ID: 其中是我正在查询的用户的ID,但我无法提

  • 我是gremlin查询的新手。我有一个如下图,我的源顶点是P3,我想编写一个查询,它将获取所有父\祖先顶点(如果有一条从该顶点到P3的路径,其边缘类型为“包含”)类型为“部分”,并与它们关联一个Owner。所以在这种情况下,查询应该返回P1和P2,而不是P。 查询以创建样本数据: 这是我提出的查询,但遍历一旦找到一个具有相关所有者顶点的零件顶点,就会停止。如何更新它以返回P1和P2。 我还尝试了使

  • 下面的堆栈溢出问题 我尝试了在语句中使用两个重复的多个构造,但无法为每个起始顶点获得独立的。我也在使用平台,因此它限制了Gremlin的使用,其中不允许使用循环/脚本。所有gremlin查询必须以并由与链接在一起的命令组成 https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.ht

  • 给定一个有向图,什么是只访问图的每个顶点一次的算法。这和哈密顿循环不同,我不要求路径在同一个顶点开始和结束。 回溯算法脑海中浮现的一种算法是回溯,使用递归实现,在每一步中,您都会探索所有可能的连接/路径,并保留一个布尔访问数组,以确保没有顶点被多次访问。当向后回溯时,该布尔值将设置为false(回溯中的关键步骤)。基本情况是比较访问的顶点数,并查看它是否与图中的节点数匹配,在这种情况下,它将返回t

  • 我需要从一个顶点开始,找到所有相关的顶点,直到结束。标准是匹配边inV顶点中的任何一个边属性(属性)。如果边缘属性“value”与inV顶点“attribute”名称不匹配,我应该跳过该顶点。边的属性值作为属性名称传播到inV顶点中 我使用下面的查询,但这给了我父节点、下一个节点和之间的边的json输出。通过输出am写入逻辑,仅拾取与边缘属性匹配的下一个属性。如果属性匹配可以通过gremlin查询