2012-06-26 2 views
1

Neo4j에서 그래프가 끊어져 있습니다.Neo4j 관계 수를 기준으로 연결이 끊어진 그래프 삭제

하나의 다른 노드에만 연결된 모든 노드를 삭제하고 싶습니다.

그래서 쌍을 없애고 싶지만 적어도 3 개의 노드가 어떤 식 으로든 연결된 모든 그래프를 유지하고 싶습니다.

데이터를 입력 할 때 get 또는 create 메소드를 사용하여 색인이 생성되도록해야합니다.

+0

스프링 데이터 Neo4j를 사용하고 있습니까? 객체의 유형이 하나 이상 있습니까 (nodeEntity)? 데이터베이스에 대략 얼마나 많은 노드가 있습니까? 이러한 것들이 도움이 될 것입니다. – Slomo

+0

아니요 아니요 아니요 매우 작은 숫자입니다. 1,000 명과 1,500 명 정도의 관계. –

답변

-1

사이퍼를 사용하여이 쿼리를 사용하여 작업을 얻을 수 있습니다이 도움이 http://console.neo4j.org/r/1re6t

희망 :

여기
start a=node(*) 
match a-[r]->b 
where length(a--()) = 1 and length(b--()) = 1 
delete a,r,b 

당신이 행동에서 볼 수있는 링크입니다!

+0

길이가 (a -()) = 1이고 길이가 (b -()) = 1 인 경우 "SyntaxException : 잘못된 값의 시작이 ==>"a- [r] -> b와 일치합니다. "" –

+0

방금 ​​살고있는 쿼리를 볼 수있는 링크를 추가했습니다. 1.8.M04 이상에서만 작동합니다. – Andres

+0

오. 내가 일찌기 버전 인 것 같습니다. –

0

이것은 내가 짧은 시간에 생각해 낸 해결책 일뿐입니다. 아마 가장 좋은 것은 아니 겠지만, 아이디어를 얻고 그것을 당신의 경우에 적용 해주기를 바랍니다.

TraversalDescription td = Traversal.description().depthFirst().evaluator(new Evaluator() { 
     @Override 
     public Evaluation evaluate(Path path) { 
      if (path.length() == 1) { 
       int count = 0; 
       Iterator<Relationship> it = path.endNode().getRelationships().iterator(); 
       while (it.hasNext()) { 
        it.next(); 
        count++; 
       } 
       if (count == 1) { 
        count = 0; 
        it = path.startNode().getRelationships().iterator(); 
        while (it.hasNext()) { 
         it.next(); 
         count++; 
        } 
        if (count == 1) { 
         return Evaluation.INCLUDE_AND_PRUNE; 
        } else { 
         return Evaluation.EXCLUDE_AND_PRUNE; 
        } 
       } else { 
        return Evaluation.EXCLUDE_AND_PRUNE; 
       } 
      } 
      return Evaluation.EXCLUDE_AND_CONTINUE; 
     } 
    }); 

    Traverser traverser = td.traverse(**MYNODE**); 

이 탐색 설명은 노드가 2 개만있는 모든 경로를 반환해야합니다. 나는 그것을 테스트하지는 않았지만 아이디어는 다음과 같다. 경로의 시작과 끝 노드 (lenght 1)에 둘 이상의 관계가 있는지 확인한다. 그렇다면, 그것은 경로의 끝이 될 수 없으므로 한 쌍이 아닙니다. 그렇지 않으면 나중에 traverser에 의해 리턴됩니다. 순회에 대한 자세한 내용은 neo4j documentation을 확인하십시오.

현재 데이터베이스 레이아웃을 사용하면 데이터베이스의 모든 노드에 대해 통과자를 실행해야합니다. 이것은 불필요한 반복을 많이하기 때문에 일반적으로 나쁜 방법입니다. 이 작업을 한 번만 수행하면 잠시 동안의 해결책이 될 수 있습니다. 이 기능을 최종 응용 프로그램에 통합하려면 각 클러스터를 루트 노드에 연결하는 몇 가지 관계를 추가하는 것이 좋습니다.

루트 노드 (id = 0)에서 데이터베이스의 각 노드에 관계를 추가 할 수 있습니다. 그런 다음 루트 노드에서 위에서 설명한 순회 설명을 사용하여 트래버스합니다 ((path.length() == 1)(path.length() == 2)으로 변경하고 시작 노드의 수표를 제거하면됩니다). 그런 다음 한 번에 한 번에 한 쌍의 모든 경로를 가져옵니다. 이것은 훨씬 빠릅니다. 나중에 관계를 제거 할 수도 있습니다. 기본적으로 원하는 방식으로 관계를 디자인 할 수 있습니다. 쿼리 또는 순회 중 특정 항목을 항상 무시할 수 있습니다. 그러나 더 나은 성능과 트래버스 설명을 얻으려면 가끔씩 필요합니다.

희망 사항이 있으면 알려주세요.

관련 문제