我在图形中有重复的边,它们具有相同的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()
我想通过inV
,outV
和prop1
删除所有重复项,以便仅保留以下边缘:
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'))
编辑:为澄清起见,我想通过检查inV
,outV
和prop1
对边缘进行重复数据删除,如果所有这些边缘都不止一个匹配3个参数我想保留一个参数并删除其余参数,无论prop2
是否唯一。
答案 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()