2017-01-04 5 views
0

이 쿼리입니다 명중 MERGE : 왜 병합 단계는 쿼리가 이미에 N, m 쌍을 좁혀 경우 많은 DB 안타지고Neo4j MATCH는 너무 많은 DB가

MATCH (n:Client{curp:'SOME_VALUE'}) 
WITH n 
MATCH (n)-[:HIZO]-()-[r:FB]-()-[:HIZO]-(m:Client) 
WHERE ID(n)<>ID(m) 
AND NOT (m)-[:FB]->(n) 
MERGE (n)-[:FB]->(m) RETURN m.curp 

PROFILE

6,781 행?

n, m, r 
(n)-[ UNNAMED155:FB]->(m) 
+0

최적화 프로그램에서는 문제가되지 않지만 첫 번째 'WITH'의 핵심은 무엇입니까? –

+0

시도해 보았습니다. (클라이언트 : {{HIZO} - [: HIZO] 하지만 병합에 아무런 차이가 없습니다. – zad

+1

패턴에서 r 변수를 제거해 보았습니까 (사용하지 않으므로 필요하지 않으므로), 병합 전에 'DISTINCT n, m'을 추가 했습니까? – InverseFalcon

답변

1

쿼리 행을 구축 명심하고 쿼리 작업이 구축되어 모든 행에서 실행 얻을 : 그 단계의

세부 사항이 표시됩니다.

일치하는 패턴에 클라이언트의 경로가 여러 개있을 수 있으므로 클라이언트는 동일한 n 및 m (그러나 r은 다를 수 있지만 다른 곳에서는 r을 사용하지 않는 것처럼 여러 행을 만듭니다. 쿼리, 나는 당신이 변수를 제거하는 것이 좋습니다).

즉, n과 고유 m 사이의 단일 관계를 병합한다는 의미 일지라도이 MERGE 연산은 실제로 n 및 m의 단일 중복 행마다 실행됩니다. 그 병합 중 하나가 관계를 만들 것이며, 나머지는 아무것도하지 않고 생성 된 관계에 일치하는 사이클을 낭비하게됩니다.

MERGE를 수행하기 전에 n과 m의 고유 한 쌍만 고려하여 db 히트를 낮출 수 있어야합니다.

쿼리가 우리가 관계가 존재하지 않는 n과 m만을 고려했기 때문에 MERGE 대신 CREATE를 안전하게 사용할 수 있으며 MERGE가 항상 MATCH를 시도하기 때문에 DB 히트를 절약 할 수 있습니다. 먼저 필요하지 않습니다.

향상된 쿼리는 다음과 같습니다

MATCH (n:Client{curp:'SOME_VALUE'}) 
WITH n 
MATCH (n)-[:HIZO]-()-[:FB]-()-[:HIZO]-(m:Client) 
WHERE n <> m 
AND NOT (m)-[:FB]->(n) 
WITH DISTINCT n, m 
MERGE (n)-[:FB]->(m) 
RETURN m.curp 

편집

에 대한 병합 기능을 사용하여 쿼리를 반환 : FB 관계, 시도 CREATE 대신으로 확대됨에없는 결국 사용한다.

+0

위의 의견 작성자도 제안한 것처럼 DISTINCT를 추가하면 조회수가 많이 줄어 듭니다. 그러나이 쿼리를 실행할 때마다 복제물이 생성되기 때문에 CREATE는 좋은 생각입니다. 병합 단계에는 482,923 db의 히트 수가 여전히 있습니다 (60M에서 감소). 내가 MERGE가 먼저 일치하려고 시도하고 그 패턴이 존재하지 않는다고 이해한다면, 그것을 창조하십시오. 나는 482,923이 여전히 관계의 양쪽 끝이 이미 묶여 ​​있다고 생각하고 있다고 생각한다. 어쨌든 이것을 가속화 할 수 있을까?또는 MERGE 내부에서 무엇이 수행되고 있는지 살펴보아야합니까? 감사합니다 – zad

+0

실제로 나는 정확하게 읽지 못했습니다. 이미 관계가 존재하지 않는다는 것을 확인한 메신저가 CREATE를 사용하는 것이 안전하지만, NOT (m) - [: FB] -> (n)과 creating (n) - [: FB] - > (m) ** 역방향 **. 난 원래의 의도는 경우에만 이전 방향으로 연결이 없었어요, 그래서 하나의 방향과 다른 하나를 확인하지 필터를 연결하는 것 같아요 ...하지만 난 그냥 모든 방향을 확인할 수있을 것 같아요 필터를 만들고 CREATE를 사용 하시겠습니까? – zad

+0

정확하게, 처음에 방향을 잘못 읽고 방금 제안한 솔루션으로 답변을 업데이트했습니다. – InverseFalcon