计算从给定顶点到多向图中每个邻居的传入和传出边缘

时间:2019-04-11 23:08:30

标签: graph graph-databases gremlin tinkerpop3

我正在尝试查找一个查询,该查询将使我能够获得多图中某个顶点的传入和传出顶点的组计数。

enter image description here

根据上图的V [0],我们应获得:

[V [0],V [1],传入:2,传出:0]

[V [0],V [2],传入:1,传出:0]

[V [0],V [3],传入:0,传出:1]

1 个答案:

答案 0 :(得分:1)

在询问有关Gremlin的问题时,图片和图形描述很好,但是创建一些示例数据的Gremlin脚本甚至更好:

g = TinkerGraph.open().traversal()
g.addV('node').property(T.id,0).as('0').
  addV('node').property(T.id,1).as('1').
  addV('node').property(T.id,2).as('2').
  addV('node').property(T.id,3).as('3').
  addE('link').from('1').to('0').
  addE('link').from('1').to('0').
  addE('link').from('0').to('3').
  addE('link').from('2').to('0').iterate()

这是执行此操作的一种方法:

gremlin> g.V(0).bothE().
......1>   group().
......2>     by(union(inV(),outV()).fold()).
......3>     by(fold().
......4>        project('incoming','outgoing').
......5>          by(unfold().inV().hasId(0).count()).
......6>          by(unfold().outV().hasId(0).count()))
==>[[v[0],v[1]]:[incoming:2,outgoing:0],[v[0],v[2]]:[incoming:1,outgoing:0],[v[3],v[0]]:[incoming:0,outgoing:1]]

基本上,我们通过与其关联的入/出顶点(第2行-即group()形成的{/ {1}}的入/出)来List减少每个边,每个顶点对收集(从第3行开始)。 reduce操作仅使用union().fold()创建一个列表,然后使用fold()使用“ incoming”和“ outgoing”键(即这些键的值)将project()转换为List在以下各个Map调制器中定义(即展开边列表,适当过滤顶点“ 0”和by())。