2014-01-23 5 views
2

Cypher 쿼리에 대한 약간의 지원을 찾고 있습니다. 자신의 서적 p을 소유 한 고객이 peer 인 경우, peer이 소유하고 있지만 누가 p을 소유하고 있지 않은 한 권의 책을 소유 한 고객 집합 target을 검색 할 수 있습니다. 이것은 다음 쿼리를 사용하여 수행됩니다 :상관 관계가있는 판매 관계 수 계산

match 
(p:Book {isbn:"123456"})<-[:owns]-(peer:Customer) 
    -[:owns]->(other:Book)<-[o:owns]-(target:Customer) 
WHERE NOT((target)-[:owns]->(p)) 
return target.name 
limit 10; 

내 다음 단계는 많은other 책은 target의 각 구성원은 자신의 설정 방법 을 결정하고 그에 따라 해당 구성원을 주문하는 것입니다. Neo4j 문서 및 SO 답변을 기반으로 여러 변형을 시도했지만 행운이 없습니다. 예를 들어 내가 with를 사용하여 시도 : 나는 또한 가장 합리적인 쿼리 무엇 내 초보자 눈에 보인다 시도

match 
    (p:Book {isbn:"123456"})<-[:owns]-(peer:Customer) 
    -[:owns]->(other:Book)<-[o:owns]-(target:Customer) 
WHERE NOT((target)-[:owns]->(p)) 
WITH target, count(o) as co 
WHERE co > 1 
return target.name 
limit 10; 

: 두 경우 모두

match 
    (p:Book {isbn:"123456"})<-[:owns]-(peer:Customer) 
    -[:owns]->(other:Book)<-[o:owns]-(target:Customer) 
WHERE NOT((target)-[:owns]->(p)) 
return target.name, count(o) 
limit 10; 

쿼리는 위쪽 (끝없이 실행 실행을 멈추기 10 분 전). 내가 뭘 잘못하고 있는지에 대한 통찰력?

편집 이 실행 않습니다 후자의 쿼리를 밝혀 있지만, 완료하는 데 15 분 소요되며 여기에서 알 수 있듯이, 잘못된 번호를보고됨에 : 나는 책을 각각의 수를 찾고 있어요

+-------------------------------+ 
| target.name  | count(o) | 
+-------------------------------+ 
| "John Smith"  | 12840 | 
| "Mary Moore"  | 11501 | 
+-------------------------------+ 

고객은 특히 1284011501 숫자가 실제로 어디에서 오는지 확실하지 않습니다. 이견있는 사람?

+0

당신이 인덱스를 가지고 있습니까? Btw 첫 번째 쿼리에 "pisbn"이 있습니다 - isbn이되어야합니까? –

+0

오타가 수정되었습니다. 쿼리를 잘못 입력 한 것 같습니다. 방금 요지를 만들었습니다 : http://console.neo4j.org/r/sk39pk. 무엇이 당황 스럽습니까 (저에게) 그 질문은 광고 된 것과 똑같이 작동한다는 것입니다 (아주 작은 데이터 세트로). 아마도 쿼리를 완료하기 위해 실행해야 할 필요가 있을까요? 지금 색인을 확인하려고합니다. – Jason

+0

내가 실제로 인덱스 세트합니까 : $ 스키마를 인덱스 ON : 도서 (ISBN) 온라인 은 MySQL을의'쇼 processlist'에 쿼리 상태를 볼 수 가깝다? 이것은 Neo4j의 오히려 신비한 측면 중 하나 인 것처럼 보입니다. 쿼리가 실행될 때 정확히 무슨 일이 일어나는지 모니터링하기가 어렵습니다. – Jason

답변

1

어떻게 이것에 대해 : 도서 (ISBN) :

MATCH (p:Book {isbn:"123456"})<-[:owns]-(peer:Customer) 
WITH distinct peer, p 
MATCH (peer)-[:owns]->(other:Book) 
WITH distinct other, p 
MATCH (other)<-[o:owns]-(target:Customer) 
WHERE NOT((target)-[:owns]->(p)) 
RETURN target.name, count(o) 
LIMIT 10;