【问题标题】:What is the Gremlin query that can get me all the vertices either directly or indirectly connected to one specific vertex什么是 Gremlin 查询可以让我直接或间接连接到一个特定顶点的所有顶点
【发布时间】:2018-07-19 00:16:24
【问题描述】:

我需要有关 Gremlin 查询的帮助,该查询可以输出与一个特定顶点 A 相关的所有顶点及其级联相关顶点(这意味着所有与 A 直接或间接相关的顶点)。

例如,在图表中

A -> B -> C
D

在 A 上运行此查询将得到 B 和 C。

我现在的解决方案是一个丑陋的解决方案:

g.V('A').both(); g.V('A').both().both();

任何帮助将不胜感激。

【问题讨论】:

  • 不确定为什么这被否决了。赞成,因为这是一个有效的问题。

标签: azure-cosmosdb gremlin


【解决方案1】:

您的解决方案并不难看;它只是缺少一点迭代和退出条件。

您需要最大深度吗?根据图表的形状,您要执行的查询可能会返回该图表的所有顶点。

假设在 Gremlin 控制台中创建了一个玩具现代 TinkerGraph:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

这个查询可能会有所帮助:

gremlin> g.V(1).repeat(both().simplePath()).emit().times(3).dedup()
==>v[3]
==>v[2]
==>v[4]
==>v[6]
==>v[5]

“从 id=1 的顶点开始,在所有方向上遍历图,最大深度为 3,同时丢弃以前访问过的路径。emit() 步骤确保沿途找到所有遍历的顶点,并且不只是叶子,还会被退回。”

您很有可能想弄清楚哪些顶点仅通过特定边链接到该顶点。在这种情况下,您可以将标签传递给 both() 步骤,和/或链接一些过滤器。

在开发查询时,请随意链接path() 步骤以更好地理解输出。

gremlin> g.V(1).repeat(both().simplePath()).emit().times(3).dedup().path()
==>[v[1],v[3]]
==>[v[1],v[2]]
==>[v[1],v[4]]
==>[v[1],v[3],v[6]]
==>[v[1],v[4],v[5]]

还有其他方法可以解决此问题,但此查询应该可以帮助您开始并熟悉基本的 Gremlin 步骤和概念。

【讨论】:

  • 非常感谢!我使用的 Gremlin Graph Explorer 似乎不支持 repeat() 步骤(每次加载图表都需要很长时间),但您的查询解决了网络上的问题。
  • 很高兴听到这个消息!不要忘记将答案标记为已接受,因为它对您有用。
  • 只是想知道,是否可以避免 repeat() 步骤并且仍然优雅地解决问题?或者有什么方法可以让我们不必在每次使用 both() 时都输入 A?
  • 我不认为你可以在这里真正避免repeat() - 在 Gremlin 术语中这样做没有什么不雅的(这种方式支持 do/while 或 while/do 语义)。对于问题 #2,如果我理解你的话,你可以将一个变量传递给 g.V(some_value).repeat(...). 或者使用 g.V().has("name", some_unique_name) 作为起点
  • 嗨,很抱歉这么晚才回复。我正在使用 Gremlin Graph Explorer 从 Azure Cosmos Db 读取和可视化地图,我只是发现它不支持 repeat() 步骤和 subgraph() 步骤和 next() 步骤。改写我的第二个问题,有没有办法让变量 a = g.V('id') 使用户不需要为我的示例 .both.both 输入一次又一次地输入 id?
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多