2017-05-16 4 views
0

와 사이퍼 - 쿼리를 최적화하는 방법 :난 더 이상 내 컴퓨터에서 실행할 수 없습니다 여러 옵션 일치와 사이퍼 쿼리 (직교 제품) 다음과 같은 한 여러 선택 사항 MATCH

match (document:Document)-[*..2]-(relateddocument:Document) 
optional match (document)-[:HAS_CATEGORY]->(c:Category)<-[:HAS_CATEGORY]-(relateddocument) 
optional match (document)-[:HAS_KEYWORD]->(k:Keyword)<-[:HAS_KEYWORD]-(relateddocument) 
optional match (document)-[:HAS_AUTHOR]->(a:Author)<-[:HAS_AUTHOR]-(relateddocument) 
with document, relateddocument, collect(c)+collect(k)+collect(a) as similarity 
where id(document) = 85182 return relateddocument, similarity order by similarity desc limit 5 

당신은 나에게를 전해 주 시겠어요 이 쿼리를 어떻게 최적화 할 수 있습니까?

답변

1

, 당신은 MATCH에 의해 생성 된 행의 수를 최소화하기 위해, 해당 MATCH에 가능한 한 가까운 WHERE 절을 넣어해야합니다.

COLLECT을 사용하여 각 MATCH의 N 행을 1 행으로 변환하여 모든 연속 된 OPTIONAL MATCH 절에 의해 발생하는 데카르트 제품을 제거 할 수 있습니다. (마지막 WITHRETURN에 "병합"할 수 있도록 RETURN 직전, 그리고 것입니다.) 또한

, 당신의 ORDER BY similarity DESC 절은 어떤 이해가되지 않습니다 (아마 오류가 발생합니다), similarity이 때문에 수집. 당신은 아마도 similarity 대신 SIZE(similarity)을 사용하려고했을 것입니다.

이 빨리되어야한다 : 첫 번째 MATCH는 경우, 관계 유형을 필터링 할 [:HAS_CATEGORY|:HAS_KEYWORD|:HAS_AUTHOR*..2]을 사용하는 문서가 다른 유형과의 관계를 많이 가지고

MATCH (document:Document)-[:HAS_CATEGORY|:HAS_KEYWORD|:HAS_AUTHOR*..2]-(relateddocument:Document) 
WHERE ID(document) = 85182 
OPTIONAL MATCH (document)-[:HAS_CATEGORY]->(c:Category)<-[:HAS_CATEGORY]-(relateddocument) 
WITH document, relateddocument, COLLECT(c) AS cs 
OPTIONAL MATCH (document)-[:HAS_KEYWORD]->(k:Keyword)<-[:HAS_KEYWORD]-(relateddocument) 
WITH document, relateddocument, cs, COLLECT(k) AS ks 
OPTIONAL MATCH (document)-[:HAS_AUTHOR]->(a:Author)<-[:HAS_AUTHOR]-(relateddocument) 
RETURN relateddocument, cs+ks+collect(a) as similarity 
ORDER BY SIZE(similarity) DESC 
LIMIT 5; 

공지있다. 이는 첫 번째 MATCH에 의해 생성 된 행 수를 줄여 전체 쿼리가 수행하는 작업량을 줄일 수 있습니다.

0

즉시 개선하는 한 가지 방법은 MATCH 문에서 WHERE id (document) = 85182를 똑바로 옮기는 것입니다. 그것은 당신이 질의를 프로 파일링 할 때 큰 차이를 줄 것입니다.

감사합니다, 톰

0

가장 큰 문제는 match (document:Document)-[*..2]-(relateddocument:Document) 모든 문서에 대한 모든 문서 사이의 데카르트 제품은 2 개 링크 거리에 있다는 것입니다, 그리고 원정 ID 필터 사이의와 함께 때까지 필터를 적용하지 사이퍼를 알려줍니다 그것이 모든 일을 마친 후에. WHERE id (...)를 WITH 앞에 놓으면 Cypher는 id (문서 : 문서)를 id 85182로 제한하는 것이 안전하다는 것을 알게되므로 기본적으로 모든 문서를 모든 문서에 일치시키지 않아도됩니다. 다른 답변이 나타내는 것처럼

MATCH (document:Document)-[*..2]-(relateddocument:Document) 
WHERE id(document) = 85182 
WITH document, relateddocument 
OPTIONAL MATCH (document)-[:HAS_CATEGORY]->(c:Category)<-[:HAS_CATEGORY]-(relateddocument) 
OPTIONAL MATCH (document)-[:HAS_KEYWORD]->(k:Keyword)<-[:HAS_KEYWORD]-(relateddocument) 
OPTIONAL MATCH (document)-[:HAS_AUTHOR]->(a:Author)<-[:HAS_AUTHOR]-(relateddocument) 
WITH relateddocument, collect(c)+collect(k)+collect(a) as similarity 
RETURN relateddocument, similarity 
order by similarity desc 
limit 5