2014-09-09 3 views
0

나는 간단한 쿼리과 같이 있습니다neo4j 왕복 경기

MATCH (u1:User {id: 1})-[:WANTS]->(:Card)<-[:HAS]-(u2:User) 
WITH u1, u2 
MATCH (u1)-[:HAS]->(:Card)<-[:WANTS]-(u2) 
RETURN COUNT(DISTINCT u2.id) 

이제 사용자 1은 자신이 관심, 그 (500) 사이에, 그 관심 (150)가 500 명의 사용자를 가지고있다. 쿼리가 너무 단순 해 보이기 때문에 조금 이상하지만 22 초 내에 인덱스를 생성하는 데 필요한 모든 필드가 인덱싱됩니다. 난 그냥 쿼리가 있는지 알고 싶어

MATCH (u1:User {id: 1})-[:WANTS]->(:Card)<-[:HAS]-(u2:User) 
RETURN COUNT(DISTINCT u2.id) 
// COUNT(DISTINCT u2.id) 
// 556 
// Returned 1 row in 220 ms 

MATCH (u1:User {id: 1})-[:HAS]->(:Card)<-[:WANTS]-(u2:User) 
RETURN COUNT(DISTINCT u2.id) 
// COUNT(DISTINCT u2.id) 
// 14351 
// Returned 1 row in 375 ms 

: I 별도로 쿼리 방향의 각을 할 때, 그들은 빠른 것으로 판명

COUNT(DISTINCT u2.id) 
151 
Returned 1 row in 22270 ms 

마음 : 여기

내 출력 나는 neo4j가 그것의 뒤에 묶인 한 손으로 이것을 할 수 있기 때문에 최적화 될 수있다.

미리 감사드립니다.

답변

0

나는 그것을 얻었습니다. 어떻게되는지보기 :

MATCH (u1:User {id : 1})-[:HAS]->(c1:Card) 
WITH u1, c1 
MATCH (c1)<-[:WANTS]-(u2:User) 
WHERE u1 <> u2 
WITH u1, u2, c1 
MATCH (u1)-[:WANTS]->(c2:Card) 
WITH u1, u2, c1, c2 
MATCH (c2)<-[:HAS]-(u2) 
RETURN count(DISTINCT u2.id) 

이 쿼리는 테스트에서 훨씬 빠르게 실행되었습니다.

+0

안녕하세요 짐, 입력 해 주셔서 감사합니다. 전체 쿼리는 151 노드를 반환하는 데 17 초가 걸립니다. 나는 각 경기가 얼마나 오래 걸리는지를보기 위해 질의를 해봤 읍니다. 마지막'MATCH'를 제외하고는 모두 300ms + 만 걸립니다. 마지막 경기에서 17 초가됩니다. 왜 그런가? – voldomazta

+0

짐, 나는 질문을 더 많은 정보로 업데이트했다. 나는 각각의 쿼리 방향에 대한 결과를 추가했으며 빠른 것으로 보였다. 비켜나는 뭔가가 있지만 손가락을 대지 못합니다. – voldomazta

+0

사용자 1이 사용자 1이 원하는 카드를 가지고있는 곳에서 사이버 탐 (cybersam)이 제안한 사례가있을 가능성이 있습니까? 그렇다면 자체 참조 루프가 있습니까? –

0

평가할 노드를 제한하려면 노드 레이블을 지정해야합니다. 이 쿼리는 성능을 개선합니까?

MATCH (u1:User)-[:WANTS]->(:Card)<-[:HAS]-(u2:User)-[:WANTS]->(:Card)<-[:HAS]-u1 
WHERE u1.id = 1 AND u1.id <> u2.id 
RETURN COUNT(DISTINCT u2.id) 
+0

죄송합니다.이 검색어는 82 초가 걸립니다. '82959 ms에 1 행 반환 ' – voldomazta