2016-06-02 3 views
0

키워드 DISTINCT과 관련하여 간단한 질문이 있습니다. 따라서 기본적으로 수백만 개의 노드가있는 그래프 (User- [Likes] -> Item)가 있습니다. 나는 특정 항목을 좋아하는 독특한 사용자를 찾고 싶다. 다음 두 쿼리는 성능 차이가 크며 혼란 스럽습니다. 나는 Item (id) 및 : User (id)의 색인을 작성한다.키워드가 뚜렷한 Neo4j 쿼리 성능

쿼리 1 :

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User) 
return count(distinct u); 

질의 2 :

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User) 
return distinct u; 

첫 번째 쿼리 반환 초 결과,하지만 두 번째 쿼리가 5 분 이상 계속 실행하고 나는 환자를 잃고 쿼리를 중지 . 계산 집계 연산이 없기 때문에 두 번째 쿼리가 첫 번째 쿼리보다 빠르다고 생각 했으므로 성능 차이를 이해할 수 없습니다.

+2

첫 번째 쿼리는 단일 숫자를 반환하지 않지만 두 번째 쿼리는 수천 (또는 * 수백만 *)의 노드를 반환합니다. –

+0

드라이버에서 두 번째 쿼리를 실행하거나 마지막에 LIMIT 100 정도를 추가해야합니다. –

답변

1

첫 번째 쿼리는 neo4j에 대한 쉬운 작업 인 고유 값의 수만 반환합니다.

두 번째 쿼리가 다른 모든 노드를 반환하지만 데이터베이스에 고유 값이 너무 많은 경우 오랜 시간이 걸릴 수 있습니다. 몇 가지 고유 한 값을 살짝보고 싶다면 limit을 쿼리에 추가하면됩니다.

예 : 항목을 like

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User) 
return distinct u 
limit 5; 

그것은 반환 (임의) 다섯 사용자 ('001').

+0

이제 알겠습니다. 그러나 고유 한 개수를 나열하는 대신 모든 개별 사용자를 나열하고 프로세스와 동일한 위치에 동일한 사용자를 저장하는 것이 좋습니다. 쿼리가 끝날 때까지 기다려야한다는 의미입니까? 더 효과적인 대안이 있습니까? 감사! – Idealist

+0

도움이 될 수 있습니다 : [Query Tuning] (http://neo4j.com/blog/neo4j-2-2-query-tuning/) –