Gremlin:如何检查添加边是否会导致循环
Gremlin: How to check if adding an edge would result in a cycle
给定一张图,例如:
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();
我想在不实际添加边的情况下了解这个循环(这样我就可以防止循环)。
想到的一个想法是检查从 'a' 到 'c' 的路径是否已经存在,如果不存在,则添加边。使用一个 coalesce
步骤,它里面的第一个遍历 returns 结果将被接受。因此,如果找到 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]
给定一张图,例如:
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();
我想在不实际添加边的情况下了解这个循环(这样我就可以防止循环)。
想到的一个想法是检查从 'a' 到 'c' 的路径是否已经存在,如果不存在,则添加边。使用一个 coalesce
步骤,它里面的第一个遍历 returns 结果将被接受。因此,如果找到 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]