Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OrientDb中查找和删除重复边_Orientdb_Orientdb 2.1 - Fatal编程技术网

在OrientDb中查找和删除重复边

在OrientDb中查找和删除重复边,orientdb,orientdb-2.1,Orientdb,Orientdb 2.1,假设我们有顶点用户和边友谊。 FriendsWith可以是两个方向的out和in,通常是out或介于2个用户之间 重复是指当从一个用户到另一个用户的输入或输出被发现超过一次时,同时输入和输出不被视为重复 有没有办法找到重复的边并将其删除 更新添加了说明问题的图片 谢谢。我创建了一个小数据库来尝试您的案例。这是我的代码: create class User extends V create class follows extends E create property User.id integ

假设我们有顶点用户和边友谊。 FriendsWith可以是两个方向的out和in,通常是out或介于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)
图表:

然后我创建了一个简单的Javascript函数,一旦发现重复的边,就会删除方向边

输入:ridA yout开始@rid

代码:

编辑:


例如,如果尝试从顶点12:1删除重复的边,则在启动该功能后,将删除“跟随”方向的两条边。

您可以尝试此功能

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--;
            } 
        }
    }
}
以前 之后
以下是我的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

可以为您使用JavaScript功能吗?当然,JavaScript在将来会很好。您可以为边添加唯一索引,因此两个垂直之间不允许出现相同的标签边重复项是的,这是我打算做的,但发现重复项谢谢您的回答,但这与我需要的略有不同。我需要查找从12:0到12:1的重复项2次或更多次,或者ridIn not for ridOur==ridIn。您好,是否要从单个起始顶点删除多条边,对吗?只能在两个方向上出现重复项Hi,在创建了从顶点12:1到4个不同顶点的4个重复边“跟随”后,我尝试了该函数,该函数删除了重复的边。我使用ridOut==ridIn,因为如果它们指向同一个顶点,就意味着存在重复。一旦找到它,它将只删除“IN”方向,但“OUT”边仍然保留,但您也可以选择保留“OUT”方向。总之,删除边是从1个ridA到N个顶点,这不是你要找的吗?我需要删除ridOut、ridIn或ridIn的边,ridOut出现的次数超过1次我需要的次数,但是否有任何方法对其进行优化,因为我已经获得了80多万条边缘。您可以将您的数据库发送给我进行测试或子集吗?它超过2GB,部署需要2-3小时。有一些真实的数据我的目标是复制您的数据库,您是否在少数顶点上有许多重复边,或者重复边分布在许多顶点上?据我所知,重复边分布在许多顶点上。感谢您的回复,但可能存在性能问题,因为我们有60多万个顶点和80万条边。
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]);
}