首页 > 解决方案 > Gremlin:如何检查添加边缘是否会导致循环

问题描述

给定一个图表,例如:

g.addV().property(id,'a').as('a').
  addV().property(id,'b').as('b').
  addV().property(id,'c').as('c').
  addE('knows').from('a').to('b').
  addE('knows').from('b').to('c').iterate();

如何检测添加边缘会导致循环?例如,以下操作会引入一个循环:

g.addE('knows').from('c').to('a').iterate();

我想知道这个循环而不实际添加边缘(所以我可以防止循环)。

标签: gremlintinkerpop3

解决方案


想到的一个想法是检查从“a”到“c”的路径是否已经存在,只有在不存在时才添加边。使用一个coalesce步骤,它内部的第一个返回结果的遍历将被兑现。因此,如果V('c')找到到的路径,则将返回该顶点。否则将创建并返回新边。希望即使您最终需要这种方法的变体,这也可以为您提供一些工作。

gremlin>  g.V('a').
......1>   coalesce(
......2>     repeat(out()).until(hasId('c')),
......3>     addE('knows').from(V('c')).to(V('a')))
==>v[c]      

推荐阅读