查询以检查图表中是否存在仅访问过一次边缘的周期

时间:2016-11-18 08:31:24

标签: gremlin graphic tinkerpop

如何编写查询在我的图表上运行,如果没有路径只穿过每个边缘一次并返回起点,则输出'false'。

1 个答案:

答案 0 :(得分:6)

我使用了以下sample graph

g = TinkerGraph.open().traversal()
g.addV().property(id, 'blue').as('b').
  addV().property(id, 'orange').as('o').
  addV().property(id, 'red').as('r').
  addV().property(id, 'white').as('w').
  addE('bridge').from('w').to('b').
  addE('bridge').from('w').to('o').
  addE('bridge').from('w').to('r').
  addE('bridge').from('w').to('r').
  addE('bridge').from('o').to('b').
  addE('bridge').from('o').to('b').
  addE('bridge').from('o').to('r').
  addE('bridge').from('o').to('r').iterate()

以下查询返回第一个可能的路径:

gremlin> g.V().sideEffect(outE("bridge").aggregate("bridges")).barrier().
......1>   repeat(bothE().or(__.not(select('e')),
......2>                     __.not(filter(__.as('x').select(all, 'e').unfold().where(eq('x'))))).as('e').otherV()).
......3>     until(select(all, 'e').count(local).as("c").select("bridges").count(local).where(eq("c"))).limit(1).
......4>   path().by(id).by(constant(" -> ")).map {String.join("", it.get().objects())}
==>orange -> blue -> white -> orange -> red -> white -> red -> orange -> blue

如果您只需要一个布尔值,那么只需附加.hasNext()

g.V().sideEffect(outE("bridge").aggregate("bridges")).barrier().
  repeat(bothE().or(__.not(select('e')),
                    __.not(filter(__.as('x').select(all, 'e').unfold().where(eq('x'))))).as('e').otherV()).
    until(select(all, 'e').count(local).as("c").select("bridges").count(local).where(eq("c"))).hasNext()