OrientDb 边缘仅在一侧连接

OrientDb edge only connected on one side

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

如您所见,15:3 有一个到 17:1 的出边,但是 17:1 没有对应的入边。

这是怎么回事?这是一个错误还是这实际上是 OrientDb 中可以接受的情况?

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

编辑:额外信息

使用 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();

假设数据库中的目标顶点的版本为 1。在此示例中,顶点被提取两次,并且两条边被放置到该顶点。这使得版本 2 将有两个目标顶点。提交时,OrientDb 选择一个(看起来总是第一个)并提交该目标顶点。

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

虽然 OrientDb 抛出异常或类似的东西会非常好...