我们有一个带有顶点和轻量边缘的orientdb。现在有2个顶点应该在它们之间有一条边。然而,边缘似乎从一侧传出,而不是从另一侧传入。我认为OrientDb边缘总是可以在两个方向上穿过。
如您所见,15:3的边缘为17:1,但17:1没有相应的边缘。
这里发生了什么?这是一个错误还是在OrientDb中实际上是可接受的情况?
仅供参考,这是一个开发人员数据库。没有人在屏幕截图中的两个查询之间访问数据库。这个问题难以重现,因为它并不总是发生。
编辑:额外信息
使用OrientDb 2.1.9。边缘是使用tinkerpop API创建的。我们确实使用了交易(虽然这个问题并不一定发生在一次交易之后。同样,这个问题很难被隔离和复制)。
答案 0 :(得分:0)
显然,当您执行以下操作时会发生这种情况:
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来说抛出异常或其他类似东西本来是非常好的......