2016-12-06 3 views
1

Cypher를 사용하여 Neo4j 데이터베이스에서 특정 노드와 관련된 연결된 그래프를 삭제하려고합니다. 유스 케이스는 "시작"노드와 시작 노드에 대한 경로가있는 모든 노드를 삭제하는 것입니다. 트랜잭션을 제한하기 위해 쿼리는 반복적이어야하며 연결된 그래프의 연결을 끊지 않아야합니다.Cypher를 사용하여 연결된 그래프 삭제

지금까지 나는이 쿼리를 사용하고 있습니다 :

OPTIONAL MATCH (start {indexed_prop: $PARAM})--(toDelete) 
OPTIONAL MATCH (toDelete)--(toBind) 
WHERE NOT(id(start) = id(toBind)) AND NOT((start)--(toBind)) 
WITH start, collect(toBind) AS TO_BIND, toDelete limit 10000 
DETACH DELETE toDelete 
WITH start, TO_BIND 
UNWIND TO_BIND AS b 
CREATE (start)-[:HasToDelete]->(b) 

를 삭제 노드가 0

동일 할 때까지 더 나은 쿼리가이 거기가 호출?

+0

모든 연결된 노드에 가변 길이 경로를 시도하고 연결된 모든 노드의 DETACH DELETE를 시도합니까? 그것은 당신의 힙을 날려 버리는가? – InverseFalcon

+0

예, 문제는 큰 그래프에서 쿼리가 작동하지 않는다는 것입니다. 쿼리를 여러 번 호출하면 연결된 그래프가 손상 될 수 있습니다. – cde

답변

1

변수 일치가있는 전체 연결 그래프를 분리하고 삭제하는 방법과 유사한 표시 및 삭제 방법을 시도 할 수 있지만 DETACH DELETE 대신 TO_DELETE 레이블을 적용 할 수 있습니다.

이 같은

뭔가 (시작 노드에 사용할 레이블을 만드는 그렇지 않으면 인덱스 된 PARAM으로 노드를 찾는 전체 DB를 빗질하는대로) : 그 불면 경우

MATCH (start:StartNodeLabel {indexed_prop: $PARAM})-[*]-(toDelete) 
SET toDelete:TO_DELETE 

당신의 힙을 사용하면 SET 앞에 추가 된 술어 WHERE NOT toDelete:TO_DELETE을 사용하고 가변 길이 관계의 깊이에 제한 및/또는 제한 조합을 사용하여 여러 번 실행할 수 있습니다.

모든 연결된 노드에 라벨을 지정했다면 TO_DELETE 레이블의 모든 노드를 삭제해야하며 반복적으로 실행하거나 APOC 절차 apoc.periodic.commit()을 사용하여 그것을 일괄 적으로 처리하십시오.