您的图表似乎并未表明双向边缘是可能的,因此我将牢记这一假设.这是一个简单的示例图-请考虑包括一个有关未来问题的图,因为它比图片和文字描述容易得多,对于那些阅读您的问题的人来说,理解并开始编写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('a').to('b').
addE('knows').from('a').to('c').iterate()
因此,您可以看到顶点“ a”具有到“ b”的两个出射边和到“ c”的一个出射边,因此我们应该得到“ a b”顶点对.一种实现方法是:
gremlin> g.V().as('out').out().as('in').
......1> select('out','in').
......2> groupCount().
......3> unfold().
......4> filter(select(values).is(gt(1))).
......5> select(keys)
==>[out:v[a],in:v[b]]
上面的遍历使用groupCount()来计算“出”和“入”标记的顶点出现的次数(即它们之间的边数).它使用unfold()遍历< Vertex Pairs,Count>的映射. (或更确切地说是< List< Vertex>,Long>)并滤除计数大于1的那些(即多个边).最终的select(keys)删除了“ count”,因为它不再需要了(即,我们只需要保存顶点对的键即可得到结果).
也许另一种方法是使用这种方法:
gremlin> g.V().filter(outE()).
......1> project('out','in').
......2> by().
......3> by(out().
......4> groupCount().
......5> unfold().
......6> filter(select(values).is(gt(1))).
......7> select(keys)).
......8> select(values)
==>[v[a],v[b]]
这种使用project()的方法放弃了整个图上对大groupCount()的更大内存需求,转而在单个顶点上构建一个较小的Map,从而可以在by()的末尾(或基本上每个初始顶点已处理).