我需要有关Gremlin查询的帮助,该查询可以输出与一个特定顶点A相关的所有顶点及其与级联相关的顶点(即与A直接或间接相关的所有顶点)。
例如,在图中
A -> B -> C
D
在A上运行此查询将给我B和C。
我目前的解决方案很丑:
g.V('A').both(); g.V('A').both().both();
等
任何帮助将不胜感激。
答案 0 :(得分:3)
您的解决方案并不难看;它只缺少一点迭代和退出条件。
您需要最大深度吗?根据图形的形状,您要执行的查询可能返回该图形的所有顶点。
假设在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的基本步骤和概念。