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 抛出异常或类似的东西会非常好...
我们有一个带有顶点和轻量级边的 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 抛出异常或类似的东西会非常好...