2013-09-30 1 views
1

쿼리 시간이 너무 길어서 문제를 정확히 찾아 낼 수 없습니다.엄청나게 높은 쿼리 시간

1.7GB RAM을 갖춘 Amazon EC2 인스턴스에서 실행되는 6685 개의 노드, 26407 개의 속성 및 22921 개의 관계가있는 그래프 데이터베이스가 있습니다.

나의 유스 케이스는 사람들을 다양한 관심 지점으로 매핑하고 그와 공통의 관심사를 가진 사람들 인 주어진 사용자를 찾습니다.

나는 내 데이터베이스에 약 500 명의 데이터가 있으며, 각 개인은 그와 관련된 100 가지가 넘는 관심 지점을 가지고 있습니다. 나는이 사이퍼 쿼리를 실행하면

1) :

여기
START u=node(5) MATCH (u)-[:interests]->(i)<-[:interests]-(o) RETURN o; 

노드 (5) 사용자 노드입니다. 따라서 사용자 (u)와 동일한 ": 관심사"관계가있는 모든 사용자를 찾으려고합니다.

이 쿼리는 2557 개의 행을 반환하며 약 350ms가 소요됩니다.

2) 몇 가지 추가 MATCH 조건을 뿌릴 때 쿼리 시간이 기하 급수적으로 저하됩니다. . 예 :

, 나는 사용자와의 공동의 이익이있는 모든 사용자를 찾으려면 (U) = 노드 (5)와 같은 고향을 공유하고, 내가 쓴 :

START u=node(5) 
MATCH (u)-[:interests]->(i)<-[:interests]-(o) 

WITH u,o,i 
MATCH (u)-[:hometown]->(h)<-[:hometown]-(o) 
RETURN u, o, i, h; 

이 쿼리 반환 755 행 및 약 2500ms 걸립니다!

3) 동일한 성별, 동일한 모범 사례 등 MATCH에 제약 조건을 더 추가하면 쿼리 시간이 점차적으로 1 만 초 이상으로 악화됩니다.

내가 뭘 잘못하고 있니?

답변

2

첫 번째 MATCH 절에 전체적으로 패턴을 표시 하시겠습니까? 즉, MATCH (u)-[:interests]->(i)<-[:interests]-(o)-[:hometown]->(h)<-[:hometown]-(o)?

+0

아마도 WITH ... MATCH 대신에'WHERE (u) - [: hometown] -> (h) <- [: hometown] - (o)'도 도움이 될 것입니다 – PhilBa

+0

나는 문제가 있다고 생각합니다. WITH와 MATCH 사이퍼를 사용하면 먼저 각 MATCH 절을 개별적으로 실행 한 다음 데카르트 곱을 만들고 이후 U, I, O에 의한 결합을 수행합니다. 그러나 이것은 무엇보다 추측입니다. – PhilBa

+0

두 패턴을 하나로 결합하여 표현할 수 있으므로 'WITH'또는 'WHERE'가 전혀 필요하지 않아야합니다. 그게 내 생각이었습니다. OP는 추가 제약 조건을 언급하고 있으며, 확장 된 제약 조건 집합은 단일 패턴으로 함께 표현 될 수 없습니다. 가장 좋은 것이 무엇인지 모르겠다. 감각은 단순히 패턴의 확장 인 경우 WHERE 절에 제약 조건을 넣고 쓰기 연산, 집계 또는 다른 연산이있는 경우에만 쿼리를 WITH로 나누면된다. 관련되어있다. Cypher 내부 구조를 알지 못하므로 내 0.02 달러는 겸손합니다. 어떻게 생각해? – jjaderberg

관련 문제