도달 가능한 노드에 효율적으로 일치시키기 위해 잘 작동하는 두 가지 옵션이 있습니다.
Neo4j 3.2.x에는 가변 관계 성냥과 DISTINCT의 사용을 통해 모든 개별 도달 가능 노드와 일치하는 효율적인 수단이 있지만 가변 길이 관계에 대한 상한이 필요합니다. 적절하게 높은 숫자를 사용하면 효과가 있습니다. 뭔가 같은 :
MATCH (start:SomeLabel{someProperty:false})
CALL apoc.path.subgraphNodes(start, {}) YIELD node
SET node.someProperty = false;
편집
첫 번째 옵션에 대한 자세한 내용을 추가하려면 (왜 안 :
MATCH (:SomeLabel{someProperty:false})-[*..999999]->(x)
WITH distinct x
SET x.someProperty = false
그렇지 않으면, APOC Procedures 또한 서브 그래프에 도달 노드에 효율적으로 매칭을 수행 apoc.path.subgraphNodes()을 제공합니다 *
을 사용하고 DISTINCT를 사용해야하는 이유) 기본적으로 Cypher는 *
을 사용할 때 가능한 모든 경로와 일치합니다. 경로가 이전 노드와 동일한 노드에서 끝나더라도 일치하는 경로. 이것은 충분히 연결된 그래프에서 비효율적이 될 수 있습니다 (합리적인 상한선이없고 LIMIT을 사용하지 않을 때). 힙을 불거나 무한정 매달릴 가능성이 있습니다.
우리가 가능한 모든 경로에 관심이 없거나 도달 가능한 모든 노드에만 관심이있는 경우 특히 피해야합니다.
In Neo4j 3.2, 최적화는 다음의 모두에 해당하는 경우 순회 로직을 변경하는,라고 치기 - var에 확장 도입 :
- 우리는 VAR 길이 확장
- 우리는을 참조하지 않는에게 있습니다 (경로 변수를 일치 패턴으로 설정하거나 var-length 관계에 변수를 설정하는 것과 같이)
- var-length 확장에 상한이 있습니다.
- DISTINCT 확장으로 얻을 수있는 노드 또는 값
기본적으로 쿼리가 var-length 확장에서 별개의 노드 (또는 별개 노드의 값)를 원하며 경로를 신경 쓰지 않는 쿼리 인 경우.
플래너는 다음과 같이 pluning var expand (EXPLAIN 또는 PROFILE에서 쿼리 계획을 확인하여 확인할 수 있음)를 사용하여 도달 가능한 노드와 효율적으로 일치시킵니다.
'false'로 원하는 속성을 가진 노드와 일치하는 것으로 충분하면 연결 가능한 노드를 모두 false로 변경하십시오. – InverseFalcon