2014-01-31 3 views
0

방금 ​​http://www.neo4j.org/learn/online_course에서 교육을 마쳤으며 실험실 답변에 대한 몇 가지 질문을 받았습니다. 키아누 리브스와 함께 작동합니다 세 배우 추천 :Training의 Neo4j cypher 쿼리

첫 번째 레슨 2 (아무 대답이 주어지지되고는 그래프 위젯 거시기에 확인하지 않습니다)

문제가되고있는 고급 그래프 연구소에서입니다 (그러나하지 않았다). 힌트는 기본적으로 Keanu가 ACTED_IN하지 않은 ACTED_IN 관계가있는 세 명의 인물을 선택해야한다는 것입니다.

그래프에는 ACTED_IN 관계 및 DIRECTED 관계가있는 개인 노드와 영화 노드가 있습니다.

내가이 함께했다 :

MATCH (a:Person)-[:ACTED_IN]->(movie:Movie) 
WHERE NOT (:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(movie) 
RETURN a, count(movie) 
ORDER BY count(movie) DESC 
LIMIT 3 

하지만 실제로 같은 영화를 제외하거나 경우 내가 말할 수 없었다 단지 키아누 리브스 (때문에 키아누의 영화에 없었던 반환 된 배우,하지만 그들은 너무 많은 중복하지 난 그래도 그것을 좋아하지 않아가 있기 때문에 내가

MATCH (keanu:Person)-[:ACTED_IN]->(movie), 
     (playedwith:Person)-[:ACTED_IN]->(movie), 
     (playedwith)-[t:ACTED_IN]->(othermovie), 
     (other:Person)-[:ACTED_IN]->(othermovie) 
WHERE keanu.name = "Keanu Reeves" 
     AND NOT (other)-[:ACTED_IN]->(movie) 
     AND NOT (keanu)-[:ACTED_IN]->(othermovie) 
RETURN other.name 
     ,collect(DISTINCT othermovie) 
     ,collect(DISTINCT playedwith) 
     ,count(DISTINCT playedwith) 
ORDER BY count(DISTINCT playedwith)desc 
LIMIT 3 

무엇을했는지 여기

답변

3

지금까지 두 가지 해결책을 찾았습니다.

1 : 키아누 리브스가 행동하지 않은 가장 바쁜 배우를 추천합니다.

p.name   | rating 
-------------------------- 
Tom Hanks  | 12 
Meg Ryan  | 5 
Cuba Gooding Jr.| 4 

이 산출

MATCH (p:Person)-[:ACTED_IN]->(m) 
WHERE p.name <> 'Keanu Reeves' 
AND NOT (p)-[:ACTED_IN]->()<-[:ACTED_IN]-(:Person{name:'Keanu Reeves'}) 
RETURN p.name, count(m) AS rating 
ORDER BY count(m) DESC 
LIMIT 3; 

: 키아누 리브스 '공동 별

p.name   | rating 
-------------------------- 
Danny DeVito | 2 
J.T. Walsh  | 2 
Tom Hanks  | 2 
+0

그것들은 내가 그들을 읽었을 때 아주 의미가 있습니다. 내 솔루션과 비슷한 결과지만 훨씬 간단한 구문. – Snowburnt

+0

구문은 내가 생각한 것보다 훨씬 깔끔합니다 (NOT IN 문을 사용하는 파이프 라이닝 된 쿼리). Keanu와 가장 많이 활동하는 배우 (친구)와 함께 작업하지 않은 배우를 보여 주면서 처음 스타일을 수정하여 쿼리 스타일에 맞춰 훨씬 더 좋아졌습니다. – Snowburnt

1

오늘은 내가이 질문을 가로 질러왔다. 어쨌든 돌아와되었을 수 있습니다 우하지만 결과는 다음과 같습니다.

other.name | collect(DISTINCT othermovie) | collect(DISTINCT playedwith)  | count(DISTINCT playedwith) 
----------------------------------------------------------------------------------------------------------------------------- 
Tom Hanks  | ["Cloud Atlas",    | ["Hugo Weaving","Charlize Theron"] | 2 
       | "That Thing You Do"]  | 
Tom Cruise | ["A Few Good Men"]   | ["Jack Nicholson"]     | 1 
Robin Williams| ["The Birdcage"]    | ["Gene Hackman"]     | 1 
+0

를 산출 가장

MATCH (f:Person)-[:ACTED_IN]->(m)<-[:ACTED_IN]-(c:Person), (k:Person{name:'Keanu Reeves'}) WHERE c.name <> 'Keanu Reeves' AND (f)-[:ACTED_IN]->()<-[:ACTED_IN]-(k) AND NOT (c)-[:ACTED_IN]->()<-[:ACTED_IN]-(k) RETURN c.name, count(c) AS Rating ORDER BY Rating desc LIMIT 3; 

와 협력 한 배우 내가 당신을 생각 추천 othermovie에 기반한 카운트를 할 수도 있고, Tom Hanks, Danny Devito, J.T. 그 경우의 월시 – Snowburnt

+0

Tom Hanks는 실제로 2 명 이상으로 많은 일을했습니다. 내 새로운 대답을 보라. – Snowburnt

1

그래서 나는 두 가지 좋은 방법을 찾았습니다. 첫 번째 사람은 Keanu Reeves가 원래 사람이 아닌 "ACTED_IN 같은 영화"경로를 가진 사람들이 "ACTED_IN 같은 영화"관계를 가졌음을 발견합니다.

두 번째 사람은 Keanu Reeves와 함께 영화를 ACTED_IN하지 않았지만 대부분의 영화에서 일하는 사람이 주문한 사람을 찾습니다.

물론이 관계를 공유하는 모든 액터들 사이에 "WORKED_WITH"관계를 만든 다음 Keanu가 WORKED_WITH를 찾지 못했을 때 가장 쉬운 방법 일 것입니다.하지만 그것은 내가 생각하기에 재미있는 질문의 패배입니다. 아주 정확한 아주 간단하고 것

최초의 솔루션 :

MATCH (a:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(b:Person) 
WITH collect(b.name) AS FoF 
MATCH (c:Person)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(d:Person) 
WHERE not c.name IN FoF AND c.name <> "Keanu Reeves" 
RETURN distinct c.name, count(distinct d) 
ORDER BY count(distinct d) desc 
limit 3 

그것은 반환 :

d는 사람 C의 번호와 함께 "ACTED_IN"을 가지고있다
c.name   | count(distinct d) 
------------------------------- 
Tom Hanks  | 34 
Cuba Gooding Jr.| 24 
Tom Cruise  | 23 

.


편집은 추가 :

을의 난이 함께 와서 자신의 훨씬 더 효율적인 쿼리 접근 방식을 사용에 응답 한 후 : 위와 같은 일을 반환

MATCH (a:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(b:Person) 
WHERE a.name <>'Keanu Reeves' 
AND NOT (a)-[:ACTED_IN]->()<-[:ACTED_IN]-(b:Person {name:'Keanu Reeves'}) 
RETURN a.name, count(Distinct b) AS Rating 
ORDER BY Rating DESC 
LIMIT 3 

합니다.

MATCH (a:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(b:Person) 
WITH collect(b.name) AS FoF 
MATCH (c:Person)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(d:Person) 
WHERE not c.name IN FoF AND c.name <> "Keanu Reeves" 
RETURN distinct c.name, count(distinct m) 
ORDER BY count(distinct m) desc 
limit 3 

반환 :


는 또한 나는 대부분의 영화에서 일한 사람들이 사용

m 그들이 작업 한 영화의 수는
c.name   | count(distinct m) 
------------------------------------------- 
Tom Hanks  | 11 
Meg Ryan   | 5 
Cuba Gooding Jr. | 4 

in.