Как удалить дубликаты ребер по inV outV и конкретным свойствам? - PullRequest
1 голос
/ 29 марта 2019

У меня есть дубликаты ребер в графе, которые имеют одинаковые 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, если есть более одного ребра со всеми этими тремя параметрами, которые я хочу сохранить один и удалите остальные, независимо от того, является ли prop2 уникальным или нет.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2019

Я думаю, что характер ваших критериев удаления (в частности, то, что вы просто хотите немедленно 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]

Общий шаблон отклоняется, так как вам не нужно «обнаруживать» дубликаты (таким образом, затраты на группировку и фильтрацию количества не нужны), вы просто заботитесь о немедленном отбрасывании любых дубликатов, которые соответствуют вашим критериям.

Единственная вещь, которая может быть хитрой, это то, что конкретный график, который вы используете, особенно заинтересован в оценке шагов обхода. Другими словами, если вы drop() ребро, оно сразу удаляется из будущей итерации в строках 1 и 3? Если нет, это может означать некоторые проблемы. Однако большинство графиков работают, как показано ниже (я тестировал на TinkerGraph), поэтому, возможно, этот подход будет работать для вас.

1 голос
/ 01 апреля 2019
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()
...