OrientDb边仅在一侧连接

OrientDb边仅在一侧连接,orientdb,Orientdb,我们有一个带有顶点和轻量级边的orientdb。现在有两个顶点,它们之间应该有一条边。但是,边缘似乎是从一侧传出的,而不是从另一侧传入的。我认为OrientDb边始终可以在两个方向上进行遍历 正如你所看到的,15:3有一个17:1的外缘,但17:1没有相应的内缘 这是怎么回事?在OrientDb中,这是一个bug还是一个可以接受的情况 仅供参考这是一个开发者数据库。屏幕截图中的两个查询之间没有人访问数据库。这个问题很难重现,因为它并不总是发生 编辑:额外信息 使用OrientDb 2.1.9。

我们有一个带有顶点和轻量级边的orientdb。现在有两个顶点,它们之间应该有一条边。但是,边缘似乎是从一侧传出的,而不是从另一侧传入的。我认为OrientDb边始终可以在两个方向上进行遍历

正如你所看到的,15:3有一个17:1的外缘,但17:1没有相应的内缘

这是怎么回事?在OrientDb中,这是一个bug还是一个可以接受的情况

仅供参考这是一个开发者数据库。屏幕截图中的两个查询之间没有人访问数据库。这个问题很难重现,因为它并不总是发生

编辑:额外信息


使用OrientDb 2.1.9。边是使用tinkerpop API创建的。我们确实使用事务(虽然这个问题不一定发生在单个事务之后。同样,这个问题很难隔离和复制)。

因此,当您执行以下操作时,显然会发生这种情况:

        OrientGraph tx = factory.getTx();
        Vertex vertex1 = createVertex(tx);
        Vertex vertex2 = createVertex(tx);
        Supplier<Vertex> getTargetVertex = () -> {
            Iterable<Vertex> vertices = tx.command(new OCommandSQL("select from " + targetRid).execute();
            return vertices.iterator().next();
        };
        vertex1.addEdge(ClassNames.REFERENCE, getTargetVertex.get());
        vertex2.addEdge(ClassNames.REFERENCE, getTargetVertex.get());
        tx.commit();
OrientGraph tx=factory.getTx();
顶点顶点顶点1=创建顶点(tx);
顶点顶点顶点2=创建顶点(tx);
供应商getTargetVertex=()->{
Iterable vertices=tx.command(新的OCommandSQL(“从”+targetId.execute中选择”);
返回顶点。迭代器().next();
};
vertex1.addEdge(ClassNames.REFERENCE,getTargetVertex.get());
vertex2.addEdge(ClassNames.REFERENCE,getTargetVertex.get());
tx.commit();
假设数据库中的目标顶点的版本为1。在本例中,将两次获取顶点,并将两条边放置到该顶点。这样,版本为2时将有两个目标顶点。提交时,OrientDb会选择一个(看起来总是第一个)并提交该目标顶点

解决方案是每次事务只获取一次目标顶点


如果OrientDb抛出一个异常或类似的东西,那将是非常好的,不过…

您以前做过一些删除操作吗?不,我们根本不做任何删除。我需要更多信息:1)您正在使用的OrientDb版本。2) 如何创建顶点/边(哪个API)?3) 你在使用事务吗?谢谢@davidenhove如果你总是使用事务,这些不一致就永远不会发生,所以我认为这是一个bug。我建议你升级到最新的2.1稳定版(我写这篇文章的时候是2.1.19版),或者更好的升级到2.2版,这方面没有公开的问题currently@LuigiD谢谢你的澄清。不幸的是,现在切换到较新版本的OrientDb并不容易。