2016-01-18 3 views
1

У нас есть Vertex User and Edge FriendsWith. FriendsWith может быть в обоих направлениях и в (обычно это либо вне, либо между двумя пользователями).Найти и удалить повторяющиеся края в OrientDb

Дубликаты когда либо из или от одного пользователя к другому встречается более чем один раз (уходит и вместе не рассматривается как дубликат)

Есть ли способ найти дубликаты края и удалить их?

UPDATE Добавлена ​​картинка, иллюстрирующая проблему

enter image description here

Спасибо.

+0

может быть полезно для вас функция JavaScript? – lsavio

+0

уверен, что javascript тоже будет хорош –

+0

для будущего вы можете добавить уникальный индекс для ребер, так что одинаковые дубликаты меток не допускаются между двумя вершинами – arisalexis

ответ

5

Вот мой Javascript функция:

var g=orient.getGraph(); 
var C=g.command('sql','select from FriendsWith'); 
var arr = new Array(C.length); 
var toRemove = new Array(); 

for(i=0;i<C.length;i++){ 
    var found = false; 
    for (x = 0; x < i+1 && !found; x++) { 
    if (arr[x] === C[i].getProperty("out").getId()+" "+C[i].getProperty("in").getId()) { 
    found = true; 
    toRemove.push(C[i].getId()); 
    } 
    } 
    arr[i] = C[i].getProperty("out").getId()+" "+C[i].getProperty("in").getId(); 
} 

for(a=0;a<toRemove.length;a++){ 
    var C=g.command('sql','delete edge '+toRemove[a]); 
} 

Надеется, что это помогает. Bye

+0

благодарим за ответ, но могут возникнуть проблемы с производительностью, потому что мы получили более 600 000 вершин и 800 000 краев. –

2

Я создал небольшую БД, чтобы попробовать ваше дело. Это мой код:

create class User extends V 
create class follows extends E 

create property User.id integer 
create property User.name String 

create vertex User set id=1, name="Paul" 
create vertex User set id=2, name="John" 
create vertex User set id=3, name="Mark" 
create vertex User set id=4, name="Robert" 

create edge follows from (select from User where id=1) to (select from User where id=2) 
create edge follows from (select from User where id=2) to (select from User where id=1) 
create edge follows from (select from User where id=1) to (select from User where id=3) 
create edge follows from (select from User where id=2) to (select from User where id=3) 
create edge follows from (select from User where id=3) to (select from User where id=2) 
create edge follows from (select from User where id=3) to (select from User where id=4) 

График:

enter image description here

Затем я создал простую функцию Javascript, удаляющий после того, как нашел дублированный край, край в-направлении.

Вход: Rida (Yout начиная @rid)

Код:

var g=orient.getGraph(); 
var outF=g.command('sql','select expand(out("follows")) from '+ridA); 
var inF=g.command('sql','select expand(in("follows")) from '+ridA); 
for(x=0;x<outF.length;x++){ 
    var ridOut=outF[x].getId(); 
    for(y=0;y<inF.length;y++){ 
    var ridIn=inF[y].getId(); 
    if(ridOut==ridIn){ 
     g.command('sql','delete edge follows from '+ridIn+' to '+ridA); 
    } 
    } 
} 

Edit:

Например, если вы пытаетесь удалить дублированные ребра из вершины # 12: 1 , после того, как запустила эту функцию, два «направления» в направлении «будут удалены».

+0

Спасибо за ответ, но это немного отличается от того, что мне нужно. Мне нужно найти дубликаты для ridOut (от # 12: 0 до # 12: 1 2 или более раз) или ridIn не для ridOur == ridIn. –

+0

Привет, вы хотите удалить несколько ребер из одной начальной вершины, верно? – LucaS

+0

только дубликаты, которые могут встречаться в обоих направлениях. –

3

Вы можете попробовать эту функцию

var g=orient.getGraph(); 
var friends=g.command("sql","select from FriendsWith"); 
var paths=[]; 
for(i=0;i<friends.length;i++){ 
    paths.push(friends[i]); 
} 
for(i=0;i<paths.length;i++){ 
    var myEdge=paths[i]; 
    var vIn=myEdge.getProperty("in").getId(); 
    var vOut=myEdge.getProperty("out").getId(); 
    for(j=0;j<paths.length;j++){ 
     if(i<j){ 
      var edge=paths[j]; 
      var vInCopy=edge.getProperty("in").getId(); 
      var vOutCopy=edge.getProperty("out").getId(); 
      if((vIn==vInCopy && vOut==vOutCopy) || (vIn==vOutCopy && vOut==vInCopy)){ 
       g.command("sql","delete edge FriendsWith where @rid="+edge.getId()); 
       paths.splice(j, 1); 
       j--; 
      } 
     } 
    } 
} 

Перед enter image description here После enter image description here

+0

Кажется, что мне нужно, но есть ли способ ее оптимизировать, потому что я получил более 800 000 ребер уже –

+0

Сколько у вас вершин? –

+0

более 600 000 –

Смежные вопросы