2016-06-16 3 views
3

우리는 정점과 경량 가장자리가있는 orientdb가 있습니다. 이제 그들 사이에 가장자리가 있어야하는 2 개의 꼭지점이 있습니다. 그러나 가장자리는 한 쪽에서 나가고 다른 쪽에서는 들어오지 않는 것처럼 보입니다. OrientDb 가장자리는 항상 양방향으로 가로 질러 움직일 수 있다고 생각했습니다.OrientDb 가장자리가 한쪽에만 연결됨

Screenshot of web interface

볼 수 있듯이, 15 : 3 ~ 17 아웃 에지 갖는다 : 1이지만 17 : 1이 에지에 대응하지 않는다.

여기 무슨 일 이니? 이것은 버그입니까, 아니면 실제로 이것은 OrientDb에서 허용되는 상황입니까?

FYI 이것은 개발자 데이터베이스입니다. 아무도 스크린 샷의 두 쿼리 사이에있는 DB에 액세스하지 않습니다. 문제는 항상 발생하지는 않기 때문에 재현하기가 어렵습니다.

편집 : OrientDb 2.1.9을 사용하여 추가 정보

. 가장자리는 tinkerpop API를 사용하여 작성됩니다. 우리는 트랜잭션을 사용합니다 (이 문제는 단일 트랜잭션 후에 반드시 발생하는 것은 아니지만 다시 문제를 격리하고 복제하기가 어렵습니다). 당신은 다음 작업을 수행 할 때

+1

이전에 일부 삭제 작업을 수행 했습니까? –

+0

아니, 우리는 전혀 삭제하지 마십시오 –

+1

몇 가지 추가 정보가 필요합니다 : 1) OrientDB 버전을 사용하고 있습니다. 2) 버텍스/에지 생성 (API)은 어떻게하고 있습니까? 3) 거래를 사용하고 있습니까? –

답변

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가 예외 또는 그와 비슷한 것을 던지면 좋았을 것입니다 ...

관련 문제