2014-11-18 2 views
1

다음 예제는 Neo4j 설명서에서 가져온 것으로 here입니다.Neo4j 노드의 모든 레이블 제거

MATCH (n { name: 'Peter' }) 
REMOVE n:German 
RETURN n 

또한과 같이 여러 개의 라벨을 제거 할 수 있습니다 :

MATCH (n { name: 'Peter' }) 
REMOVE n:German:Swedish 
RETURN n 

을 어떻게 할 사이퍼를 사용

는, 그렇게 같은 사이퍼 문을 사용하여 하나의 알려진 레이블을 제거 할 수 있습니다 하나는 간단한 Cypher 문을 사용하여 노드에서 모든 레이블을 제거합니까?

답변

1

아직 구문이 없습니다. 레이블은 일반적으로 알려진 수량이므로 원하는 경우 모두 레이블을 지정할 수 있습니다. 그러나 모두 제거 할 수있는 역동적 인 방법은 없습니다.

+1

이것은 큰 문제입니다. 모든 레이블을 제거 할 수있는 방법이 없으며 원하는 특정 레이블 만 포함되도록 노드를 업데이트하는 방법이없는 것으로 보입니다. 즉, 노드에 레이블 l1과 l2가 있고 레이블 l1과 l3을 업데이트하려는 경우 l2를 명시 적으로 제거하지 않고 레이블을 l1과 l3으로 설정하는 방법이 나타나지 않습니다. 레이블을 사용하여 유형을 나타냅니다. 응용 프로그램에서 Node 유형이 변경되면이를 반영하여 노드의 레이블을 업데이트 할 수 있기를 원합니다. 내가 틀렸다면 나를 바로 잡아주세요. – bjlevine

+0

그래프의 모든 라벨을 알고 있다면, 'match (n) remove n : label1 : label2 : label3 : labelN'과 같은 일을 할 수 있습니다. –

1

그럼 2 단계 사이퍼 방식은 어떨까요? cypher를 사용하여 일부 cypher 문을 생성 한 다음 쉘에서 cypher 문을 실행합니다.

당신은 당신은 아마 모든 중복을 제거 할 것 ... 일괄에게 사이퍼 문

match (n) 
return distinct "match (n" 
+ reduce(lbl_str= "", l in labels(n) | lbl_str + ":" + l) 
+ ") remove n" 
+ reduce(lbl_str= "", l in labels(n) | lbl_str + ":" + l) 
+ ";" 

출력은 다음과 같이 보일한다

를 생성하는

match (n:Label_1:Label_2) remove n:Label_1:Label_2; 
match (n:Label_1:Label_3) remove n:Label_1:Label_3; 
match (n:Label_2:Label_4) remove n:Label_2:Label_4; 

을 이런 식으로 뭔가를 시도하고 따라 할 수 귀하의 데이터에 꽤있을 수 있습니다.

정확하게 찾고있는 것은 아니지만 Cypher 및 neo4j 셸을 사용하여 동일한 최종 상태로 전환 될 것이라고 생각합니다. 혼자 브라우저에서 일하는 것이 뭔가이 아래로 편집


빛나는 NEW 아래 개선 사이퍼 .... 그것은 이것이 훨씬 더 나은 해결책이라고 생각합니다. 여전히 두 단계이지만 브라우저로 잘라내어 붙여 넣을 수있는 단일 명령문을 생성합니다. 이와 같은 출력을 생성

match (n) 
with distinct labels(n) as Labels 
with reduce(lbl_str="", l in Labels | lbl_str + ":" + l) as Labels 
order by Labels 
with collect(Labels) as Labels 
with Labels, range(0,length(Labels) - 1) as idx 
unwind idx as i 
return "match (n" + toString(i) + Labels[i] + ")" as Statement 
union 
match (n) 
with distinct labels(n) as Labels 
with reduce(lbl_str="", l in Labels | lbl_str + ":" + l) as Labels 
order by Labels 
with collect(Labels) as Labels 
with Labels, range(0,length(Labels) - 1) as idx 
unwind idx as i 
return "remove n" + toString(i) + Labels[i] as Statement 

는 ... 후 절단 될 수

match (n0:Label_A) 
match (n1:Label_B) 
match (n2:Label_C:Label_D) 
match (n3:Label_E) 
remove n0:Label_A 
remove n1:Label_B 
remove n2:Label_C:Label_D 
remove n3:Label_E 

는 Neo4j 브라우저에 붙여.

+0

는 cyher에 'distinct'를 추가 할 수 있으므로 이후에 속이 빈칸을 분류 할 필요가 없습니다. –

+0

OP가 Cypher 자체를 사용하여 어떻게 수행 될 수 있는지 묻고있었습니다. 일단 Neo4j 쉘을 사용해야 만한다면, 수동으로 할 수 있습니다. – bjlevine

+0

예, 저는 그들이 단일 진술을 원한다는 데 동의합니다; 그것은 아직도 cypher이다.나는 당신이 의미하는 바를 브라우저에서만 실행할 수있는 것이라고 생각합니다. 어쨌든, 두 가지 단계가 있지만 브라우저에서 실행될 수있는 브라우저 전용 솔루션에 대해 조금 생각하게 만들었습니다. 그래서 나는 위의 추가를 만들었습니다. –

관련 문제