Gremlin 如何按inV outV和特定属性删除重复边?

Gremlin 如何按inV outV和特定属性删除重复边?,gremlin,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')). a

我在图中有重复的边,它们有相同的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是否唯一。

我认为您的删除标准的性质,您只想立即删除您遇到的重复项,这允许我们使用Gremlin配方中描述的修改

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()
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]
一般模式会发生偏差,因为您不关心检测重复项,因此不需要花费分组和计数筛选的费用,您只需要关心立即删除符合条件的任何重复项


这里唯一可能棘手的事情是,如果您正在使用的特定图形特别热衷于评估遍历步骤。换句话说,如果删除一条边,它是否会立即从第1行和第3行中的未来迭代中删除?如果没有,那可能会带来一些麻烦。然而,大多数图形都会像下面我在TinkerGraph上测试的那样工作,所以这种方法可能适合您。

我认为您的删除标准的性质,特别是您只想立即删除您遇到的重复项,允许我们对Gremlin配方中描述的进行修改

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]
一般模式会发生偏差,因为您不关心检测重复项,因此不需要花费分组和计数筛选的费用,您只需要关心立即删除符合条件的任何重复项


这里唯一可能棘手的事情是,如果您正在使用的特定图形特别热衷于评估遍历步骤。换句话说,如果删除一条边,它是否会立即从第1行和第3行中的未来迭代中删除?如果没有,那可能会带来一些麻烦。但是,大多数图形都会像下面所示那样工作,我在TinkerGraph上测试过,所以这种方法可能适合您。

我无法从您的预期结果中检测到模式,关于删除属性的确切决策标准是什么?所以我想检查每个节点,获取它们的所有边,检查inV、outV和prop1是否有多条相同的边,如果它们相同,则保留一条并删除其余的边,无论prop2是否唯一。我无法从预期结果中检测到模式,删除属性的确切决策标准是什么?因此我想检查每个节点,获取它们的所有边,检查inV、outV和prop1是否有多条相同的边,如果它们相同,则保留一条并删除其余边,无论prop2是否唯一。哇,非常感谢!对于选择重复的值,我几乎有相同的方法,但我不知道如何在不删除所有边的情况下进行删除。令人惊叹的哇,非常感谢!对于选择重复的值,我几乎有相同的方法,但我不知道如何在不删除所有边的情况下进行删除。令人惊叹的谢谢你的回复,虽然我在制作中使用了亚马逊海王星,但不幸的是它不支持副作用功能。我在海王星的小图中测试了上面的答案,它确实起了作用,我不知道它在更大的图中会起什么作用。你可以用本地或地图来代替-应该起到类似的作用。我认为,与其他答案相比,这种方法的性能会更好,因为您不必构建映射,然后重申V。但我认为,如果您在全局检测重复项,这两种方法都将是昂贵的/不可能的遍历。理想情况下,您可能希望使用基于OLAP的Gremlin和Spark来帮助解决这个问题,但我不确定Neptune是否支持这一点。另一方面,如果你对一组已知的有重复问题的顶点在本地执行这种遍历,那么我怀疑它会更容易管理。啊,有趣的是,好吧,我会在本地进行尝试。是的,我也担心它将不可能在实际的数据集上运行,至少是整个事情,是的,海王星不支持OLAP。我希望我能够足够地约束遍历,以便我可以分多个步骤完成。确实比我的要优雅得多。谢谢你的回复,尽管我在生产中使用了Amazon Neptune,但不幸的是它不支持副作用功能。我在海王星的小图中测试了上面的答案,它确实起了作用,我不知道它在更大的图中会起什么作用。你可以用本地或地图来代替-应该起到类似的作用。我认为,与其他答案相比,这种方法的性能会更好,因为您不必构建映射,然后重申V。但我认为,如果您是全局检测的,这两种方法都将是昂贵的/不可能的遍历
g重复。理想情况下,您可能希望使用基于OLAP的Gremlin和Spark来帮助解决这个问题,但我不确定Neptune是否支持这一点。另一方面,如果你对一组已知的有重复问题的顶点在本地执行这种遍历,那么我怀疑它会更容易管理。啊,有趣的是,好吧,我会在本地进行尝试。是的,我也担心它将不可能在实际的数据集上运行,至少是整个事情,是的,海王星不支持OLAP。我希望我能够足够地约束遍历,这样我就可以在多个步骤中完成它。确实比我的要优雅得多