2014-08-27 3 views
2

스프레드 시트에서 많은 양의 데이터를 가져 오는 동안 노드가 "This"처럼 대문자로 표시되고 관계 레이블에 "THIS"라는 레이블이 붙은 레이블링 규칙을 사용하려고했습니다. 한 예로, 실수로 노드 세트에 대한 관계 레이블 형식을 사용했습니다. 그런 다음 해당 노드를 삭제하고 올바른 레이블 형식으로 다시 가져 왔습니다. (사이드 질문 - 삭제/다시 가져 오기를 피할 수 없었던 레이블 이름을 바꾸는 방법이 있습니까?)neo4j에서 레이블 참조 제거

내 문제는 내장 Cypher 브라우저 (Neo4j 2.1.3)에서 잘못된 라벨이있는 노드가 없더라도 오른쪽 및 잘못된 레이블이 모두 노드 목록에 표시됩니다. 따라서 노드를 성공적으로 제거하는 동안 노드에서가 아니라 REMOVE 명령을 사용하여 충분히 쉽지만 데이터베이스 전체에서 레이블을 제거하는 방법을 알 수는 없습니다. 할당 된 항목이 0에 도달했을 때이 라벨을 자동으로 제거하지 않은 이유는 무엇입니까? 이러한 결과

MATCH (n:`MEASURES`) RETURN n LIMIT 25 

:

더 구체적으로, 나는 조치에 대한 노드 라벨이 쿼리 화재를 클릭하면 내가 완전히 라벨 '을 제거하려는

Returned 0 rows in 77 ms 

MEASURES '는 데이터베이스에서 사용하고 있으므로 아무 것도 사용하지 않습니다. 추가 정보가 필요하면 알려주십시오.

답변

5

아직 neo4j DB에서 더 이상 사용되지 않는 레이블을 제거하는 방법이 없다고 생각합니다. 나는 또한 neo4j 브라우저 웹 UI와 같은 장소에서 여전히 사용되지 않는 오래된 라벨에 짜증이났다.

나는 그것을 제거하는 한 가지 방법을 알고 있지만 DB가 방대한 경우 실제적이지 않을 수도 있고 일 수도 있고은 완전히 안전하지 않을 수도 있습니다. 따라서 다음 작업을 수행하기로 선택한 경우 원본 DB를 백업해야합니다 (예 : 원래 graph.db 폴더의 복사본을 만들거나 이름을 바꿔야 함).

이 기술은 실제로 매우 간단합니다. 모든 데이터를 내보내고 neo4j를 종료하고 원래 graph.db 파일을 삭제하거나 이름을 변경 한 다음 neo4j를 다시 시작한 다음 데이터를 다시 가져옵니다. 다음 단계에서는 사용자가 Linux 환경의 neo4j 설치 폴더에 있다고 가정하고 neo4j가 서비스로 실행되고 있지 않습니다.

  1. 내보내기 (데이터를 다시합니다 CYPHER 문 등) 데이터 :

    ."덤프"-c/빈/neo4j - 쉘> mydump.cql

  2. 종료 neo4j (DB가 실행되는 동안 제거하거나 graph.db의 이름을 변경하는 것이 안전 아니므로) :

    ./bin/neo4j을 graph.db.archive

    MV 데이터/graph.db 데이터/

  3. 해상도 : 아래 만든 새 폴더를 교체해야 할 경우를 대비,

  4. 현재 graph.db 폴더의 이름을 바꿉니다 중지 자동으로 새 graph.db 폴더를 생성합니다 타트 neo4j :

    ./bin/neo4j-shell - 파일 mydump :

  5. 다시 가져 오기 덤프의 데이터를 시작 ./bin/neo4j .cql

이 시점에서 더 이상 쓸모없는 레이블이 없어야합니다 (neo4j 웹 페이지를 새로 고침해야합니다).

+0

나는 이번 주말에 기회를 얻었을 때 내가 묻고있는 것을 얻었고 이것을 시도 할 것입니다. 실제로, neo4j 브라우저 UI 내의 버튼이며, 내가 말하는 이유는 데이터베이스가 여전히 라벨에 대해 알고 있다는 것입니다. 아이디어를 가져 주셔서 감사합니다. –

+0

나는 마침내 이렇게하고있다. 덤프는 꽤 오랜 시간이 걸렸으며 결과적으로 70 만 줄이되었습니다. 그런 다음 파일을 읽는 프로세스가 중단되지 않도록 매 1000 라인마다 커밋/커밋/삽입 라인을 삽입해야했습니다. 메모장 ++에서 regex 찾기/바꾸기를 사용하면 트릭을 만들 수 있습니다. 가져 오기는 상상할 수있는 것처럼 오래 걸렸지 만 문제의 태그는 사라졌습니다. 이것은 이것을 고치는 매우 성가신 방법처럼 보입니다. 그러나 2.1.5 커뮤니티가 출시되기를 기다리는 동안 (2.1.5 엔터프라이즈가 종료 됨) 엔터프라이즈 릴리스 노트에 이와 관련된 버그를 수정하는 내용이 있음을 알게되었습니다. 우리가 볼거야. 감사! –

1

레이블은 레이블을 사용하는 노드와 별개로 실제로 존재하지 않습니다. 존재하지 않는 레이블을 항상 쿼리 할 수 ​​있으며 항상 0 노드가 반환됩니다.

여기에서는 MEASURES를 쿼리하고 아무것도 얻지 못합니다. 라벨이없는 것과 거의 같은 것입니다.

$ neo4j-shell -path test 
NOTE: Local Neo4j graph database service at 'test' 
Welcome to the Neo4j Shell! Enter 'help' for a list of commands 


neo4j-sh (?)$ MATCH (m:TotallyNonExistantLabel) return m; 
+---+ 
| m | 
+---+ 
+---+ 
0 row 
1946 ms 

그래서, 결론은 당신이 정말로 그것을 사용하는 모든 노드를 삭제 이외의 다른 데이터베이스에서 라벨을 삭제할 수 있습니다 :

여기에 지금 막 만든 데이터베이스 예입니다. 이 같은이 작업을 수행 할 수 있습니다 기본적으로 데이터베이스에서 ThisLabelGonnaDieSucka을 삭제하는 것

MATCH (f:ThisLabelGonnaDieSucka) 
REMOVE f:ThisLabelGonnaDieSucka 
RETURN f; 

합니다.

2

다음은 수행 방법입니다.

는 무엇을 확인해야하는 것은

  • 1) 어떤 노드가 제거 라벨

1)에는 인덱스 또는 제약 라벨

  • 2)를 사용하지 않고있다된다는 점이다

    MATCH (n:OldLabel) 
    SET n:NewLabel /* Optional line if you want to rename the label */ 
    REMOVE n:OldLabel 
    RETURN n 
    

    2A) 내가 확인 :/A cypher 쿼리 노드의 레이블 이름을 변경 F 지수 또는 제약은 neo4j-shellschema 명령을 사용하여 라벨을 사용하고 있습니다 :

    $ neo4j-shell 
    Welcome to the Neo4j Shell! Enter 'help' for a list of commands 
    NOTE: Remote Neo4j graph database service 'shell' at port 1337 
    
    neo4j-sh (?)$ schema 
    Indexes 
        ON :OldLabel(id)   ONLINE (for uniqueness constraint) 
        ON :Person(name)   ONLINE (for uniqueness constraint) 
        ON :Person(id)    ONLINE (for uniqueness constraint) 
    
    Constraints 
        ON (person:Person) ASSERT person.name IS UNIQUE 
        ON (person:Person) ASSERT person.id IS UNIQUE 
        ON (oldlabel:OldLabel) ASSERT oldlabel.id IS UNIQUE 
    

    2B)는 cypher 쿼리에서 인덱스 및 제약 조건을 제거

    DROP CONSTRAINT ON (n:OldLabel) 
        ASSERT n.id IS UNIQUE; 
    DROP INDEX ON :OldLabel(id); 
    

    하는 새로운 인덱스 및 제약 조건을 만들 것을 잊지 마십시오 당신의 경우 방금 레이블의 이름을 바꾸고 싶었습니다.

    그런 다음 더 이상 웹 인터페이스에 라벨이 표시되지 않아야합니다.