如何通过inV outV和特定属性删除重复边缘?

时间:2019-03-29 14:29:06

标签: gremlin

我在图形中有重复的边,它们具有相同的inV,outV和某些(但不是全部)属性。我想删除所有重复项之一。

给出以下图形:

g.addV().property(id, '1').
addV().property(id, '2').
addV().property(id, '3').
addV().property(id, '4').
addE('link').property('prop1', 000).property('prop2', 111).from(V('1')).to(V('2')).
addE('link').property('prop1', 000).property('prop2', 112).from(V('1')).to(V('2')).
addE('link').property('prop1', 000).property('prop2', 113).from(V('1')).to(V('2')).
addE('link').property('prop1', 222).property('prop2', 333).from(V('2')).to(V('3')).
addE('link').property('prop1', 222).property('prop2', 334).from(V('2')).to(V('3')).
addE('link').property('prop1', 222).property('prop2', 335).from(V('2')).to(V('3')).
addE('link').property('prop1', 222).property('prop2', 336).from(V('2')).to(V('3')).
addE('link').property('prop1', 333).property('prop2', 444).from(V('2')).to(V('3')).
addE('link').property('prop1', 333).property('prop2', 444).from(V('3')).to(V('4')).
addE('link').property('prop1', 333).property('prop2', 445).from(V('3')).to(V('4')).
addE('link').property('prop1', 333).property('prop2', 446).from(V('3')).to(V('4')).iterate()

我想通过inVoutVprop1删除所有重复项,以便仅保留以下边缘:

addE('link').property('prop1', 000).property('prop2', 111).from(V('1')).to(V('2')).
addE('link').property('prop1', 222).property('prop2', 336).from(V('2')).to(V('3')).
addE('link').property('prop1', 333).property('prop2', 444).from(V('2')).to(V('3')).
addE('link').property('prop1', 333).property('prop2', 446).from(V('3')).to(V('4'))

编辑:为澄清起见,我想通过检查inVoutVprop1对边缘进行重复数据删除,如果所有这些边缘都不止一个匹配3个参数我想保留一个参数并删除其余参数,无论prop2是否唯一。

2 个答案:

答案 0 :(得分:3)

我认为您删除条件的性质(特别是您只想立即drop()遇到的重复项)使我们能够使用Gremlin食谱中所述的Duplicate Edge Detection Pattern的修改。

gremlin> g.V().as('ov').
......1>   outE().as('e').
......2>   inV().as('iv').
......3>   sideEffect(inE().
......4>              where(neq('e')).
......5>              where(eq('e')).by(label).
......6>              where(outV().as('ov')).
......7>              where(eq('e')).by('prop1').drop()).iterate()
gremlin> g.E()
==>e[0][1-link->2]
==>e[3][2-link->3]
==>e[7][2-link->3]
==>e[8][3-link->4]

由于您不关心“检测”重复项(因此不需要分组和计数过滤的开销),因此一般模式会有所不同,您只需关心立即删除符合条件的所有重复项。

这里唯一棘手的事情是,如果您正在使用的特定图形特别渴望评估遍历步骤。换句话说,如果您drop()有一条边,它会立即从第1行和第3行的将来迭代中删除吗?如果没有,那可能会带来一些麻烦。但是,大多数图形都可以按以下说明的方式工作(我在TinkerGraph上进行了测试),因此这种方法可能对您有用。

答案 1 :(得分:1)

g.E().as('e').outV().id().as('ov').
  select('e').inV().id().as('iv').
  select('e').properties('prop1').value().as('p1').
  select('e', 'ov', 'iv', 'p1').
  group().
    by(select('ov', 'iv', 'p1')).
    by(select('e')).
  select(values).as('unique_e').
  V().outE().where(without('unique_e')).drop()